




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、并發(fā)服務(wù)器目錄n服務(wù)器分類技術(shù)n進程與線程n多進程服務(wù)器n多線程服務(wù)器并發(fā)服務(wù)器服務(wù)器分類n按連接類型分類n面向連接的服務(wù)器(如tcp)n面向無連接的服務(wù)器(如udp)n按處理方式分類n迭代服務(wù)器n并發(fā)服務(wù)器迭代服務(wù)器 vs. 并發(fā)服務(wù)器綁定地址監(jiān)聽連接接收連接處理連接斷開連接接收請求處理請求返回響應(yīng)綁定地址監(jiān)聽連接接收連接創(chuàng)建子進程關(guān)閉連接套接字處理連接關(guān)閉連接套接字終止子進程關(guān)閉監(jiān)聽套接字服務(wù)器主進程服務(wù)器子進程TCP迭代服務(wù)器TCP并發(fā)服務(wù)器“進程”基本概念n進程定義了一個計算的基本單元,可以認為是一個程序的一次運行。它是一個動態(tài)實體,是獨立的任務(wù)。它擁有獨立的地址空間、執(zhí)行堆棧、文件描
2、述符等。n每個進程擁有獨立的地址空間,進程間正常情況下,互不影響,一個進程的崩潰不會造成其他進程的崩潰。n當進程間共享某一資源時,需注意兩個問題:同步問題和通信問題。創(chuàng)建進程#include #include pid_t fork(void)返回:父進程中返回子進程的進程返回:父進程中返回子進程的進程ID, 子進程返回子進程返回0, -1出錯出錯nfork后,子進程和父進程繼續(xù)執(zhí)行后,子進程和父進程繼續(xù)執(zhí)行fork()函數(shù)后的指令。()函數(shù)后的指令。子進程是父進程的副本。子進程擁有父進程的數(shù)據(jù)空間、子進程是父進程的副本。子進程擁有父進程的數(shù)據(jù)空間、堆棧的副本。但父、子進程并不共享這些存儲空間部
3、分。堆棧的副本。但父、子進程并不共享這些存儲空間部分。如果代碼段是只讀的,則父子進程共享代碼段。如果父子如果代碼段是只讀的,則父子進程共享代碼段。如果父子進程同時對同一文件描述字操作,而又沒有任何形式的同進程同時對同一文件描述字操作,而又沒有任何形式的同步,則會出現(xiàn)混亂的狀況;步,則會出現(xiàn)混亂的狀況;n父進程中調(diào)用父進程中調(diào)用fork之前打開的所有描述字在函數(shù)之前打開的所有描述字在函數(shù)fork返回返回之后子進程會得到一個副本。之后子進程會得到一個副本。fork后,父子進程均需要將后,父子進程均需要將自己不使用的描述字關(guān)閉。自己不使用的描述字關(guān)閉。創(chuàng)建進程(cont.)#include #inc
4、lude pid_t vfork(void);n該系統(tǒng)調(diào)用基本上與該系統(tǒng)調(diào)用基本上與fork相同,在相同,在BSD3.0中開始出現(xiàn),主中開始出現(xiàn),主要為了解決要為了解決fork昂貴的開銷。昂貴的開銷。n兩者的基本區(qū)別在于當使用兩者的基本區(qū)別在于當使用vfork()創(chuàng)建新進程時,父進程創(chuàng)建新進程時,父進程將被暫時阻塞,而子進程則可以借用父進程的地址空間,直將被暫時阻塞,而子進程則可以借用父進程的地址空間,直到子進程退出,至此父進程才繼續(xù)執(zhí)行。到子進程退出,至此父進程才繼續(xù)執(zhí)行。終止進程終止進程n進程的終止存在兩個可能:進程的終止存在兩個可能:n父進程先于子進程終止(父進程先于子進程終止(init
5、進程領(lǐng)養(yǎng))進程領(lǐng)養(yǎng))n子進程先于主進程終止子進程先于主進程終止n對于后者,系統(tǒng)內(nèi)核為子進程保留一定的狀態(tài)對于后者,系統(tǒng)內(nèi)核為子進程保留一定的狀態(tài)信息:進程信息:進程ID、終止狀態(tài)、終止狀態(tài)、CPU時間等;當時間等;當父進程調(diào)用父進程調(diào)用wait或或waitpid函數(shù)時,獲取這些函數(shù)時,獲取這些信息;(什么叫信息;(什么叫“僵尸進程僵尸進程”?)?)n當子進程正常或異常終止時,系統(tǒng)內(nèi)核向其父當子進程正?;虍惓=K止時,系統(tǒng)內(nèi)核向其父進程發(fā)送進程發(fā)送SIGCHLD信號;缺省情況下,父進信號;缺省情況下,父進程忽略該信號,或者提供一個該信號發(fā)生時即程忽略該信號,或者提供一個該信號發(fā)生時即被調(diào)用的函數(shù)。
6、被調(diào)用的函數(shù)。終止進程(續(xù))終止進程(續(xù))#include void exit(int status);n本函數(shù)終止調(diào)用進程。關(guān)閉所有子進程打開的描述本函數(shù)終止調(diào)用進程。關(guān)閉所有子進程打開的描述符,向父進程發(fā)送符,向父進程發(fā)送SIGCHLD信號,并返回狀態(tài)。信號,并返回狀態(tài)。獲取子進程終止信息獲取子進程終止信息#include #include pid_t wait(int *stat_loc); 返回:終止子進程的返回:終止子進程的ID成功;成功;-1出錯;出錯;stat_loc存儲存儲子進程的終止狀態(tài)(一個整數(shù));子進程的終止狀態(tài)(一個整數(shù));n如果沒有終止的子進程,但是有一個或多個正在執(zhí)
7、如果沒有終止的子進程,但是有一個或多個正在執(zhí)行的子進程,則該函數(shù)將堵塞,直到有一個子進程行的子進程,則該函數(shù)將堵塞,直到有一個子進程終止或者終止或者wait被信號中斷時,被信號中斷時,wait返回。返回。n當調(diào)用該系統(tǒng)調(diào)用時,如果有一個子進程已經(jīng)終止,當調(diào)用該系統(tǒng)調(diào)用時,如果有一個子進程已經(jīng)終止,則該系統(tǒng)調(diào)用立即返回,并釋放子進程所有資源。則該系統(tǒng)調(diào)用立即返回,并釋放子進程所有資源。獲取子進程終止信息獲取子進程終止信息使用wait()函數(shù)可能會出現(xiàn)一個問題SIGCHLD服務(wù)器父進程服務(wù)器父進程服務(wù)器子進程服務(wù)器子進程服務(wù)器子進程服務(wù)器子進程服務(wù)器子進程服務(wù)器子進程客戶客戶FINFINFINSI
8、GCHLDSIGCHLD由于由于linux信號不排隊,在信號不排隊,在SIGCHLD信號同時到來后,信信號同時到來后,信號處理程序中調(diào)用了號處理程序中調(diào)用了wait函數(shù),其只執(zhí)行一次,這樣將留函數(shù),其只執(zhí)行一次,這樣將留下下2個僵尸進程??梢允褂脗€僵尸進程。可以使用waitpid函數(shù)解決這個問題。函數(shù)解決這個問題。獲取子進程終止信息獲取子進程終止信息pid_t waitpid(pid_t pid, int *stat_loc, int options); 返回:終止子進程的返回:終止子進程的ID成功;成功;-1出錯;出錯;stat_loc存儲存儲子進程的終止狀態(tài);子進程的終止狀態(tài);n當當pid
9、=-1,option=0時,該函數(shù)等同于時,該函數(shù)等同于wait,否則,否則由參數(shù)由參數(shù)pid和和option共同決定函數(shù)行為,其中共同決定函數(shù)行為,其中pid參參數(shù)意義如下:數(shù)意義如下:n-1:要求知道任何一個子進程的返回狀態(tài)(等待第一:要求知道任何一個子進程的返回狀態(tài)(等待第一個終止的子進程);個終止的子進程);n0:要求知道進程號為:要求知道進程號為pid的子進程的狀態(tài);的子進程的狀態(tài);n-1:要求知道進程號為要求知道進程號為pid的絕對值的子進程的終止的絕對值的子進程的終止狀態(tài)狀態(tài) nOptions最常用的選項是最常用的選項是WNOHANG,它通它通知內(nèi)核在沒有已終止進程時不要堵塞。知
10、內(nèi)核在沒有已終止進程時不要堵塞。獲取子進程終止信息(獲取子進程終止信息(cont.)n調(diào)用調(diào)用wait或或waitpid函數(shù)時,正常情況下,函數(shù)時,正常情況下,可能會有以下幾種情況:可能會有以下幾種情況:n阻塞(如果其所有子進程都還在運行);阻塞(如果其所有子進程都還在運行);n獲得子進程的終止狀態(tài)并立即返回(如果獲得子進程的終止狀態(tài)并立即返回(如果一個子進程已終止,正等待父進程存取其一個子進程已終止,正等待父進程存取其終止狀態(tài));終止狀態(tài));n出錯立即返回(如果它沒有任何子進程)出錯立即返回(如果它沒有任何子進程)多進程并發(fā)服務(wù)器狀態(tài)圖服務(wù)器客戶connect()函數(shù)listenfd客戶/服
11、務(wù)器狀態(tài)圖(調(diào)用accept函數(shù)時)連接請求多進程并發(fā)服務(wù)器狀態(tài)圖(cont.)服務(wù)器服務(wù)器客戶客戶connect()函數(shù)listenfd客戶/服務(wù)器狀態(tài)圖(調(diào)用accept函數(shù)后)connfd連接建立多進程并發(fā)服務(wù)器狀態(tài)圖(cont.)服務(wù)器(父進程)服務(wù)器(父進程)客戶客戶connect()函數(shù)函數(shù)listenfd客戶/服務(wù)器狀態(tài)圖(調(diào)用fork函數(shù)后)connfd連接建立連接建立服務(wù)器(子進程)listenfdconnfdfork()函數(shù)多進程并發(fā)服務(wù)器狀態(tài)圖(cont.)服務(wù)器(父進程)服務(wù)器(父進程)客戶客戶connect()函數(shù)函數(shù)listenfd客戶/服務(wù)器狀態(tài)圖(父進程關(guān)閉連接
12、套接字,子進程關(guān)閉監(jiān)聽套接字)連接建立服務(wù)器(子進程)服務(wù)器(子進程)connfd多進程并發(fā)服務(wù)器實例n該實例包括服務(wù)器程序和客戶程序,具體功能如下:該實例包括服務(wù)器程序和客戶程序,具體功能如下:n服務(wù)器等待接收客戶的連接請求,一旦連接成功則顯服務(wù)器等待接收客戶的連接請求,一旦連接成功則顯示客戶地址,接著接收客戶端的名稱并顯示;然后接示客戶地址,接著接收客戶端的名稱并顯示;然后接收來自該客戶的字符串,每當收到一個字符串時,顯收來自該客戶的字符串,每當收到一個字符串時,顯示該字符串,并將字符串按照愷撒密碼的加密方式示該字符串,并將字符串按照愷撒密碼的加密方式(K=3)進行加密,再將加密后的字符發(fā)
13、回客戶端;)進行加密,再將加密后的字符發(fā)回客戶端;之后,繼續(xù)等待接收該客戶的信息,直到客戶關(guān)閉連之后,繼續(xù)等待接收該客戶的信息,直到客戶關(guān)閉連接。要求服務(wù)器具有同時處理多個客戶請求的能力。接。要求服務(wù)器具有同時處理多個客戶請求的能力。n客戶首先與相應(yīng)的服務(wù)器建立連接;接著接收用戶輸客戶首先與相應(yīng)的服務(wù)器建立連接;接著接收用戶輸入的客戶端名稱,并將其發(fā)送給服務(wù)器;然后繼續(xù)接入的客戶端名稱,并將其發(fā)送給服務(wù)器;然后繼續(xù)接收用戶輸入的字符串,再將字符串發(fā)送給服務(wù)器,同收用戶輸入的字符串,再將字符串發(fā)送給服務(wù)器,同時接收服務(wù)器發(fā)回的加密后的字符串并顯示。之后,時接收服務(wù)器發(fā)回的加密后的字符串并顯示。之
14、后,繼續(xù)等待用戶輸入字符串,直到用戶輸入繼續(xù)等待用戶輸入字符串,直到用戶輸入Ctrl+D,客,客戶關(guān)閉連接并退出。戶關(guān)閉連接并退出。 多進程服務(wù)器的問題多進程服務(wù)器的問題 雖然多進程并發(fā)服務(wù)器模式很多年來都使用得雖然多進程并發(fā)服務(wù)器模式很多年來都使用得很好,但使用很好,但使用fork生成子進程存在一些問題。生成子進程存在一些問題。n首先,首先,fork占用大量的資源,內(nèi)存映像要從父進程占用大量的資源,內(nèi)存映像要從父進程拷貝到子進程,所有描述符要在子進程中復(fù)制等??截惖阶舆M程,所有描述符要在子進程中復(fù)制等。雖然當前采用寫時拷貝(雖然當前采用寫時拷貝(copy-on-write)技術(shù),)技術(shù),將真
15、正的拷貝推遲到子進程有寫操作時,但將真正的拷貝推遲到子進程有寫操作時,但fork仍仍然需要占用大量資源。然需要占用大量資源。n其次,其次,fork子進程后,需要用進程間通信(子進程后,需要用進程間通信(IPC)在父子進程間傳遞信息。由于子進程從一開始就有在父子進程間傳遞信息。由于子進程從一開始就有父進程數(shù)據(jù)空間及所有描述符的拷貝,所以父進程數(shù)據(jù)空間及所有描述符的拷貝,所以fork之之前的信息容易傳遞,但是從子進程返回信息給父進前的信息容易傳遞,但是從子進程返回信息給父進程就需要做很多工作。程就需要做很多工作。 “線程線程”基本概念基本概念n線程是進程內(nèi)的獨立執(zhí)行實體和調(diào)度單元,又稱為線程是進程
16、內(nèi)的獨立執(zhí)行實體和調(diào)度單元,又稱為“輕量級輕量級”進程(進程(lightwight process);創(chuàng)建線程比進程快);創(chuàng)建線程比進程快10100倍。一個進程內(nèi)的所有線程共享相同的內(nèi)存空間、倍。一個進程內(nèi)的所有線程共享相同的內(nèi)存空間、全局變量等信息(這種機制又帶來了同步問題)。而且它們?nèi)肿兞康刃畔ⅲㄟ@種機制又帶來了同步問題)。而且它們還共享以下信息:還共享以下信息: 共享信息共享信息 私有信息私有信息n進程指令進程指令 線程線程IDn大多數(shù)數(shù)據(jù)大多數(shù)數(shù)據(jù) 寄存器集合(包括程序計數(shù)器和棧指針)寄存器集合(包括程序計數(shù)器和棧指針)n打開的文件描述字打開的文件描述字棧(用于存放局部變量)棧(用于
17、存放局部變量)n信號處理程序和信號處置信號處理程序和信號處置errorn當前工作目錄當前工作目錄信號掩碼信號掩碼n用戶用戶ID和組和組ID優(yōu)先級優(yōu)先級線程調(diào)用函數(shù)(1)#include int pthread_create(pthread_t *tid, const pthread_attr_t *attr, void *(*func)(void *), void *arg); 返回:成功時為返回:成功時為0;出錯時為正的;出錯時為正的Exxx值值n當一個程序開始運行時,系統(tǒng)會創(chuàng)建一個初始線程或主線程當一個程序開始運行時,系統(tǒng)會創(chuàng)建一個初始線程或主線程的單個線程。額外線程由上述函數(shù)創(chuàng)建;的單個
18、線程。額外線程由上述函數(shù)創(chuàng)建;n新線程由線程新線程由線程id標識:標識:tid,新線程的屬性,新線程的屬性attr包括:優(yōu)先級、包括:優(yōu)先級、初始棧大小、是否應(yīng)該是守護線程等等。線程的執(zhí)行函數(shù)和初始棧大小、是否應(yīng)該是守護線程等等。線程的執(zhí)行函數(shù)和調(diào)用參數(shù)分別是:調(diào)用參數(shù)分別是:func和和arg;n由于線程的執(zhí)行函數(shù)的參數(shù)和返回值類型均為由于線程的執(zhí)行函數(shù)的參數(shù)和返回值類型均為void *,因此,因此可傳遞和返回指向任何類型的指針;可傳遞和返回指向任何類型的指針;n常見的返回錯誤值:常見的返回錯誤值:EAGAIN:超過了系統(tǒng)線程數(shù)目的限制。:超過了系統(tǒng)線程數(shù)目的限制。ENOMEN:沒有足夠的內(nèi)
19、存產(chǎn)生新的線程。:沒有足夠的內(nèi)存產(chǎn)生新的線程。EINVAL:無效的屬性:無效的屬性attr值。值。線程函數(shù)調(diào)用(線程函數(shù)調(diào)用(2)#inlcude int pthread_join(pthread_t tid, void *status); 返回:成功時為返回:成功時為0;出錯時為正的;出錯時為正的Exxx值,不值,不設(shè)置設(shè)置errorn該函數(shù)類似與該函數(shù)類似與waitpid函數(shù),但必須指定等函數(shù),但必須指定等待線程的待線程的ID,該函數(shù)不能等待任意一個線程,該函數(shù)不能等待任意一個線程結(jié)束(如結(jié)束(如wait););n被等待線程必須是當前進程的成員,并且不被等待線程必須是當前進程的成員,并且不
20、是是分離的線程分離的線程和和守護線程守護線程。pthread_t pthread_self(void); 返回:調(diào)用線程的線程返回:調(diào)用線程的線程id;線程函數(shù)調(diào)用(3)#include int pthread_detach(pthread_t tid) 返回:成功時為返回:成功時為0;出錯時為正;出錯時為正Exxx值;值;n線程或者是可匯合的(線程或者是可匯合的(joinable)(默認),或者)(默認),或者是脫離的(是脫離的(detached)。當可匯合的線程終止時,)。當可匯合的線程終止時,其線程其線程id和退出狀態(tài)將保留,直到另外一個線程調(diào)用和退出狀態(tài)將保留,直到另外一個線程調(diào)用pt
21、hread_join。脫離的線程則像守護進程,當它終。脫離的線程則像守護進程,當它終止時,釋放所有資源,我們不能等待它終止。止時,釋放所有資源,我們不能等待它終止。n該函數(shù)將指定的線程變?yōu)槊撾x的。該函數(shù)將指定的線程變?yōu)槊撾x的。 pthread_detach(pthread_self()();線程函數(shù)調(diào)用(線程函數(shù)調(diào)用(4)#include void pthread_exit(void *status); 無返回值;無返回值;n如果線程為可匯合的,將保留線程如果線程為可匯合的,將保留線程id和退出狀態(tài)供和退出狀態(tài)供pthread_join()函數(shù)調(diào)用()函數(shù)調(diào)用;n指針指針status:指向線程
22、的退出狀態(tài)。不能指向一個局部:指向線程的退出狀態(tài)。不能指向一個局部變量,因為線程終止時其所有的局部變量將被撤銷;變量,因為線程終止時其所有的局部變量將被撤銷;n還有其他兩種方法可使線程終止還有其他兩種方法可使線程終止n啟動線程的函數(shù)(啟動線程的函數(shù)(pthread_create的第的第3個參數(shù))個參數(shù))返回。其返回值便是線程的終止狀態(tài);返回。其返回值便是線程的終止狀態(tài);n如果進程的如果進程的main函數(shù)返回,或者當前進程中,任一函數(shù)返回,或者當前進程中,任一線程調(diào)用了線程調(diào)用了exit()函數(shù),將終止該進程中所有線()函數(shù),將終止該進程中所有線程。程。給新線程傳遞參數(shù)n由于同一個進程內(nèi)的所有線
23、程共享內(nèi)存和變量,因此在傳遞參數(shù)時需作特殊處理,下面參考如下幾種方法:n傳遞參數(shù)的普通方法n通過指針傳遞參數(shù)n通過分配arg的空間來傳遞參數(shù)傳遞參數(shù)的普通方法n由于線程創(chuàng)建函數(shù)只允許傳遞一個參數(shù),因此當需要傳遞多個數(shù)據(jù)時,應(yīng)首先將這些數(shù)據(jù)由于線程創(chuàng)建函數(shù)只允許傳遞一個參數(shù),因此當需要傳遞多個數(shù)據(jù)時,應(yīng)首先將這些數(shù)據(jù)封裝在一個結(jié)構(gòu)中。封裝在一個結(jié)構(gòu)中。void *start_routine(void *arg);struct ARG int connfd;int other;int main() ARG arg;While(1) if(connfd = accept(sockfd,NULL,NU
24、LL)= -1) arg.connfd = connfd; pthread_create(&tid, NULL, start_routine, (void *)&arg); void *start_routine(void *arg) ARG info;info.connfd = (ARG *)arg) - connfd;info.other = (ARG *)arg) - other;/這種方法有問題,對一個客戶可以工作,但多個客戶則可能出現(xiàn)問題。這種方法有問題,對一個客戶可以工作,但多個客戶則可能出現(xiàn)問題。 通過指針傳遞參數(shù)n這種方法首先將要傳遞的數(shù)據(jù)轉(zhuǎn)換成通用指針類型,然
25、后傳遞給新線程,這種方法首先將要傳遞的數(shù)據(jù)轉(zhuǎn)換成通用指針類型,然后傳遞給新線程,新線程再將其還原成原數(shù)據(jù)類型:新線程再將其還原成原數(shù)據(jù)類型:void *start_routine(void *arg);int main(void) int connfd;pthread_create(&tid, NULL, start_routine, (void *)connfd);void *start_routine(void *arg) int connfd;connfd =(int ) arg;n這種方法雖然簡單,但卻有這種方法雖然簡單,但卻有。如:要求。如:要求arg的類型必須能的類型必須能
26、被正確地轉(zhuǎn)換成通用指針類型,而且可傳遞的參數(shù)只有一個。被正確地轉(zhuǎn)換成通用指針類型,而且可傳遞的參數(shù)只有一個。通過分配arg的空間來傳遞n主線程首先為每個新線程分配存儲主線程首先為每個新線程分配存儲arg的空間,再將的空間,再將arg傳遞給新線程傳遞給新線程使用,新線程使用完后要釋放該空間。使用,新線程使用完后要釋放該空間。void *start_routine(void *arg);int main(void) ARG * arg;int connfd; loop if(connfd = accept(sockfd,NULL,NULL)= -1) arg = new ARG;arg - con
27、nfd = connfd;pthread_create(&tid, NULL, start_routine, (void *)arg);線程安全問題n線程安全問題是一個非常復(fù)雜的問題。簡單地說,就是多個線程在操作共享數(shù)據(jù)時出現(xiàn)的混亂情況,這種情況可能導(dǎo)致不可預(yù)測的后果。n解決線程安全問題的方法主要有兩種:一是使用線程安全函數(shù):posix定義的以”_r”結(jié)尾的函數(shù),二是使用線程專用數(shù)據(jù)(TSD)。線程專用數(shù)據(jù):TSDn從上例可以看出,在多線程環(huán)境中,應(yīng)避免使用靜態(tài)變量。在linux環(huán)境中,用線程專用數(shù)據(jù)TSD取代靜態(tài)變量。它類似于全局數(shù)據(jù),只不過它是線程私有的,是以線程為界限的。TSD是
28、定義線程私有全局數(shù)據(jù)的唯一方法。n每個TSD由進程內(nèi)唯一的關(guān)鍵字(key)來標志,用這個關(guān)鍵字,線程可以存取線程私有的數(shù)據(jù)。pthread_key_create函數(shù)#include int pthread_key_create(pthread_key_t *key, void (* destructor)(void *value); 返回值:正常執(zhí)行后返回返回值:正常執(zhí)行后返回0,否則返回錯誤碼,否則返回錯誤碼n該函數(shù)在進程內(nèi)部分配一個標志該函數(shù)在進程內(nèi)部分配一個標志TSD的關(guān)鍵字,關(guān)的關(guān)鍵字,關(guān)鍵字是進程內(nèi)部唯一的,所有線程在創(chuàng)建時關(guān)鍵字鍵字是進程內(nèi)部唯一的,所有線程在創(chuàng)建時關(guān)鍵字值是值是NULL。nkey指向創(chuàng)建的關(guān)鍵字;指向創(chuàng)建的關(guān)鍵字;destructor是一個可選的是一個可選的析構(gòu)函數(shù),用于析構(gòu)函數(shù),用于每個每個線程終止線程終止時調(diào)用該析
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 醫(yī)用器具清洗與消毒效果評估考核試卷
- 無錫城市職業(yè)技術(shù)學院《資源環(huán)境生物技術(shù)》2023-2024學年第二學期期末試卷
- 廈門南洋職業(yè)學院《鋼結(jié)構(gòu)原理與設(shè)計》2023-2024學年第一學期期末試卷
- 江西楓林涉外經(jīng)貿(mào)職業(yè)學院《三位角色綁定及動畫》2023-2024學年第二學期期末試卷
- 寧安市2024-2025學年六年級下學期小升初數(shù)學考前押題卷含解析
- 上海市普陀區(qū)2025屆數(shù)學五年級第二學期期末聯(lián)考試題含答案
- 遼寧省阜蒙縣第二高級中學2025屆高三第六次月考試卷(生物試題理)試題含解析
- 山西工程職業(yè)學院《生物學導(dǎo)論》2023-2024學年第二學期期末試卷
- 呂梁職業(yè)技術(shù)學院《醫(yī)用物理》2023-2024學年第二學期期末試卷
- 嘉峪關(guān)市重點中學2025屆高考5月模擬物理試題含解析
- 中國與俄羅斯?jié)O業(yè)合作的潛力分析
- 公司鑰匙移交單
- 2023年廣東省高中學生化學競賽試題與標準答案正式題(word可編輯版)
- 五年級心理健康教育課件-欣賞自己 全國通用(共19張PPT)
- JJF1637-2017 廉金屬熱電偶校準規(guī)范-(高清現(xiàn)行)
- 汽車輪胎教案
- 公司應(yīng)急組織體系
- 局部解剖學:第八章 血 管
- 電子政務(wù)與電子商務(wù)的關(guān)系探討
- 廚師菜品考核評分表201921
- 人工濕地設(shè)計方案綜述
評論
0/150
提交評論