




已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
此文檔收集于網絡,如有侵權,請聯(lián)系網站刪除 操作系統(tǒng)實驗(minix部分) 顯示當前進程信息 實驗目的一、 運用操作系統(tǒng)所學原理知識,加深進程機制在Minix操作系統(tǒng)中的實現(xiàn);二、 分析Minix系統(tǒng)進程PCB數(shù)據(jù)結構,包括進程調度、內存管理和文件系統(tǒng)三部分中各數(shù)據(jù)成員的具體含義;三、 了解Minix操作系統(tǒng)整體實現(xiàn)機制;四、 學習Minix操作系統(tǒng)中進程間通信機制,查看Minix這方面的源碼。實驗過程一、 實驗準備在此實驗的預習過程中我們需要了解操作系統(tǒng)中有關于進程方面的知識,并且要更深層的了解進程機制在minix中的實現(xiàn)。此外,還有進程的通信機制也需要注重了解。這樣我們作實驗才能更高效。首先,我們先從最基本的概念入手。進程是操作系統(tǒng)中最重要的一個基本點,深入并且透徹的理解好進程的含義,不僅是做好此次實驗的關鍵,更是我們學好操作系統(tǒng)整個課程的重中之重。“進程”這一術語有許多人在不同角度對其下過定義,其中最能進程實質的定義有:(1) 進程是程序的一次執(zhí)行;(2) 進程是可以和別的計算并發(fā)執(zhí)行的計算;(3) 進程可定義為一個數(shù)據(jù)結構及能在其上進行操作的一個程序;(4) 進程是一個程序及其數(shù)據(jù)在處理機上順序執(zhí)行時所發(fā)生的活動;(5) 進程是程序在一個數(shù)據(jù)集合上的運行過程,是系統(tǒng)進行資源分配和調度的一個獨立單位。據(jù)此,我們可以把“進程”定義為:“可并發(fā)執(zhí)行的程序在一個數(shù)據(jù)集合上的運行過程”。我們在理解好上述進程定義的基礎上,在對進程進行一下自己的思考,是進程的概念在自己的腦海里形成一個自己的概念,然后再去對進程的其他特征進行了解和分析。例如進程的動態(tài)性、并發(fā)性、獨立性、異步性和結構特性。我們還需要知道進程的三個最基本的狀態(tài),就緒狀態(tài)、執(zhí)行狀態(tài)和阻塞狀態(tài),以及三者之間的相互關系:結束新進程執(zhí)行就緒阻塞接納 完成 中斷 進程調度 I/O完成或事件發(fā)生 I/O請求或等待某事件 此外,我們還需要知道引起進程創(chuàng)建的事件有用戶登錄、作業(yè)調度、提供服務和應用請求。進程的創(chuàng)建又大概分為:1、申請空白PCB;2、為新進程分配資源;3、初始化進程控制塊;4、將新進程插入就緒隊列。PCB就是進程控制塊,它是進程存在的唯一標志,當系統(tǒng)創(chuàng)建一個新進程時,就為它建立一個PCB;進程結束時又收回其PCB,進程于是也隨之消亡。 了解完進程的概念,我們開始去認識進程間的通信。進程是經常要與其他進程通信。例如,在一個shell管道中,第一個進程的輸出必須傳送到第二個進程,這樣沿著管道傳遞下去。因此需要在通信的進程間,最好使用一種結構較好的方式,而不用中斷。這就是我們所說的進程通信。我們在做此實驗時應該著重去學習消息傳遞這個概念。這種通信方法使用兩條原語SEND和RECEIVE。他們像信號量一樣是系統(tǒng)調用,因此很容易地被加入庫例程。例如:send(destination,&message); receive(source,&message);前一個調用向一個給定的目標發(fā)送一條消息,后一個調用從給定的源接受一條消息。但消息傳遞系統(tǒng)有它自己的缺點,就是在設計上有很多的難點,消息傳遞有很多變體,因此對于我們初學者,我們來看如何對消息編址這種方法:為每個進程分配一個唯一的地址,按進程為消息指定地址。 對進程的總體有了了解后,我們該入主題了,看看進程機制是如何在MINIX中實現(xiàn)的。Minix本身就是一組進程的集合。它們相互之間,以及與用戶進程之間使用進程間通信機制(消息傳遞)來進行通信,這種設計使得minix的結構更加模塊化和靈活。 我們首先大體瀏覽一下Minix整個系統(tǒng),Minix被組織成4層,每一層執(zhí)行很完好的功能。這4層為:1、進程管理,這是最低層,它捕獲所有的中斷和陷入,完成進程調度,并向高層提供一個采用消息進行通信的獨立順序進程模型,其中斷處理最低層部分用匯編語言編寫,其余部分和其他層次用C語言編寫;2、I/O進程,每類設備都有一個I/O進程,為了將其與其他普通用戶進程相區(qū)別我們稱之為任務,第2層的所有任務和第一層的代碼鏈接成一個單一的二進制程序,稱作內核(kernel),盡管任務和內核被編譯在一起,但在執(zhí)行時內核被賦予比任務更高的特權級,所以真正的內核代碼可以訪問任一部分內存,及任一處理器寄存器;3、服務器進程,這些服務器進程在低于任務和內核的特權級上運行,不能直接訪問I/O端口,也不能訪問屬于自己段以外的內存,主要有內存管理(Memory Manager,MM)負責執(zhí)行所有牽涉到內存管理的系統(tǒng)調用,文件系統(tǒng)(File System,FS)負責執(zhí)行文件系統(tǒng)的調用,盡管從它們的禁用的機器指令來看,它們與用戶進程運行在相同的特權級上,但它們的執(zhí)行優(yōu)先級比用戶進程高;4、用戶進程,包含所有的用戶進程shell、編譯器、編輯器以及用戶的a.out程序。 下面我們來了解minix的進程管理。計算機開機時,硬件從引導盤上將第一道第一扇區(qū)讀入內存并從那里開始執(zhí)行。Minix的引導程序裝入一個更大的程序boot,由boot裝入操作系統(tǒng)。一旦裝入操作系統(tǒng)完成,內核開始運行,在其初始化階段,內核先啟動各任務,然后是內存管理器、文件系統(tǒng)及所有在第三層運行的服務器。當所有這些都開始運行并完成初始化之后,它們將阻塞,等待執(zhí)行某種操作。當所有的任務和服務器被阻塞之后,將執(zhí)行第一個用戶進程,init。MINIX中兩條最重要的系統(tǒng)調用是FORK和EXEC,F(xiàn)ORK是創(chuàng)建一個新進程的唯一途徑,EXEC允許一個進程執(zhí)行一個指定的程序,當一個程序被執(zhí)行時,將按照文件頭中指定的大小為其分配一部分內存。 Minix中的進程間通信。Minix提供了三條原語來發(fā)送和接受消息,它們均通過C庫例程調用,send(dest,&message)用來向進程dest發(fā)送一條消息;receive(source,&message)用來從進程source(或任何地方)接受一條消息;send_rec(src_dst,&message)用來發(fā)送一條消息,并等待同一個進程的應答。了解完原理,我們再來看看minix源代碼的組織。源代碼從邏輯上分為兩個目錄。在一個標準的minix系統(tǒng)中,其完整路徑分別為/usr/include和/usr/src。Include/目錄包含了許多符合POSIX標準的頭文件,它又包含3個子目錄:1、sys/ 包含POSIX頭文件;2、minix/ 包含操作系統(tǒng)使用的頭文件;3、ibm/ 包含IBMPC特有定義的頭文件。Src/目錄包含3個重要的子目錄,其中包含了操作系統(tǒng)的源代碼:1、kernel/ 第1層和第2層(進程、消息和驅動程序);2、mm/ 內存管理器代碼;3、fs/ 文件系統(tǒng)代碼。操作系統(tǒng)當然要支持在其上運行的命令,所以有一個很大的命令目錄src/commands/,其中包含工具程序(如cat、cp、data、ls、pwd)的源代碼。由于minix是一個用于教學的操作系統(tǒng),這就意味著對它常常要做修改,所以有一個src/test/目錄包含有一些被設計用來對新編譯好的minix系統(tǒng)進行完整測試的工具。最后/src/inet/目錄包含了重新編譯minix以使之支持網絡的源代碼。二、設計思想 有了上面的理論指導,具體再實現(xiàn)某個實驗應該是比較容易了。對于本次實驗,我們應該具體分析進程在minix中實現(xiàn)機制。minix系統(tǒng)本身分為四個進程:kernel、mm、fs、init。而我們所要打印的PCB信息分別在kernel、mm、fs中,要想直接的到這些信息并不是一件容易的事情。因為所有的進程所占用的內存空間都是受一定保護的,更何況這里牽涉到的是操作系統(tǒng)本身的進程,用戶進程不可能直接對他們進行訪問,因此要得到所需要的信息有一定的困難。 Minix系統(tǒng)所有進程依靠消息進行通信和協(xié)作,包括kernel、mm和fs。所以,我們只能從這里開始。然而,系統(tǒng)本身并沒有給我們提供用來的到進程控制塊所有信息的方法,因此,修改內核、內存管理以及文件系統(tǒng)相應的代碼是必需的。據(jù)此,我們做出了如下的總體設計。 為了得到系統(tǒng)中的進程控制塊信息,我們必須取得對kernel、mm、fs三個進程的內存區(qū)域的訪問權,而最簡單的辦法就是修改系統(tǒng)的內核、內存管理、文件系統(tǒng)本身的源代碼,將我們所需要的功能在操作系統(tǒng)內部實現(xiàn),這樣一來,就不存在了訪問權的問題。 我們這里要用到一個叫做“調用轉儲”的概念(操作系統(tǒng):設計與實現(xiàn)第二版上冊第213頁)。在鍵盤驅動程序中kb_read的開始調用func_key來檢測用來控制和調試的掃描碼。在檢測到F1和F2鍵時調用的轉儲例程位于dmp.c中。首先,p_dmp(第14613行)為所有的進程顯示基本的處理信息,包括在按下F1鍵時顯示的內存使用信息。第二,map_dmp(第14660行)在按下F2時提供更詳細的內存使用信息。我們利用這個特性,增加了幾個功能鍵的定義:鍵功能F1顯示進程表F2顯示進程內存空間的詳細使用情況F3在硬件滾屏和軟件滾屏之間切換F5顯示以太網統(tǒng)計流量(如果網絡支持編譯)CF7(CtrlF7)發(fā)送SIGQUIT信號,同CTRL-效果CF8(CtrlF8)發(fā)送SIGINT信號,同DEL效果CF9(CtrlF9)發(fā)送SIGKILL信號,同CTRL-U效果F10顯示kernel中的PCB信息(除F1種已經有的)(我們的成果)F11顯示mm中的PCB信息(我們的成果)F12顯示fs中的PCB信息(我們的成果) 對于調用系統(tǒng)信息,我們采用功能鍵中斷方式直接由kernel接受中斷,在usr/kernel/keyborad中添加F10、F11、F12分別調用kernel、mm、fs中的子程序輸出該部分的進程信息。對于mm和fs我們還要在kernel里添加語句發(fā)送消息到mm和fs使之執(zhí)行相應的處理程序。 程序功能流程圖如下: Send(0, &message)Send(1, &message)kernelvirtual consoledo_printpcb打印kernel中的PCBdo_tomm將打印消息傳給mmdo_tofs將打印消息傳給fsfunc_keycase :F10case :F11case :F12mm:main函數(shù)得到消息,并辨別出消息內容,調用pr_mprocpr_mproc打印mm中的PCBfs:main函數(shù)得到消息,并辨別出消息內容,調用pr_mprocpr_fproc打印fs中的PCB設計中的思路應該是基于學習過程中的重點,但在實踐中的靈活運用更為重要,如何能更方便更有效的完成要求,便是看自己對掌握的知識的深淺。Minix本身就是一種教學軟件,所以我們應該從另一個角度去做這個實驗,那就是那種方法更能幫助我們更好的理解理論知識,那種方法更能運用更多方面的知識。這樣,便會使我們能從多角度的理解問題,能更好的達到做實驗的目的。 三、編碼階段:首先,了解Minix的進程結構,Minix進程存放在內核、內存管理和文件系統(tǒng)三部分中,當在系統(tǒng)下鍵入F1F12時,Minix系統(tǒng)都會有相應。利用此原理,采用中斷方式顯示進程信息。所以,在src/kernel/keyboard.c中的func_key過程中添加F10、F11、F12的相應程序。程序改為如下:(注:其中黑體部分為Minix源程序,紅色粗體為我們添加的程序)PRIVATE int func_key(scode)int scode;/* scan code for a function key */* This procedure traps function keys for debugging and control purposes. */ unsigned code; code = map_key0(scode);/* first ignore modifiers */ if (code F12) return(FALSE);/* not our job */ switch (map_key(scode) /* include modifiers */ case F1:p_dmp(); break;/* print process table */ case F2:map_dmp(); break;/* print memory map */ case F3:toggle_scroll(); break;/* hardware vs. software scrolling */#if ENABLE_NETWORKING case F5:dp_dump(); break;/* network statistics */#endif case F10:do_printpcb();break;/*print pcb 2002.4.20。在 func_key過程中添加控制打印kernel的pcb中內容的F10的中斷代碼*/ case F11:do_tomm(); break;/*send to mm 2002.4.20。在func_key過程中添加控制打印mm的pcb中內容的F11的中斷代碼*/case F12:do_tofs(); break;/*send to fs 2002.4.20。在 func_key過程中添加控制打印fs 的pcb中內容的F12的中斷代碼*/ case CF7:sigchar(&tty_tableCONSOLE, SIGQUIT); break; case CF8:sigchar(&tty_tableCONSOLE, SIGINT); break; case CF9:sigchar(&tty_tableCONSOLE, SIGKILL); break; default:return(FALSE); return(TRUE); 有如上程序知道,按入F10鍵時,直接調用do_printpcb函數(shù),而do_printpcb函數(shù)將進程在kernel中的內容打印在屏幕上,其程序如下:#include kernel.h #include #include proc.h /*在do_printpcb函數(shù)中用到的庫函數(shù)*/PRIVATE void do_printpcb() /*F10調用的打印kernel中pcb的函數(shù)*/ register struct proc *rp; /*定義一個指針來指向中斷時的某一進程*/ static struct proc *oldrp=BEG_PROC_ADDR; /*定義另一指針來指向進程的 地址,初始值為第一個進程的地址*/ int n=0; /*設置一個計數(shù)器,來存放在屏幕上顯示的行數(shù)*/ printf(nshow kernel info); /*開始打印pcb內容*/ printf(np_reg-sel-block-held-chu-chs-alam-carq-from-send-next-ping-pend-namen); /*打印要顯示的pcb中內容的具體名字*/ for(rp=oldrp;rpp_flags&P_SLOT_FREE) continue; /*在程序外設有標志位p_flag標明程序可以執(zhí)行,P_SLOT_FREE是標識還有空間給進程分配*/if (+n20) break; /*當打印完20行后使程序跳出*/ printf(n%6u%6x%5d%7d%7u%7u%5u%5x%5d%5d%3x%6x%2u%5c,rp-p_reg,rp-p_ldt_sel,rp-p_int_blocked,rp-p_int_held,rp-child_utime,rp-child_stime,rp-p_alarm,rp-p_callerq,rp-p_getfrom,rp-p_sendto,rp-p_nextready,rp-p_pending,rp-p_pendcount,rp-p_name16); /*將pcb中的各項具體數(shù)據(jù)按 列打印出來*/ if(rp=END_PROC_ADDR) rp=BEG_PROC_ADDR; else printf(n-more-r); oldrp=rp; /*檢驗進程是否結束,如果結束指針再指向新的進程,反之打印 more繼續(xù)打印本進程的內容*/當鍵入F11鍵時,調用do_tomm()過程,將打印的消息傳送到內存管理中去,其消息的內容是讓mm執(zhí)行第70條語句pr_mproc(在跳轉表src/mm/table.c中用戶定義):PRIVATE void do_tomm()message mes;mes.m_type=70;send(0,&mes); /*定義do_tomm()過程,將打印的消息傳到內存管理中去,讓其執(zhí)行第70條語句pr_mproc(在跳轉表src/mm/table.c中用戶定義),這就是消息傳遞的方法,給每個進程分配唯一地址*/當鍵入F12鍵時,調用do_tofs()過程,將打印的消息傳送到內存管理中去,其消息的內容是讓mm執(zhí)行第70條語句pr_fproc(在跳轉表src/fs/table.c中用戶定義):PRIVATE void do_tofs()message mes;mes.m_type=70;send(1,&mes);/*這個過程同mm,只是將消息傳到fs中*/由以上的程序,完成了kernel部分的任務。然后,開始修改內存管理和文件系統(tǒng)相應代碼,以完成進程控制塊的輸出任務,在mm塊中,首先要更改src/mm/table.c的內容: no_sys,/* 68 = TASK_REPLY */no_sys,/* 69 = unused*/pr_mproc,/* 70 = Print Mproc Info user defined 2002.4.20。 在跳轉表中定義用戶進程,并分配地址。*/do_sigaction,/* 71 = sigaction */do_sigsuspend,/* 72 = sigsuspend */修改完改table表后,由kernel那傳來的第70信號,執(zhí)行pr_mproc,同時,pr_proc是由src/mm/proto.h定義的:/* forkexit.c */_PROTOTYPE( int do_fork, (void);_PROTOTYPE( void pr_mproc, () );/* User Difine 2002.4.20*/_PROTOTYPE( int do_mm_exit, (void);_PROTOTYPE( int do_waitpid, (void);_PROTOTYPE( void mm_exit, (struct mproc *rmp, int exit_status);在此完成的了pr_mproc()定義和調用,而pr_mproc的主程序在src/mm/forkexit.c中,完成了對mproc結構的內容的讀取和寫入屏幕:/*略去頭文件和所用到的庫函數(shù),這些在源代碼中都有明確寫出*/int mm_count=0; /*定義一個計數(shù)器,因為pcb中的內容太多,一行不能全打 出所以這是一個所用屏幕數(shù)的計數(shù)器*/PUBLIC void pr_mproc() /*開始打印mm中的pcb內容*/ register struct mproc *rp;/*定義一個指針來指向中斷時的某一個進程*/ static struct mproc *oldrp=&mproc0;/*定義另一個指針指向進程的地址,初始值為第一個進程的地址*/ int n=0; /*設置一個計數(shù)器,來存放在屏幕上顯示的行數(shù)*/ printf(nSHOW stc/mm/mproc.hn); switch(mm_count)/*將pcb中的內容最多分為4個屏幕打出*/ case 0:printf(n-mp_exitstatus-mp_sigstatus-mp_pid-mp_procgrp-mp_wpid-mp_parentn);/*第一個屏幕打出的pcb內容*/for (rp=oldrp;rp20)break;/*打完一個屏幕程序跳出*/ printf(n%15d%14d%8d%12d%9d%11d,rp-mp_exitstatus,rp-mp_sigstatus,rp-mp_pid,rp-mp_procgrp,rp-mp_wpid,rp-mp_parent); break;/*按列打印出對應的具體數(shù)據(jù)內容*/ case 1: printf(n-mp_realuid-mp_effuid-mp_realgid-mp_effgid-mp_ino-mp_dev-mp_ctimen); for (rp=oldrp;rp20)break; printf(n%12d%11d%10d%11d%8d%8d%15d,rp-mp_realuid,rp-mp_effuid,rp-mp_realgid,rp-mp_effgid,rp-mp_ino,rp-mp_dev,rp-mp_ctime); break;/*打印第二個屏幕的內容,具體程序同第一個*/ case 2: printf(n-mp_ignore-mp_catch-mp_sigmask-mp_sigmask2-mp_sigpending-mp_sigreturnn); for (rp=oldrp;rp20)break; printf(n%11d%10d%12d%13d%15d%14d,rp-mp_ignore,rp-mp_catch,rp-mp_sigmask,rp-mp_sigmask2,rp-mp_sigpending,rp-mp_sigreturn); break;/*打印第三個屏幕的內容*/ case 3: printf(n-mp_func-mp_flags-mp_procargsn); for (rp=oldrp;rp20)break; printf(n%9d%10d%13d,rp-mp_func,rp-mp_flags,rp-mp_procargs); break;/*打印的第四個屏幕的內容*/ mm_count=mm_count+1; if (mm_count=4) mm_count=0;/*打印完所有內容,初始化mm_count*/dont_reply=TRUE;同樣,在文件系統(tǒng)中,要完成進程控制塊的輸出任務,也要更改相應的src/fs/table.c : no_sys,/* 68 = TASK_REPLY*/no_sys,/* 69 = unused */pr_fproc, /* 70 = Print Fproc Info user defined 2002.4.20。 在fs跳轉表中為進程分配地址。*/no_sys,/* 71 = SIGACTION */no_sys,/* 72 = SIGSUSPEND */同樣,pr_fproc在src/fs/proto.c中有如下的定義: _PROTOTYPE(void pr_fproc, () );/*2002.4.20。聲明過程pr_fproc*/對于pr_fproc的主程序在src/fs/main.c中,完成了對mproc結構的內容的讀取和寫入屏幕:/*略去頭文件和所用到的庫函數(shù),這些在源代碼中都有明確寫出*/int fs_count=0; /*定義一個計數(shù)器,因為pcb中的內容太多,一行不能全打 出所以這是一個所用屏幕數(shù)的計數(shù)器*/PUBLIC void pr_fproc()/*開始打印fs中的pcb內容*/ register struct fproc *rp;/*定義一個指針來指向中斷時的某一個進程*/ static struct fproc *oldrp=&fproc0; /*定義另一個指針指向進程的地址,初始值為第一個進程的地址*/ int n=0; /*設置一個計數(shù)器,來存放在屏幕上顯示的行數(shù)*/ printf(show src/fs/fproc.hn); switch(fs_count) /*將pcb中的內容最多分為3個屏幕打出*/ case 0: printf(n-fp_umask-*fp_workdir-*fp_rootdir-); printf(*fp_filpOPEN_MAX-fp_realuid-fp_effuidn); /*第一個屏幕打出的pcb內容*/ for(rp=oldrp;rp20)break; /*打完一個屏幕程序跳出*/ printf(%10d%11d%13x%20x%12d%11dn,rp-fp_umask,(rp-fp_workdir),(rp-fp_rootdir),(rp-fp_filpOPEN_MAX),rp-fp_realuid,rp-fp_effuid); break; /*按列打印出對應的具體數(shù)據(jù)內容*/ case1: printf(n-fp_realgid-fp_effgid-fp_tty-fp_fd-*fp_buffer-fp_nbytes-fp_cum_io_partialn);for(rp=oldrp;rp20) break; printf(%12d%11d%8d%7d%12c%11d%19dn,rp-fp_realgid,rp-fp_effgid,rp-fp_tty,rp-fp_fd,rp-fp_buffer,rp-fp_nbytes,fp-fp_cum_io_partial); break;/*打印第二個屏幕的內容*/ case2: printf(n-fp_suspended-fp_revived-fp_task-fp_sesldr-fp_pid-fp_cloexecn); for(rp=oldrp;rp20) break; printf(%14c%12c%9c%11c%8d%12ld,rp-fp_suspended,rp-fp_revived,rp-fp_task,rp-fp_sesldr,rp-fp_pid,rp-fp_cloexec); break;/*打印第三個屏幕的內容*/ fs_count=fs_count+1; if(fs_count=3) fs_count=0;/*打印完所有內容,初始化fs_count*/ dont_reply=TRUE;四、編譯階段:在完成了以上的文件的修改和編寫輸入后,存盤退出,轉到/src/tools目錄下,對Minix系統(tǒng)進行重新編譯,輸入: make在編譯通過后,在當前目錄下生成image文件,是Minix的映象文件,接著輸入: mount /dev/hd1a hd1a my image /hd1a/minix.test sync完成后,就可以停機重起!在monitor狀態(tài)下,鍵入hd0 image = minix.testhd0 save重新進入Minix ;這時Minix將相應我們定義的功能鍵!五、運行結果:F10 ( Kernel ) :F10顯示在kernel中的進程信息,各項消息如下:p_reg-sel-block-held-chu-chs-alam-carq-from-send-next-ping-pend-name第一次鍵入F10將顯示20個進程信息(如果有這么多的話),其它未能顯示的(將會有more給出提示)進程將在再鍵入F10時顯示,每次顯示20個,直到全部顯示完畢。F11 ( MM ) :F11顯示在MM中的進程信息,由于信息內容較多,這需要多次輸入F11顯示更多的信息,同樣,如果未能顯示全部進程信息,將有提示再鍵入F11顯示更多進程的信息:-mp_exitstatus-mp_sigstatus-mp_pid-mp_procgrp-mp_wpi
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 既有線施工安全管理措施
- 業(yè)務拓展策略執(zhí)行情況分析表
- 農民合作社財務規(guī)范化管理手冊
- 護師主管護師復習測試卷
- 法務知識入門學習指南
- 三農村合作社公共交通規(guī)劃指南
- 季度人力資源招聘與優(yōu)化規(guī)劃書
- 股份制公司辦公環(huán)境優(yōu)化計劃
- 互聯(lián)網租賃車平臺合作協(xié)議
- 電視編導制作實戰(zhàn)指南
- 2025年山東省中小學生海洋知識競賽參考試指導題庫500題(含答案)
- 2025年高考語文備考之DeepSeek與《哪吒2》相關語言文字運用題訓練
- 2024年廣東省公務員《申論(行政執(zhí)法)》試題真題及答案
- (市質檢三檢)泉州市2025屆高中畢業(yè)班質量監(jiān)測 (三)歷史試卷
- 2025年安徽衛(wèi)生健康職業(yè)學院單招職業(yè)適應性考試題庫含答案
- 電子煙管理辦法培訓課件
- 標準日本語初級教材上冊
- 2025云南昆明空港投資開發(fā)集團招聘7人易考易錯模擬試題(共500題)試卷后附參考答案
- 2025山東能源集團中級人才庫選拔高頻重點模擬試卷提升(共500題附帶答案詳解)
- 政務信息化可行性研究報告
- 2025年江蘇無錫市惠山國有投資控股集團有限公司招聘筆試參考題庫附帶答案詳解
評論
0/150
提交評論