版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第17章線程控制進(jìn)程是操作系統(tǒng)中資源管理的最小單位,線程是程序執(zhí)行的最小單位。在操作系統(tǒng)設(shè)計(jì)上,從進(jìn)程演化出線程最主要的目的就是更好地支持多處理器以及減少上下文切換開(kāi)銷。線程和進(jìn)程十分相似,不同的只是線程比進(jìn)程小。一個(gè)進(jìn)程至少需要一個(gè)線程作為它的指令執(zhí)行體,進(jìn)程管理著計(jì)算機(jī)資源,而將線程分配到某個(gè)CPU上執(zhí)行。本章將介紹線程的基本概念和相關(guān)系統(tǒng)調(diào)用函數(shù),以及在Linux系統(tǒng)上設(shè)計(jì)多線程的方法。17.1線程基本概念線程是在共享內(nèi)存空間中并發(fā)的多道執(zhí)行路徑,它們共享一個(gè)進(jìn)程的資源,如文件描述符和信號(hào)處理。操作系統(tǒng)在兩個(gè)進(jìn)程間進(jìn)行切換時(shí),要對(duì)前一個(gè)進(jìn)程進(jìn)行保護(hù)現(xiàn)場(chǎng)操作,對(duì)后一個(gè)進(jìn)程進(jìn)行還原現(xiàn)場(chǎng)操作。反復(fù)進(jìn)行上下文切換會(huì)帶來(lái)極大的系統(tǒng)開(kāi)銷,CPU必須為此分配一定的時(shí)鐘周期。線程則無(wú)需進(jìn)行上下文切換,因?yàn)槎鄠€(gè)線程共享同一個(gè)進(jìn)程的上下文。多個(gè)線程也共享同一個(gè)進(jìn)程的CPU時(shí)鐘周期,進(jìn)程的狀態(tài)并未因線程切換而改變。Linux系統(tǒng)中曾經(jīng)出現(xiàn)過(guò)多種線程標(biāo)準(zhǔn),但是所有的標(biāo)準(zhǔn)都統(tǒng)一為IEEE制定的可移植操作系統(tǒng)接口標(biāo)準(zhǔn)POSIX。目前,最為廣泛使用的是Pthread線程標(biāo)準(zhǔn),它更接近執(zhí)行體的概念。同一進(jìn)程的線程可共享同一個(gè)u區(qū)和上下文,但也能擁有自身的堆??臻g和獨(dú)立的執(zhí)行序列。Pthread線程與輕量級(jí)進(jìn)程(LWP)相似,可以使進(jìn)程同時(shí)執(zhí)行多個(gè)任務(wù)。在實(shí)際應(yīng)用中,很多程序都是基于多線程的。例如網(wǎng)頁(yè)瀏覽器,為了加快從網(wǎng)絡(luò)上讀取文件的速度,通常會(huì)啟用多個(gè)線程分別讀取文件的不同位置,最后將數(shù)據(jù)合并在一起。即時(shí)通信軟件也會(huì)使用到多線程概念,否則無(wú)法同時(shí)與多人進(jìn)行通信。17.2線程的實(shí)現(xiàn)早期Linux系統(tǒng)中的線程是通過(guò)fork系統(tǒng)調(diào)用實(shí)現(xiàn)的,這種線程即為輕量級(jí)進(jìn)程。它的缺陷是最多只允許同時(shí)創(chuàng)建4095個(gè)線程或進(jìn)程,而高端系統(tǒng)同時(shí)需要服務(wù)上千用戶,這一限制使Linux系統(tǒng)無(wú)法進(jìn)入企業(yè)級(jí)市場(chǎng)。在Linux系統(tǒng)的發(fā)展中,線程或進(jìn)程數(shù)量的限制被取消,并逐漸形成了新的線程模型NPTL(NativePOSIXThreadingLibrary)。NPTL與POSIX標(biāo)準(zhǔn)保持了兼容性,其創(chuàng)建、啟動(dòng)和鏈接開(kāi)銷都非常低,并且提供了良好的軟硬件擴(kuò)展能力。對(duì)于運(yùn)行負(fù)荷繁重的線程應(yīng)用,以及多路處理器、多核處理器而言,NPTL線程性能提高顯著。除此以外,NPTL引入了線程組、線程獨(dú)立的本地存儲(chǔ)區(qū)等概念,在多線程和內(nèi)存管理機(jī)制上也進(jìn)行了大量改進(jìn)。17.2.1用戶態(tài)線程用戶態(tài)線程是由進(jìn)程負(fù)責(zé)調(diào)度管理、高度抽象化的、與硬件平臺(tái)無(wú)關(guān)的線程機(jī)制。其最為顯著的標(biāo)志是,進(jìn)程在創(chuàng)建多個(gè)線程時(shí),不需要Linux內(nèi)核支持,也不直接對(duì)CPU標(biāo)志寄存器進(jìn)行操作。用戶態(tài)的優(yōu)勢(shì)在于:減少多線程的系統(tǒng)開(kāi)銷:進(jìn)程下的線程進(jìn)行調(diào)度切換時(shí),不需要進(jìn)行系統(tǒng)調(diào)用。同一個(gè)進(jìn)程可創(chuàng)建的線程數(shù)沒(méi)有限制。用戶態(tài)實(shí)現(xiàn)方式靈活:可根據(jù)實(shí)際需要設(shè)計(jì)相應(yīng)的用戶態(tài)線程機(jī)制,對(duì)于實(shí)時(shí)性要求高的程序格外重要。但是,如果某進(jìn)程的其中一個(gè)線程被阻塞,進(jìn)程會(huì)進(jìn)入睡眠狀態(tài),其它線程同時(shí)也被阻塞。造成該現(xiàn)象的原因是Linux內(nèi)核使用異步輸入輸出機(jī)制。用戶態(tài)的缺陷是,無(wú)法發(fā)揮多路處理器和多核處理器的優(yōu)勢(shì)。17.2.2內(nèi)核態(tài)線程內(nèi)核態(tài)線程是由Linux操作系統(tǒng)根據(jù)CPU硬件的特點(diǎn),以硬件底層模式實(shí)現(xiàn)的線程機(jī)制。內(nèi)核態(tài)將所有線程按照同一調(diào)度算法調(diào)度,更有利于發(fā)揮多路處理器和多核處理器所支持的并發(fā)處理特性。內(nèi)核態(tài)線程可自由訪問(wèn)內(nèi)存空間,并且在某一線程阻塞時(shí),其它線程還能正常運(yùn)行。但是,相對(duì)于用戶態(tài)線程,內(nèi)核態(tài)線程的系統(tǒng)開(kāi)銷稍大,并且必須通過(guò)系統(tǒng)調(diào)用實(shí)現(xiàn),對(duì)硬件和Linux內(nèi)核版本的依賴性較高,不利于程序移植。17.3POSIX線程庫(kù)本節(jié)將以Pthread線程為標(biāo)準(zhǔn)講解POSIX線程庫(kù)的使用方法。Pthread線程對(duì)應(yīng)的函數(shù)庫(kù)為libpthread,是目前Linux系統(tǒng)上最常用的線程庫(kù)。它支持NPTL線程模型,以用戶態(tài)線程實(shí)現(xiàn)。該函數(shù)庫(kù)的接口被定義在“pthread.h”頭文件中。17.3.1創(chuàng)建線程創(chuàng)建線程可通過(guò)函數(shù)pthread_create()實(shí)現(xiàn)。線程沒(méi)有獨(dú)立的PID等信息,無(wú)法直觀地證明已創(chuàng)建成功。pthread_create()函數(shù)的一般形式是:intpthread_create(pthread_t*thread,pthread_attr_t*attr,void*(*start_routine)(void*),void*
arg);其中,第一個(gè)參數(shù)*thread是一個(gè)pthread_t結(jié)構(gòu)的指針,該結(jié)構(gòu)用于保存線程的信息,函數(shù)創(chuàng)建線程成功時(shí),將線程的標(biāo)識(shí)符等信息寫(xiě)入*thread指針?biāo)赶虻膬?nèi)存空間。第二個(gè)參數(shù)*attr是一個(gè)pthread_attr_t結(jié)構(gòu)指針,結(jié)構(gòu)中的元素分別對(duì)應(yīng)著新線程的運(yùn)行屬性,屬性的定義如后表所示。在沒(méi)有特殊的屬性要求時(shí),可將NULL作為參數(shù)傳遞。17.3.1創(chuàng)建線程成員名稱說(shuō)
明__detachstate表示新線程是否與進(jìn)程中其它線程脫離同步,如果置位則新線程不能用pthread_join()來(lái)同步,且在退出時(shí)自行釋放所占用的資源。默認(rèn)為PTHREAD_CREATE_JOINABLE狀態(tài)。這個(gè)屬性也可以在線程創(chuàng)建并運(yùn)行以后用pthread_detach()來(lái)設(shè)置,而一旦設(shè)置為PTHREAD_CREATE_DETACH狀態(tài)(不論是創(chuàng)建時(shí)設(shè)置還是運(yùn)行時(shí)設(shè)置)則不能再恢復(fù)到PTHREAD_CREATE_JOINABLE狀態(tài)__schedpolicy表示新線程的調(diào)度策略,主要包括SCHED_OTHER(正常、非實(shí)時(shí))、SCHED_RR(實(shí)時(shí)、輪轉(zhuǎn)法)和SCHED_FIFO(實(shí)時(shí)、先入先出)3種,默認(rèn)為SCHED_OTHER,后兩種調(diào)度策略僅對(duì)根用戶有效。運(yùn)行時(shí)可以通過(guò)pthread_setschedparam()來(lái)改變__schedparam一個(gè)structsched_param結(jié)構(gòu),目前僅有一個(gè)sched_priority整型變量表示線程的運(yùn)行優(yōu)先級(jí)。這個(gè)參數(shù)僅當(dāng)調(diào)度策略為實(shí)時(shí)(即SCHED_RR或SCHED_FIFO)時(shí)才有效,并可以在運(yùn)行時(shí)通過(guò)pthread_setschedparam()函數(shù)來(lái)改變,默認(rèn)為0__inheritsched有兩種值可供選擇:PTHREAD_EXPLICIT_SCHED和PTHREAD_INHERIT_SCHED,前者表示新線程使用顯式指定調(diào)度策略和調(diào)度參數(shù)(即attr中的值),而后者表示繼承調(diào)用者線程的值。默認(rèn)為PTHREAD_EXPLICIT_SCHED__scope表示線程間競(jìng)爭(zhēng)CPU的范圍,也就是說(shuō)線程優(yōu)先級(jí)的有效范圍。POSIX的標(biāo)準(zhǔn)中定義了兩個(gè)值:PTHREAD_SCOPE_SYSTEM和PTHREAD_SCOPE_PROCESS,前者表示與系統(tǒng)中所有線程一起競(jìng)爭(zhēng)CPU時(shí)間,后者表示僅與同進(jìn)程中的線程競(jìng)爭(zhēng)CPU。目前LinuxThreads僅實(shí)現(xiàn)了PTHREAD_SCOPE_SYSTEM一值17.3.1創(chuàng)建線程第三個(gè)參數(shù)表示需要傳遞的是start_routine()函數(shù)的地址,該函數(shù)以一個(gè)指向void的指針為參數(shù),返回的也是指向void的指針,這種方式使任何類型的數(shù)據(jù)都能作為參數(shù),也能返回給任何類型的數(shù)據(jù)結(jié)構(gòu)。start_routine()函數(shù)的作用是啟動(dòng)線程。第四個(gè)參數(shù)是start_routine()函數(shù)的參數(shù)。pthread_create()在創(chuàng)建線程成功時(shí)返回0,在失敗時(shí)返回一個(gè)錯(cuò)誤代碼。需要注意的是,與Pthread相關(guān)的函數(shù)在錯(cuò)誤時(shí)都不會(huì)返回–1。17.3.2結(jié)束線程線程結(jié)束時(shí)可調(diào)用函數(shù)pthread_exit(),該函數(shù)的原理與結(jié)束進(jìn)程的exit系統(tǒng)調(diào)用相似。它的作用是結(jié)束調(diào)用了這個(gè)函數(shù)的線程,返回一個(gè)指向某個(gè)變量的指針。這個(gè)指針絕對(duì)不能是局部變量的指針,因?yàn)榫植孔兞繒?huì)在線程出現(xiàn)嚴(yán)重問(wèn)題時(shí)消失。pthread_exit()函數(shù)的一般形式是:voidpthread_exit(void*retval);如果進(jìn)程需要在線程結(jié)束后與其歸并到一起,可使用函數(shù)pthread_join()實(shí)現(xiàn),該函數(shù)的原理與進(jìn)程同步的wait系統(tǒng)調(diào)用相同。pthread_join()函數(shù)的一般形式是:intpthread_join(pthread_tth,void**thread_return);第一個(gè)參數(shù)用于指定要等待的線程,該參數(shù)即是pthread_create()函數(shù)定義的標(biāo)識(shí)符。第二個(gè)參數(shù)是一個(gè)指針,它指向另一個(gè)指針,后者指向線程的返回值。當(dāng)?shù)却木€程成功結(jié)束時(shí),函數(shù)返回0,否則返回一個(gè)錯(cuò)誤代碼。下例將演示從創(chuàng)建線程和結(jié)束線程的操作方法,新線程與原有線程共享變量。(17_3_2.c)17.3.2結(jié)束線程程序中,pthread_create()函數(shù)傳遞了一個(gè)pthread_t類型結(jié)構(gòu)的地址,該地址用于對(duì)新線程的引用。pthread_create()函數(shù)的第二個(gè)實(shí)際參數(shù)為NULL,表示不改變線程的默認(rèn)屬性。第三個(gè)參數(shù)是為線程定義的函數(shù)名,第四個(gè)參數(shù)是線程函數(shù)的參數(shù),即在程序開(kāi)始部分定義的公用內(nèi)存空間。如果線程創(chuàng)建成功,那么就會(huì)有兩個(gè)線程在同時(shí)執(zhí)行。原有線程將繼續(xù)執(zhí)行pthread_create()后的代碼,新線程執(zhí)行線程函數(shù)體內(nèi)的代碼。在驗(yàn)證新線程啟動(dòng)成功后,原有線程調(diào)用pthread_join()函數(shù)等待新線程結(jié)束。pthread_join()函數(shù)的兩個(gè)參數(shù)分別是新線程的標(biāo)識(shí)符信息和用于指向新線程返回值的指針。新線程在函數(shù)體內(nèi)先輸出一條信息,再在休眠3秒后改變公共內(nèi)存空間內(nèi)的數(shù)值,最后執(zhí)行pthread_exit()函數(shù)結(jié)束自身并返回一條信息。原有線程這時(shí)正在等待pthread_join()函數(shù)接收新線程結(jié)束的信息,當(dāng)收到結(jié)束信息后,pthread_join()函數(shù)將控制權(quán)還給主函數(shù),主函數(shù)輸出結(jié)束信息并退出。該程序的輸出結(jié)果為:線程在運(yùn)行,參數(shù)為:THREAD_TEST等待線程結(jié)束...線程已結(jié)束,返回值:線程執(zhí)行完畢Message的值為:線程修改17.3.2結(jié)束線程在編譯該程序時(shí),需要加入預(yù)先定義的_REENTRANT宏和_POSIX_C_SOURCE宏,如下例所示:gcc-D_REENTRANT-I/usr/include/nptlbook_h32.c–obook_h32-L/usr/lib/nptl–lpthread在Eclipse中,先單擊ProjectExplorer中對(duì)應(yīng)的項(xiàng)目名稱,選擇Project|Properties命令打開(kāi)該項(xiàng)目的屬性對(duì)話框。然后在對(duì)話框左側(cè)的列表框中選擇C/C++Build|Settings命令打開(kāi)設(shè)置選項(xiàng)卡,在設(shè)置選項(xiàng)卡內(nèi)ToolSettings列表框中選擇GCCCCompiler|Miscellaneous列表項(xiàng),將編譯參數(shù)“-D_REENTRANT-I/usr/include/nptl-L/usr/lib/nptl-lpthread”加入在Otherflags文本框原有的內(nèi)容后。在同一個(gè)列表框中,選擇GCCCLinker|Miscellaneous列表項(xiàng),將上面的編譯參數(shù)輸入到Linkerflags文本框原有的內(nèi)容后。17.4同步線程同時(shí)運(yùn)行時(shí),有一組函數(shù)可以幫助我們更好地控制線程的執(zhí)行情況和更好地訪問(wèn)代碼的關(guān)鍵部分。其中包括兩種基本方法,第一種是“信號(hào)量”,第二種是“互斥量”。這兩種方法非常相似并能互相實(shí)現(xiàn),選擇哪種方法取決于程序的實(shí)際需要。例如控制共享內(nèi)存,使之在任何一個(gè)時(shí)刻只有一個(gè)線程能夠?qū)λM(jìn)行訪問(wèn),使用互斥量更為合適。但如果需要控制一組同等對(duì)象的訪問(wèn)權(quán),例如從5條電話線里給某個(gè)線程分配一條,計(jì)數(shù)信號(hào)量就更合適。17.4.1用信號(hào)量進(jìn)行同步與信號(hào)量相關(guān)的函數(shù)名字都以“sem_”作為前綴,線程里使用的基本信號(hào)量函數(shù)有4個(gè),被包含在頭文件semaphore.h中。初始化信號(hào)量可使用函數(shù)sem_init(),它的一般形式是:intsem_init(sem_t*sem,intpshared,unsignedintvalue);其中,第一個(gè)參數(shù)是sem_t結(jié)構(gòu)的指針,該結(jié)構(gòu)用于保存信號(hào)量的信息。第二個(gè)參數(shù)控制信號(hào)量的類型,如果參數(shù)值為0,表示該信號(hào)量是局部的,否則其它程序就能共享這個(gè)信號(hào)量。第三個(gè)參數(shù)是信號(hào)量的初始值。17.4.1用信號(hào)量進(jìn)行同步修改信號(hào)量可使用函數(shù)sem_wait()和sem_post()實(shí)現(xiàn),這兩個(gè)函數(shù)進(jìn)行的都是原子操作,即同時(shí)對(duì)同一個(gè)信號(hào)量操作的兩個(gè)線程不會(huì)沖突。sem_wait()函數(shù)的作用是使信號(hào)量減1,如果信號(hào)量的值為零值,那么sem_wait()函數(shù)會(huì)保留控制權(quán),等待信號(hào)量變?yōu)榉橇阒岛筮M(jìn)行操作,再將控制權(quán)還給調(diào)用者。sem_post()的作用是使信號(hào)量加1。它們的一般形式是:intsem_wait(sem_t*
sem);intsem_post(sem_t*
sem);參數(shù)為sem_init()函數(shù)所生成的信號(hào)結(jié)構(gòu)數(shù)據(jù)。當(dāng)信號(hào)量使用結(jié)束的時(shí)候,可使用sem_destroy()函數(shù)對(duì)其進(jìn)行清理。它的一般形式是:intsem_destroy(sem_t*
sem);該函數(shù)以信號(hào)量指針作為參數(shù),歸還信號(hào)量所占用的資源。如果還有其它線程使用已清理的信號(hào)量,那么線程會(huì)收到一個(gè)錯(cuò)誤。(17_4_1.c)程序中定義了一個(gè)全局范圍的信號(hào)量,在創(chuàng)建進(jìn)程前對(duì)信號(hào)量進(jìn)行初始化,信號(hào)量初始值為0。啟動(dòng)新線程后,將標(biāo)準(zhǔn)輸入獲得的數(shù)據(jù)存入公共的內(nèi)存空間work_area中去,然后用sem_post()函數(shù)對(duì)信號(hào)量加1。新線程里,等待信號(hào)量的變化,一旦信號(hào)量產(chǎn)生變化就檢查公共空間里的數(shù)據(jù),并將數(shù)據(jù)的字符個(gè)數(shù)輸出。如果鍵盤(pán)輸入的信息為end,那么原有線程等待新線程結(jié)束,新線程在公共空間收到end信息后結(jié)束線程。17.4.2用互斥量進(jìn)行同步互斥量同步是另一種在多線程程序中的同步訪問(wèn)手段,互斥量的作用猶如給某個(gè)對(duì)象加上一把鎖,每次只允許一個(gè)線程去訪問(wèn)它。如果想對(duì)代碼關(guān)鍵部分的訪問(wèn)進(jìn)行控制,可以在進(jìn)入這段代碼之前鎖定一個(gè)互斥量,完成操作之后再解開(kāi)它。使用互斥量要用到的基本函數(shù)與信號(hào)量需要使用的函數(shù)很相識(shí),同樣是4個(gè),它們的一般形式如下:intpthread_mutex_init(pthread_mutex_t*mutex,constpthread_mutexattr_t*mutexattr);intpthread_mutex_lock(pthread_mutex_t*mutex));intpthread_mutex_unlock(pthread_mutex_t*mutex);intpthread_mutex_destroy(pthread_mutex_t*mutex);pthread_mutex_init()函數(shù)用于創(chuàng)建一個(gè)互斥量,第一個(gè)參數(shù)是指向互斥量的數(shù)據(jù)結(jié)構(gòu)pthread_mutex_t的指針,第二個(gè)參數(shù)是定義互斥量屬性的pthread_mutexattr_t結(jié)構(gòu)的指針,它的默認(rèn)類型是fast。類似于信號(hào)量的使用方法,pthread_mutex_lock()是對(duì)互斥量進(jìn)行鎖定操作,pthread_mutex_unlock()是對(duì)互斥量進(jìn)行解鎖操作。函數(shù)pthread_mutex_destroy()的作用是清除互斥量。17.4.2用互斥量進(jìn)行同步如果對(duì)一個(gè)已經(jīng)加了鎖的互斥量調(diào)用pthread_mutex_lock()函數(shù),那么程序本身就會(huì)被阻塞;而因?yàn)閾碛谢コ饬康哪莻€(gè)線程現(xiàn)在也是被阻塞的線程之一,所以互斥量就永遠(yuǎn)也打不開(kāi)了,程序?qū)⑦M(jìn)入死鎖狀態(tài)。要避免死鎖有兩種做法:一是讓它檢測(cè)有可能發(fā)生死鎖的這種現(xiàn)象并返回一個(gè)錯(cuò)誤;二是讓它遞歸地操作,允許同一個(gè)線程加上好幾把鎖,但前提是以后必須有同等數(shù)量的解鎖鑰匙。(17_4_2.c)在程序的開(kāi)始,首先建立互斥量和公共內(nèi)存空間,對(duì)循環(huán)控制表示time_to_exit進(jìn)行定義?;コ饬砍跏蓟?,啟動(dòng)新線程,新線程首先試圖對(duì)互斥量進(jìn)行加鎖。如果當(dāng)時(shí)互斥量已經(jīng)被鎖定,調(diào)用會(huì)被阻塞,直到互斥量被解除鎖定。新線程活動(dòng)訪問(wèn)權(quán)時(shí),先會(huì)檢查是否有退出程序的請(qǐng)求,如果有就將循環(huán)控制符time_to_exit置為0,然后清除公共空間內(nèi)的數(shù)據(jù)并退出線程。如果沒(méi)有收到退出請(qǐng)求,則統(tǒng)計(jì)公共空間內(nèi)的字符個(gè)數(shù),接下來(lái)對(duì)互斥量進(jìn)行解鎖并等待原有線程的運(yùn)行。實(shí)際上,原有線程的運(yùn)行和新線程的運(yùn)行是交叉進(jìn)行的。17.5取消線程在有些時(shí)候,需要讓一個(gè)線程能夠請(qǐng)求另外一個(gè)線程結(jié)束,可使用pthread_cancel()函數(shù)發(fā)送一個(gè)要求取消線程的信號(hào)。該函數(shù)的一般形式是:intpthread_cancel(pthread_tthread);參數(shù)中指定的線程在收到取消請(qǐng)求后,會(huì)對(duì)自己稍做一些處理,然后結(jié)束。在線程函數(shù)中可使用pthread_setcancelstate()設(shè)置自己的取消狀態(tài),該函數(shù)的一般形式是:intpthread_setcancelstate(intstate,int*oldstate);第一個(gè)參數(shù)是狀態(tài)的設(shè)定值,它可以是一個(gè)枚舉常量,定義有:PTHREAD_CANCEL_ENABLE,這個(gè)值允許線程接收取消請(qǐng)求;PTHREAD_CANCEL_DISABLE,這個(gè)值屏蔽取消請(qǐng)求。第二個(gè)參數(shù)是線程的取消狀態(tài),該狀態(tài)的定義與創(chuàng)建線程的函數(shù)相同,如果沒(méi)有特殊要求可傳送NULL。17.5取消線程如果取消請(qǐng)求被接受了,線程會(huì)進(jìn)入第二個(gè)控制層次
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 養(yǎng)老院醫(yī)療保健服務(wù)管理制度
- 企業(yè)員工獎(jiǎng)懲與激勵(lì)制度
- 會(huì)議信息發(fā)布與宣傳推廣制度
- 2026年房地產(chǎn)經(jīng)紀(jì)人從業(yè)資格題庫(kù)與答案
- 2026年?duì)I養(yǎng)師專業(yè)能力與知識(shí)考試題集
- 2026年移動(dòng)支付與金融科技產(chǎn)品實(shí)操試題
- 2026年財(cái)務(wù)管理高級(jí)筆試模擬卷
- 2026年軟件測(cè)試專家知識(shí)技能水平認(rèn)證題目
- 2026年新版原代細(xì)胞合同
- 2026年新版球帽附著協(xié)議
- 企業(yè)用油管理制度
- 《建筑施工常見(jiàn)問(wèn)題》課件
- 職高計(jì)算機(jī)單招操作題庫(kù)單選題100道及答案
- 通信工程部的職責(zé)與技術(shù)要求
- 簡(jiǎn)愛(ài)插圖本(英)夏洛蒂·勃朗特著宋兆霖譯
- 焊接專業(yè)人才培養(yǎng)方案
- 第二屆全國(guó)技能大賽江蘇省選拔賽焊接項(xiàng)目評(píng)分表
- 糖尿病護(hù)士年終總結(jié)
- 第20課 《美麗的小興安嶺》 三年級(jí)語(yǔ)文上冊(cè)同步課件(統(tǒng)編版)
- 糖尿病基礎(chǔ)知識(shí)培訓(xùn)2
- 研學(xué)旅行概論第六章
評(píng)論
0/150
提交評(píng)論