版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
《計算機(jī)系統(tǒng)》異常
&進(jìn)程
篇《計算機(jī)系統(tǒng)》課程教學(xué)組2025年春季學(xué)期進(jìn)程processexception異??刂屏鞅局v內(nèi)容進(jìn)程processexception異??刂屏鞅局v內(nèi)容控制流處理器的工作:從加電開始工作,到斷電停止工作,CPU就是讀并執(zhí)行(解釋)指令序列,一次一條指令這個序列就是處理器控制流(CPU’scontrolfloworflowofcontrol)<startup>inst1inst2inst3…instn<shutdown>Time改變控制流到目前為止,有兩種機(jī)制可改變控制流分支與跳轉(zhuǎn)Branchesandjumps調(diào)用與返回Callandreturn上述兩者均是相應(yīng)程序狀態(tài)的變化對于一個實(shí)際應(yīng)用的系統(tǒng),需要對系統(tǒng)狀態(tài)的變化進(jìn)行響應(yīng)來自硬盤或網(wǎng)絡(luò)的數(shù)據(jù)已到達(dá)試圖除以零的指令用戶在鍵盤上使用Ctrl-C組合鍵盤系統(tǒng)計時器終止系統(tǒng)需要一種機(jī)制來處理上述“異??刂屏鳎╡xceptionalcontrolflow)”——控制流的突變異??刂屏鞔嬖谟谟嬎銠C(jī)系統(tǒng)的各個層次相對底層的機(jī)制異常Exceptions響應(yīng)系統(tǒng)事件,例如改變系統(tǒng)狀態(tài),導(dǎo)致的控制流變化由硬件和操作系統(tǒng)軟件相結(jié)合執(zhí)行較高層機(jī)制進(jìn)程的上下文切換Processcontextswitch信號Signals非本地跳轉(zhuǎn)Nonlocaljumps:setjmp()/longjmp()或者由操作系統(tǒng)軟件執(zhí)行,如上下文切換和信號或者由C語言動態(tài)庫執(zhí)行,如非本地跳轉(zhuǎn)異常一個異常是控制流的突變響應(yīng)某些事件(如處理器狀態(tài)變化),觸發(fā)到操作系統(tǒng)的控制轉(zhuǎn)移例如:
除以零,計算溢出,缺頁,I/O請求完成,使用了Ctrl-C組合鍵用戶進(jìn)程操作系統(tǒng)異常
k異常處理
返回到I_current返回到I_next
終止執(zhí)行事件
I_currentI_next異常表每一種類型的事件都對應(yīng)一個獨(dú)一無二的異常號k根據(jù)k值,索引進(jìn)入異常表?xiàng)l目k包含的異常處理程序調(diào)用地址012...n-1異常表異常處理程序0的代碼異常處理程序1的代碼異常處理程序2的代碼異常處理程序n-1的代碼...異常號異常表IA32(部分摘錄)異常號描述異常類型0除以零故障Fault13一般保護(hù)故障
故障Fault14頁故障故障Fault18機(jī)器檢查終止Abort32-127操作系統(tǒng)定義的異常中斷或陷阱Interruptortrap128(0x80)系統(tǒng)調(diào)用陷阱Trap129-255操作系統(tǒng)定義的異常中斷或陷阱Interruptortrap可在如下頁面看到更多異常表細(xì)節(jié):/design/processor/manuals/253665.pdf異步異常(中斷)來自處理器外部的事件引發(fā)向處理器芯片上的中斷引腳發(fā)信號,異常號傳送到系統(tǒng)總線,觸發(fā)中斷中斷處理程序返回到下一條指令例如:I/O中斷用戶在鍵盤上使用Ctrl-C組合鍵來自網(wǎng)絡(luò)的一個數(shù)據(jù)包到達(dá)來自硬盤的數(shù)據(jù)到達(dá)硬復(fù)位中斷觸發(fā)reset按鈕軟復(fù)位中斷使用Ctrl-Alt-Delete組合鍵處理中斷中斷處理程序?qū)⒖刂品祷氐綉?yīng)用程序控制流中的下一條指令用戶進(jìn)程操作系統(tǒng)(1)執(zhí)行當(dāng)前指令時中斷硬件的電壓變高(2)當(dāng)前指令結(jié)束后,控制傳送到中斷處理程序(3)運(yùn)行中斷處理程序(4)處理程序返回控制到下一條指令同步異常由執(zhí)行當(dāng)前指令的結(jié)果——引發(fā)的事件產(chǎn)生的異常:陷阱
Traps一種有意產(chǎn)生的異常例如:系統(tǒng)調(diào)用,斷點(diǎn)陷阱,其他特殊指令將控制返回到“下一條”指令故障Faults非有意產(chǎn)生、可能可恢復(fù)的異常例如:頁故障(可恢復(fù)),保護(hù)故障(不可恢復(fù)),浮點(diǎn)異??刂品祷兀夯蛘咴俅螆?zhí)行“當(dāng)前”指令或者終止中止
Aborts非有意產(chǎn)生,且不可恢復(fù)例如:奇偶校驗(yàn)錯誤,機(jī)器校驗(yàn)終止當(dāng)前程序陷阱示例:打開文件用戶調(diào)用:open(filename,options)open函數(shù)執(zhí)行系統(tǒng)調(diào)用指令int操作系統(tǒng)必須找到或創(chuàng)建文件,以用于讀或?qū)懛祷卣麛?shù)文件描述符0804d070<__libc_open>:...804d082: cd80 int$0x80804d084: 5b pop%ebx...用戶進(jìn)程操作系統(tǒng)exceptionopenfilereturnsintpop故障示例1:頁故障用戶向存儲空間寫入數(shù)據(jù)用戶試圖寫入的存儲空間當(dāng)前在硬盤上頁處理程序必須將頁加載到物理主存返回到發(fā)生頁故障的指令在進(jìn)行二次寫嘗試是成功命中inta[1000];int
main(){a[500]=13;}80483b7: c705109d04080d movl$0xd,0x8049d10用戶進(jìn)程
操作系統(tǒng)exception:pagefaultCreatepageandloadintomemoryreturnsmovl故障示例1:頁故障“頁故障”是軟件發(fā)現(xiàn)的還是硬件發(fā)現(xiàn)的?
邏輯地址向物理地址的轉(zhuǎn)換由硬件(MMU)實(shí)現(xiàn),故“頁故障”事件由硬件發(fā)現(xiàn)。
所有異常和中斷事件都由硬件檢測發(fā)現(xiàn)!“頁故障”事件何時發(fā)現(xiàn)?如何發(fā)現(xiàn)?執(zhí)行每條指令都要訪存(取指令、取操作數(shù)、存結(jié)果)在保護(hù)模式下,每次訪存都要進(jìn)行邏輯地址向物理地址轉(zhuǎn)換在地址轉(zhuǎn)換過程中會發(fā)現(xiàn)是否發(fā)生了“頁故障”!故障示例1:頁故障以下幾種情況均會引發(fā)“頁故障”缺頁:頁表項(xiàng)有效位為0地址越界:地址大于最大界限訪問越級或越權(quán)(保護(hù)違例):越級:用戶進(jìn)程訪問內(nèi)核數(shù)據(jù)(CPL=3/DPL=0)越權(quán):讀寫權(quán)限不相符(如對只讀段進(jìn)行了寫操作)可通過讀磁盤恢復(fù)故障不可恢復(fù),稱為“段故障(segmentationfault)”
故障示例2:無效內(nèi)存引用頁處理程序探查到無效地址發(fā)送SIGSEGV信號給用戶進(jìn)程用戶進(jìn)程由于段故障(segmentationfault)而終止inta[1000];intmain(){a[5000]=13;}80483b7: c70560e304080d movl$0xd,0x804e360用戶進(jìn)程操作系統(tǒng)exception:pagefaultdetectinvalidaddressmovlsignalprocess終止示例終止處理程序?qū)⒖刂妻D(zhuǎn)移到內(nèi)核終止例程,以結(jié)束當(dāng)前應(yīng)用程序用戶進(jìn)程操作系統(tǒng)傳送該控制給處理程序終止處理程序運(yùn)行發(fā)生致命硬件錯誤abort進(jìn)程processexception異??刂屏鞅局v內(nèi)容進(jìn)程定義:一個進(jìn)程(process)是一個執(zhí)行中的程序的實(shí)例計算機(jī)科學(xué)領(lǐng)域最深刻最成功的的概念之一與“程序”或“處理器”是不同概念進(jìn)程為每個程序提供了兩個關(guān)鍵抽象:邏輯控制流Logicalcontrolflow每個程序看起來是獨(dú)占使用處理器的私有地址空間Privatevirtualaddressspace每個程序看起來是獨(dú)占存儲系統(tǒng)如何保持上述錯覺?(多任務(wù)系統(tǒng))進(jìn)程交錯運(yùn)行在單核上虛存系統(tǒng)管理地址空間并發(fā)進(jìn)程兩個進(jìn)程同時/并發(fā)(concurrently)運(yùn)行,二者控制流的執(zhí)行是交錯的進(jìn)程之間存在有序性示例(在單核上執(zhí)行):并發(fā)執(zhí)行:A&B,A&C有序地相繼執(zhí)行:B&C進(jìn)程A進(jìn)程B進(jìn)程C時間用戶角度看并發(fā)進(jìn)程
并發(fā)進(jìn)程的控制流在時間上是不相交的但可將并發(fā)進(jìn)程視為彼此之間并行執(zhí)行TimeProcessAProcessBProcessC上下文切換進(jìn)程由內(nèi)核kernel管理注意:內(nèi)核不是一個單獨(dú)的進(jìn)程,而是作為多個用戶進(jìn)程運(yùn)行的一部分通過上下文切換(contextswitch)控制流從一個進(jìn)程切換到另一個進(jìn)程進(jìn)程A進(jìn)程Busercodekernelcodeusercodekernelcodeusercodecontextswitchcontextswitch時間請問如下代碼運(yùn)行,屏幕輸出是什么?作答正常使用主觀題需2.0以上版本雨課堂voidfork1(){intx=1;pid_tpid=fork();if(pid==0){ printf("Childhasx=%d\n",++x); }else{ printf("Parenthasx=%d\n",--x);}exit(0)}可為此題添加文本、圖片、公式等解析,且需將內(nèi)容全部放在本區(qū)域內(nèi)。正常使用需3.0以上版本答案解析主觀題50分創(chuàng)建新進(jìn)程pid_tfork(void);創(chuàng)建一個新進(jìn)程(子進(jìn)程),與調(diào)用進(jìn)程(父進(jìn)程)完全一致返回0到子進(jìn)程返回子進(jìn)程號pid到父進(jìn)程pid_tpid=fork();if(pid==0){printf("hellofromchild\n");}else{printf("hellofromparent\n");}fork
函數(shù)被調(diào)用一次但返回兩次理解forkpid_tpid=fork();if(pid==0){printf("hellofromchild\n");}else{printf("hellofromparent\n");}進(jìn)程npid_tpid=fork();if(pid==0){printf("hellofromchild\n");}else{printf("hellofromparent\n");}子進(jìn)程mpid_tpid=fork();if(pid==0){printf("hellofromchild\n");}else{printf("hellofromparent\n");}pid=mpid_tpid=fork();if(pid==0){printf("hellofromchild\n");}else{printf("hellofromparent\n");}pid=0pid_tpid=fork();if(pid==0){printf("hellofromchild\n");}else{printf("hellofromparent\n");}pid_tpid=fork();if(pid==0){printf("hellofromchild\n");}else{printf("hellofromparent\n");}hellofromparenthellofromchild上述二者誰先完成?fork示例2父/子進(jìn)程均可連續(xù)調(diào)用fork函數(shù)voidfork2(){printf("L0\n");fork();printf("L1\n");fork();printf("Bye\n");}L0L1L1ByeByeByeByefork示例3父/子進(jìn)程均可連續(xù)調(diào)用fork函數(shù)voidfork3(){printf("L0\n");fork();printf("L1\n");fork();printf("L2\n");fork();printf("Bye\n");}L1L2L2ByeByeByeByeL1L2L2ByeByeByeByeL0fork示例4父/子進(jìn)程均可連續(xù)調(diào)用fork函數(shù)voidfork4(){printf("L0\n");if(fork()!=0){ printf("L1\n"); if(fork()!=0){ printf("L2\n"); fork(); }}printf("Bye\n");}L0L1ByeL2ByeByeByefork示例5父/子進(jìn)程均可連續(xù)調(diào)用fork函數(shù)voidfork5(){printf("L0\n");if(fork()==0){ printf("L1\n"); if(fork()==0){ printf("L2\n"); fork(); }}printf("Bye\n");}L0ByeL1ByeByeByeL2結(jié)束進(jìn)程
voidexit(intstatus)結(jié)束一個進(jìn)程通常返回狀態(tài)0atexit()記錄結(jié)束進(jìn)程時被執(zhí)行的函數(shù)voidcleanup(void){printf("cleaningup\n");}voidfork6(){atexit(cleanup);fork();exit(0);}僵死進(jìn)程思考當(dāng)進(jìn)程終止時,依然會消耗系統(tǒng)資源操作系統(tǒng)會保留多個不同類數(shù)據(jù)此類進(jìn)程被稱為“僵死zombie進(jìn)程”halfaliveandhalfdead回收由父進(jìn)程來回收已經(jīng)終止的子進(jìn)程給父進(jìn)程提供相關(guān)終止?fàn)顟B(tài)信息內(nèi)核丟棄進(jìn)程如果父進(jìn)程沒有回收,怎么辦?如果在回收子進(jìn)程之前,父進(jìn)程均終止了,那么則由init進(jìn)程來回收子進(jìn)程需要顯式地回收長期運(yùn)行的進(jìn)程例如,shells與servers僵死進(jìn)程示例ps
顯示子進(jìn)程為“defunct”狀態(tài)殺死父進(jìn)程,則init進(jìn)程
會回收子進(jìn)程
voidfork6(){if(fork()==0){
/*Child*/ printf("TerminatingChild,PID=%d\n", getpid()); exit(0);}else{ printf("RunningParent,PID=%d\n", getpid()); while(1) ;/*Infiniteloop*/}}未終止子進(jìn)程示例盡管父進(jìn)程已經(jīng)終止,子進(jìn)程依然活躍必須顯式地殺死進(jìn)程,否則將無限期執(zhí)行下去voidfork8(){if(fork()==0){
/*Child*/ printf("RunningChild,PID=%d\n", getpid()); while(1) ;/*Infiniteloop*/}else{ printf("TerminatingParent,PID=%d\n", getpid()); exit(0);}}與子進(jìn)程同步intwait(int*child_status);掛起當(dāng)前進(jìn)程,直到其子進(jìn)程終止返回值是被終止子進(jìn)程的進(jìn)程號pidifchild_status!=NULL,則設(shè)置一個狀態(tài)以指明子進(jìn)程終止原因voidfork9(){intchild_status;if(fork()==0){printf("HC:hellofromchild\n");}else{printf("HP:hellofromparent\n");wait(&child_status);printf("CT:childhasterminated\n");}printf("Bye\n");exit(0);}HPHCByeCTByewait示例
若多個子進(jìn)程結(jié)束,則執(zhí)行順序任意可使用宏指令macrosWIFEXITED和WEXITSTATUS以獲得exit狀態(tài)信息voidfork10(){pid_tpid[N];inti;intchild_status;for(i=0;i<N;i++) if((pid[i]=fork())==0) exit(100+i);/*Child*/for(i=0;i<N;i++){ pid_twpid=wait(&child_status);
if(WIFEXITED(child_status)) printf("Child%dterminatedwithexitstatus%d\n", wpid,WEXITSTATUS(child_status)); else printf("Child%dterminateabnormally\n",wpid);}}wait示例
若多個子進(jìn)程結(jié)束,則執(zhí)行順序任意可使用宏指令macrosWIFEXITED和WEXITSTATUS以獲得exit狀態(tài)信息voidfork10(){pid_tpid[N];inti;intchild_status;for(i=0;i<N;i++) if((pid[i]=fork())==0) exit(100+i);/*Child*/for(i=0;i<N;i++){ pid_twpid=wait(&child_status);
if(WIFEXITED(child_status)) printf("Child%dterminatedwithexitstatus%d\n", wpid,WEXITSTATUS(child_status)); else printf("Child%dterminateabnormally\n",wpid);}}wait示例
若多個子進(jìn)程結(jié)束,則執(zhí)行順序任意可使用宏指令macrosWIFEXITED和WEXITSTATUS以獲得exit狀態(tài)信息voidfork10(){pid_tpid[N];inti;intchild_status;for(i=0;i<N;i++) if((pid[i]=fork())==0) exit(100+i);/*Child*/for(i=0;i<N;i++){ pid_twpid=wait(&child_status);
if(WIFEXITED(child_status)) printf("Child%dterminatedwithexitstatus%d\n", wpid,WEXITSTATUS(child_status)); else printf("Child%dterminateabnormally\n",wpid);}}等待特定進(jìn)程pid_twaitpid(pid_tpid,int*status,intoptions);掛起當(dāng)前進(jìn)程,直至特定進(jìn)程終止options有
WNOHANG
與WUNTRACED
兩種可設(shè)常量status參數(shù)一個整型指針值非NULL,則會將子進(jìn)程退出時的狀態(tài)取出并存入該整數(shù)值指出子進(jìn)程是否正常退出等待特定進(jìn)程pid_twaitpid(pid,&status,options);voidfork11(){pid_tpid[N];inti;intchild_status;for(i=0;i<N;i++) if((pid[i]=fork())==0) exit(100+i);/*Child*/for(i=N-1;i>=0;i--){ pid_twpid=waitpid(pid[i],&child_status,0); if(WIFEXITED(child_status)) printf("Child%dterminatedwithexitstatus%d\n", wpid,WEXITSTATUS(child_status)); else printf("Child%dterminatedabnormally\n",wpid);}}如左圖所示代碼,可能的輸出是什么?請給出一種即可。作答可為此題添加文本、圖片、公式等解析,且需將內(nèi)容全部放在本區(qū)域內(nèi)。此處添加答案解析答案解析主觀題50分休眠進(jìn)程unsignedintsleep(unsignedintsecs);將一個進(jìn)程休眠一段指定的時間若請求的時間量到,則返回0intpause(void);讓調(diào)用該函數(shù)的進(jìn)程一直休眠直到該進(jìn)程收到一個信號C標(biāo)準(zhǔn)文檔對main函數(shù)的規(guī)范寫法:intmain(intargc,char*argv[],char*envp[]);intmain(intargc,char*argv[],char*envp[]);intmain(intargc,char*argv[],char*envp[]);execve加載并運(yùn)行程序加載并運(yùn)行當(dāng)前進(jìn)程:可執(zhí)行文件名參數(shù)列表argv環(huán)境變量列表envp無返回(除非出錯)重寫代碼、數(shù)據(jù)和棧保存pid,打開的文件以及信號等上下文環(huán)境變量:“name=value”字符串getenv與setenvintexecve(char*filename,char*argv[],char*envp[])Null-terminatedenvvarstringsunusedNull-terminatedcmdlineargstringsenvp[n]==NULLenvp[n-1]envp[0]…Linkervarsargv[argc]==NULLargv[argc-1]argv[0]…envpargcargvStackbottomStackframeformainenvironStacktopexecve示例if((pid=fork())==0){if(execve(argv[0],argv,environ)<0){printf("%s:Commandnotfound.\n",argv[0]);exit(0);}}envp[n]=NULLenvp[n-1]envp[0]…argv[argc]=NULLargv[argc-1]argv[0]…“l(fā)s”“-l”“/usr/include”“USER=droh”“PRINTER=iron”“PWD=/usr/droh”argvenviron示例代碼——使用execve函數(shù)execve不會創(chuàng)建新進(jìn)程,而是用新程序替換當(dāng)前進(jìn)程的映像execve調(diào)用成功,則不會有任何返回execve調(diào)用失敗,則必須進(jìn)行錯誤處理hello程序的加載與執(zhí)行Step1:在shell命令行提示符后輸入命令:$./helloStep2:shell命令行解釋器構(gòu)造argv和envpargvargv[0]nullargv[]“./hello"hello程序的加載與執(zhí)行Step1:在shell命令行提示符后輸入命令:$helloStep2:shell命令行解釋器構(gòu)造argv和envpStep3:調(diào)用fork()函數(shù),創(chuàng)建一個子進(jìn)程,獲得與父進(jìn)程shell完全相同的虛擬空間(拷貝),包括只讀段、可讀寫數(shù)據(jù)段、堆以及用戶棧等。
進(jìn)程的地址空間IA-32/Linux平臺下,每個(用戶)進(jìn)程具有獨(dú)立的私有地址空間(虛擬地址空間)每個進(jìn)程的地址空間劃分(即存儲映像)布局相同(如右示)TASK_SIZEhello程序的加載與執(zhí)行Step1:在shell命令行提示符后輸入命令:$./helloStep2:shell命令行解釋器構(gòu)造argv和envpStep3:調(diào)用fork()函數(shù),創(chuàng)建一個子進(jìn)程,獲得與父進(jìn)程shell完全相同的虛擬空間(拷貝),包括只讀段、可讀寫數(shù)據(jù)段、堆以及用戶棧等。Step4:調(diào)用execve()函數(shù),在當(dāng)前進(jìn)程(新創(chuàng)建的子進(jìn)程)的上下文中加載并運(yùn)行hello程序。將hello中的.text節(jié)、.data節(jié)、.bss節(jié)等內(nèi)容加載到當(dāng)前進(jìn)程的虛擬地址空間(僅修改當(dāng)前進(jìn)程上下文中關(guān)于存儲映像的一些數(shù)據(jù)結(jié)構(gòu),不從硬盤拷貝代碼、數(shù)據(jù)等內(nèi)容)Step5:調(diào)用hello程序的main()函數(shù),hello程序開始在一個進(jìn)程的上下文中運(yùn)行。fork、execve等OS內(nèi)核代碼intmain(intargc,char*argv[],char*envp[]);shell命令行解釋器0304進(jìn)程020105任何時候,系統(tǒng)里面由多個活躍進(jìn)程一次一個核只能執(zhí)行一個進(jìn)程每個進(jìn)程看起來都獨(dú)占處理器和私有內(nèi)存地址空間進(jìn)程生成/結(jié)束異常加載和運(yùn)行程序調(diào)用函數(shù)wait或waitpid調(diào)用函數(shù)execve一次調(diào)用,(一般)沒有返回調(diào)用函數(shù)fork,其一次調(diào)用,兩個返回值調(diào)用函數(shù)exit,其一次調(diào)用,無返回需要非標(biāo)準(zhǔn)控制流的事件產(chǎn)生外部(中斷)或內(nèi)部(陷阱和故障)本講小結(jié)回收/等待進(jìn)程多任務(wù)系統(tǒng)系統(tǒng)并發(fā)執(zhí)行多個進(jìn)程進(jìn)程:正在執(zhí)行的程序?qū)嵗錉顟B(tài)包括:存儲器映像,寄存器值,程序計數(shù)器從一個進(jìn)程切換到另一個進(jìn)程當(dāng)進(jìn)程需要輸入/出資源或發(fā)生計時器事件,掛起進(jìn)程當(dāng)輸入/出可得或設(shè)定了調(diào)度優(yōu)先級,則恢復(fù)進(jìn)程對于用戶而言,所有進(jìn)程看起來都是同時執(zhí)行大部分系統(tǒng),一次只能執(zhí)行一個進(jìn)程除非比單獨(dú)運(yùn)行時性能更低程序員的多任務(wù)模型基本函數(shù)fork產(chǎn)生新進(jìn)程一次調(diào)用,返回兩次exit終止自身進(jìn)程一次調(diào)用,不返回可能進(jìn)入僵死狀態(tài)wait與waitpid等待并回收終止的子進(jìn)程execve在現(xiàn)有進(jìn)程上運(yùn)行新程序調(diào)用一次,通常不返回編程挑戰(zhàn)理解函數(shù)的非標(biāo)準(zhǔn)語義避免不恰當(dāng)使用系統(tǒng)資源例如,“forkbombs”可能會令系統(tǒng)崩潰Unix/Linux進(jìn)程層次LoginshellChildChildChildGrandchildGrandchild[0]Daemone.g.httpdinit[1]Shell程序外殼shell
是一個應(yīng)用程序,運(yùn)行與用戶交互相關(guān)的程序sh OriginalUnixshell(StephenBourne,AT&TBellLabs,1977)csh BSDUnixCshell(tcsh:enhancedcshatCMUandelsewhere)bash “Bourne-Again”Shellintmain(){charcmdline[MAXLINE];while(1){
/*read*/ printf(">");
fgets(cmdline,MAXLINE,stdin); if(feof(stdin)) exit(0);
/*evaluate
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 古典詩詞“月亮”意象的跨文化生態(tài)美學(xué)重釋
- 高校科技成果轉(zhuǎn)化對人才培養(yǎng)的反哺機(jī)制-基于《促進(jìn)科技成果轉(zhuǎn)化法》與高校實(shí)踐
- 2025年銅陵普濟(jì)圩現(xiàn)代農(nóng)業(yè)集團(tuán)有限公司公開招聘工作人員參考考試題庫及答案解析
- 2025年安徽某國企汽車駕駛員招聘1人考試備考題庫及答案解析
- 2026江蘇南京醫(yī)科大學(xué)第二附屬醫(yī)院招聘第二批崗位45人考試參考試題及答案解析
- 2025廣西電子高級技工學(xué)校公開招聘非編制工作人員1人備考筆試試題及答案解析
- 2025廣東佛山市南海區(qū)國有資產(chǎn)監(jiān)督管理局財務(wù)總監(jiān)招聘1人備考考試試題及答案解析
- 2025年雞西市民康醫(yī)院公開招聘精神科護(hù)士6人備考考試試題及答案解析
- 2026河南信陽市羅山縣兵役登記參考考試題庫及答案解析
- 2025貴州黔西南州興義市消防救援大隊招錄專職消防員招錄20人備考考試試題及答案解析
- 海水墻面防水施工方案設(shè)計
- 路面攤鋪安全培訓(xùn)內(nèi)容課件
- 水箱安裝施工質(zhì)量管理方案
- 2025年國企人力資源管理崗招聘考試專業(yè)卷(含崗位說明書)解析與答案
- 光伏電廠防火安全培訓(xùn)課件
- 千縣工程縣醫(yī)院微創(chuàng)介入中心綜合能力建設(shè)評價標(biāo)準(zhǔn)
- 交通事故處理講解
- ??贾仉y易錯名校押題卷(含答案)-人教部編版五年級上冊語文高效培優(yōu)測試
- 2025年重大公共衛(wèi)生服務(wù)服務(wù)項(xiàng)目工作方案
- 市政工程地基處理技術(shù)培訓(xùn)
評論
0/150
提交評論