版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、7.1 I/O復(fù)用概述7.2 五種I/O模型7.3 select系統(tǒng)調(diào)用7.4 poll系統(tǒng)調(diào)用7.5 epoll系統(tǒng)調(diào)用7.6 三種系統(tǒng)調(diào)用對(duì)比例子: read標(biāo)準(zhǔn)輸入和套接字只能阻塞在一處,不能及時(shí)獲得I/O就緒條件進(jìn)程需要一種同時(shí)能監(jiān)測(cè)多個(gè)描述符狀態(tài)的服務(wù)。即進(jìn)程需要一種預(yù)先告知內(nèi)核的能力,使得內(nèi)核一旦發(fā)現(xiàn)進(jìn)程指定的一個(gè)或多個(gè)I/O條件就緒,它就通知進(jìn)程,這種能力稱(chēng)為I/O復(fù)用(I/O multiplexing)I/O復(fù)用使得系統(tǒng)在單線程的情況下同時(shí)支持處理多個(gè)請(qǐng)求。和多線程/進(jìn)程比較,I/O復(fù)用的最大優(yōu)勢(shì)是系統(tǒng)開(kāi)銷(xiāo)小,系統(tǒng)不需要建立新的進(jìn)程或者線程,也不必維護(hù)這些線程和進(jìn)程。IO復(fù)用常
2、見(jiàn)的應(yīng)用場(chǎng)景: 客戶(hù)程序需要同時(shí)處理交互式的輸入和服務(wù)器之間的網(wǎng)絡(luò)連接; 客戶(hù)端需要對(duì)多個(gè)網(wǎng)絡(luò)連接作出反應(yīng); 服務(wù)器需要同時(shí)處理多個(gè)處于監(jiān)聽(tīng)狀態(tài)和多個(gè)連接狀態(tài)的套接字; 服務(wù)器既要處理TCP,又要處理UDP; 服務(wù)器需要處理多種網(wǎng)絡(luò)協(xié)議的套接字。IO復(fù)用的基本思想: 先構(gòu)造一張或多張包含所有需要等待的描述符的表,然后調(diào)用一個(gè)函數(shù),它要到這些描述符中的一個(gè)或多個(gè)已準(zhǔn)備好進(jìn)行I/O時(shí)才返回。在返回時(shí),它告訴進(jìn)程哪一個(gè)描述符已準(zhǔn)備好可以進(jìn)行I/O。7.2.1 阻塞IO模型7.2.2 非阻塞IO模型7.2.3 IO復(fù)用7.2.4 信號(hào)驅(qū)動(dòng)IO模型7.2.5 異步IO模型阻塞IO是最通用的IO類(lèi)型,使用
3、這種模型進(jìn)行數(shù)據(jù)接收的時(shí)候,在數(shù)據(jù)沒(méi)有到之前程序會(huì)一直等待。例如對(duì)于函數(shù)recvfrom(),內(nèi)核會(huì)一直阻塞該請(qǐng)求直到有數(shù)據(jù)到來(lái)才返回。accept、send、recv、connect可能被阻塞進(jìn)程阻塞于recvfrom的調(diào)用recvfrom應(yīng)用進(jìn)程應(yīng)用進(jìn)程內(nèi)核內(nèi)核無(wú)數(shù)據(jù)報(bào)準(zhǔn)備好系統(tǒng)調(diào)用處理數(shù)據(jù)報(bào)拷貝完成系統(tǒng)調(diào)用數(shù)據(jù)報(bào)準(zhǔn)備好拷貝數(shù)據(jù)報(bào)等待數(shù)據(jù)將數(shù)據(jù)從內(nèi)核拷貝到用戶(hù)空間當(dāng)把套接字設(shè)置成非阻塞的IO,則對(duì)每次請(qǐng)求,內(nèi)核都不會(huì)阻塞,會(huì)立即返回;當(dāng)沒(méi)有數(shù)據(jù)的時(shí)候,會(huì)返回一個(gè)錯(cuò)誤。例如對(duì)recvfrom()函數(shù),前幾次都沒(méi)有數(shù)據(jù)返回,直到最后內(nèi)核才向用戶(hù)層的空間復(fù)制數(shù)據(jù)。非阻塞IO通常和其它的IO通知機(jī)
4、制一起使用。進(jìn)程阻塞于recvfrom的調(diào)用recvfrom應(yīng)用進(jìn)程應(yīng)用進(jìn)程內(nèi)核內(nèi)核無(wú)數(shù)據(jù)報(bào)準(zhǔn)備好系統(tǒng)調(diào)用處理數(shù)據(jù)報(bào)拷貝完成系統(tǒng)調(diào)用數(shù)據(jù)報(bào)準(zhǔn)備好拷貝數(shù)據(jù)報(bào)等待數(shù)據(jù)將數(shù)據(jù)從內(nèi)核拷貝到用戶(hù)空間EWOULDBLOCKrecvfrom無(wú)數(shù)據(jù)報(bào)準(zhǔn)備好系統(tǒng)調(diào)用EWOULDBLOCKrecvfrom系統(tǒng)調(diào)用fcntl(s, F_SETFL, O_NONBLOCK);linux提供select/poll,進(jìn)程通過(guò)將一個(gè)或多個(gè)fd傳遞給select或poll系統(tǒng)調(diào)用,阻塞在select或poll而不是真正的IO調(diào)用上;這樣select/poll可以幫我們偵測(cè)許多fd是否就緒。數(shù)據(jù)拷貝到應(yīng)用緩沖區(qū)期間,進(jìn)程阻塞s
5、elect應(yīng)用進(jìn)程應(yīng)用進(jìn)程內(nèi)核內(nèi)核無(wú)數(shù)據(jù)報(bào)準(zhǔn)備好系統(tǒng)調(diào)用處理數(shù)據(jù)報(bào)拷貝完成系統(tǒng)調(diào)用數(shù)據(jù)報(bào)準(zhǔn)備好拷貝數(shù)據(jù)報(bào)等待數(shù)據(jù)進(jìn)程阻塞于select系統(tǒng)調(diào)用,等待可能多個(gè)套接字中的任一個(gè)變?yōu)榭勺x或可寫(xiě)返回可讀條件recvfrom系統(tǒng)調(diào)用將數(shù)據(jù)從內(nèi)核拷貝到用戶(hù)空間首先開(kāi)啟套接口信號(hào)驅(qū)動(dòng)I/O功能, 并通過(guò)系統(tǒng)調(diào)用sigaction安裝一個(gè)信號(hào)處理函數(shù)(此系統(tǒng)調(diào)用立即返回,進(jìn)程繼續(xù)工作,它是非阻塞的)。當(dāng)數(shù)據(jù)報(bào)準(zhǔn)備好被讀時(shí),就為該進(jìn)程生成一個(gè) SIGIO信號(hào)。隨即可以在信號(hào)處理程序中調(diào)用recvfrom來(lái)讀數(shù)據(jù)報(bào)。應(yīng)用進(jìn)程應(yīng)用進(jìn)程內(nèi)核內(nèi)核將數(shù)據(jù)從內(nèi)核拷貝到用戶(hù)空間告知內(nèi)核啟動(dòng)某個(gè)操作,并讓內(nèi)核在整個(gè)操作完成后(
6、包括將數(shù)據(jù)從內(nèi)核拷貝到用戶(hù)自己的緩沖區(qū))通知應(yīng)用。與信號(hào)驅(qū)動(dòng)模型的主要區(qū)別是:信號(hào)驅(qū)動(dòng)I/O:由內(nèi)核通知應(yīng)用何時(shí)可以啟動(dòng)一個(gè)I/O操作;異步I/O模型:由內(nèi)核通知應(yīng)用I/O操作何時(shí)完成。進(jìn)程繼續(xù)執(zhí)行aio_read應(yīng)用進(jìn)程應(yīng)用進(jìn)程內(nèi)核內(nèi)核無(wú)數(shù)據(jù)報(bào)準(zhǔn)備好系統(tǒng)調(diào)用信號(hào)處理程序處理數(shù)據(jù)報(bào)拷貝完成遞交在aio_read中指定的信號(hào)數(shù)據(jù)報(bào)準(zhǔn)備好拷貝數(shù)據(jù)報(bào)等待數(shù)據(jù)將數(shù)據(jù)從內(nèi)核拷貝到用戶(hù)空間返回阻塞式I/O、非阻塞式I/O、 I/O復(fù)用、信號(hào)驅(qū)動(dòng)式I/O在數(shù)據(jù)從內(nèi)核復(fù)制到調(diào)用者的緩沖區(qū)期間,進(jìn)程阻塞于recvfrom調(diào)用,這四種都是同步I/O模型阻塞i/o非阻塞i/oi/o復(fù)用信號(hào)驅(qū)動(dòng)i/o異步i/o發(fā)起
7、阻 塞完成檢查檢查檢查檢查檢查檢查 阻 塞完成檢查 阻 塞就緒發(fā)起 阻 塞完成通知發(fā)起 阻 塞完成發(fā)起完成等待數(shù)據(jù)將數(shù)據(jù)從內(nèi)核拷貝到用戶(hù)空間函數(shù)select()的原型如下:#include #include #include #include int select(int nfds, fd_set*readfds, fd_set*writefds, fd_set*exceptfds, struct timeval*timeout);返回:準(zhǔn)備好描述字的總數(shù)量,0:超時(shí),-1:出錯(cuò),大于0:總的位數(shù)int select(int nfds, fd_set*readfds, fd_set*write
8、fds, fd_set*exceptfds, struct timeval*timeout);參數(shù)timeout指定內(nèi)核等待的時(shí)間,其結(jié)構(gòu)如下:struct timeval long tv_sec;/* seconds */longtv_usec; /* microseconds */ 結(jié)構(gòu)timeval指定了秒數(shù)和微秒數(shù)。但內(nèi)核支持的分辨率卻要粗糙得多,因此,定時(shí)并不精確。另外,如果select的三個(gè)測(cè)試指針為空,將提供一個(gè)比函數(shù)sleep更為精確的定時(shí)器(sleep睡眠以秒為最小單位)。根據(jù)timeout的設(shè)置select函數(shù)有三種執(zhí)行結(jié)果: 永遠(yuǎn)等待下去:僅在有一個(gè)或以上描述字準(zhǔn)備好i/
9、o才返回,為此,我們將timeout設(shè)置為空指針。 等待固定時(shí)間:在有一個(gè)描述字準(zhǔn)備好時(shí)返回,但不超過(guò)由timeout參數(shù)指定的秒數(shù)和微秒數(shù)。 根本不等待,檢查描述字后立即返回,這稱(chēng)為輪詢(xún)。這種情況下,timeout必須指向結(jié)構(gòu)timeval,且定時(shí)器的值必須為0。在前兩種情況的等待中,如果進(jìn)程捕獲了一個(gè)信號(hào)并從信號(hào)處理程序返回,那么等待一般被中斷。int select(int nfds, fd_set*readfds, fd_set*writefds, fd_set*exceptfds, struct timeval*timeout);select的三個(gè)描述字集合分別指示不同測(cè)試類(lèi)型的描述字
10、集合(讀、寫(xiě)、異常描述字),如當(dāng)select函數(shù)返回時(shí),readfds將清除其中不可讀的文件描述符,只留下可讀的文件描述符。對(duì)描述字集合的操作主要有以下四個(gè)宏:void FD_ZERO(fd_set *fdset);/* clear all bits in fdset ,清除*/void FD_SET(int fd, fd_set *fdset); /* turn on the bit for fd in fdset ,加入*/void FD_CLR(int fd, fd_set *fdset); /* turn off the bit for fd in fdset ,取出*/int FD_
11、ISSET(int fd, fd_set *fdset); /* is the bit for fd on in fdset ,測(cè)試*/,int select(int nfds, fd_set*readfds, fd_set*writefds, fd_set*exceptfds, struct timeval*timeout);使用select函數(shù)需重點(diǎn)注意的幾個(gè)問(wèn)題: nfds比所有文件描述符集合中的最大描述字大1,如:需等待的描述字為1,4,5,其nfds就應(yīng)該是6。 對(duì)集合初始化是很重要的,如果集合作為一個(gè)自動(dòng)變量分配而未初始化,那將導(dǎo)致不可預(yù)測(cè)的后果。每次每次調(diào)用select前都必須對(duì)
12、等待描述字集合完成初始化和設(shè)置工作。套接字可讀的條件主要有: 套接字接收緩沖區(qū)中的數(shù)據(jù)字節(jié)數(shù)大于等于套接字接收緩沖區(qū)低水平標(biāo)記的當(dāng)前值(有數(shù)據(jù)可讀); 套接字是一個(gè)監(jiān)聽(tīng)套接字且已完成的連接數(shù)為非0。 如果對(duì)方tcp發(fā)送一個(gè)FIN(對(duì)方進(jìn)程終止),套接字就變?yōu)榭勺x且read返回0; 有一個(gè)套接字錯(cuò)誤待處理,讀操作返回-1,同時(shí)設(shè)置errno。接收和發(fā)送低水平標(biāo)記的目的是:在select返回可讀或可寫(xiě)條件之前,應(yīng)用進(jìn)程可以對(duì)有多少數(shù)據(jù)可讀或有多大空間可寫(xiě)進(jìn)行控制。套接字可寫(xiě)的條件主要有: 套接字發(fā)送緩沖區(qū)的可用空間大于等于套接字發(fā)送緩沖區(qū)的低水平標(biāo)記(有可用于寫(xiě)的空間); 套接字的寫(xiě)這一半關(guān)閉,對(duì)
13、套接字的寫(xiě)將產(chǎn)生SIGPIPE信號(hào); 有一個(gè)套接字錯(cuò)誤待處理套接字的異常條件: 套接字帶外數(shù)據(jù)的到達(dá);Select()函數(shù)實(shí)現(xiàn)I/O多路復(fù)用的步驟: 清空描述符集合; 建立需要監(jiān)視的描述符與描述符集合的聯(lián)系; 調(diào)用select()函數(shù); 檢查所有需要監(jiān)視的描述符,利用FD_ISSET宏判斷是否已準(zhǔn)備好; 對(duì)已準(zhǔn)備好的描述符進(jìn)行I/O操作。函數(shù)select()監(jiān)視標(biāo)準(zhǔn)輸入是否有數(shù)據(jù)輸入,所設(shè)置的超時(shí)時(shí)間為5s。如果select()函數(shù)出錯(cuò),則打印出錯(cuò)信息;如果標(biāo)準(zhǔn)輸入有數(shù)據(jù)輸入,則打印輸入信息;如果等待超時(shí),則打印超時(shí)信息。基于select的單進(jìn)程多并發(fā)服務(wù)器程序服務(wù)器allset,關(guān)注的描述符
14、集合rset,提交給select的描述符集合select更新allset客戶(hù)端客戶(hù)端Client數(shù)組select監(jiān)聽(tīng)套接字可讀否?Accept將連接套接字置入allset和client中還有套接字可讀否檢查其它的連接套接字客戶(hù)終止處理客戶(hù)還有套接字可讀否清理客戶(hù)是是是否否否是否阻塞Poll系統(tǒng)調(diào)用和select類(lèi)似,也是在指定時(shí)間內(nèi)輪詢(xún)一定數(shù)量的文件描述符,以測(cè)試其中是否有就緒者。其原型如下:#include int poll(struct pollfd*fds, nfds_t nfds, int timeout);1)fds參數(shù)是一個(gè)pollfd結(jié)構(gòu)類(lèi)型的數(shù)組,它指定所有我們感興趣的文件描述
15、符上發(fā)生的可讀、可寫(xiě)和異常等事件。Pollfd結(jié)構(gòu)體定義如下: struct pollfd int fd; /文件描述符 short events; /注冊(cè)的事件 short reevents;/實(shí)際發(fā)生的事件,由內(nèi)核填充 事件說(shuō)明POLLIN普通或優(yōu)先級(jí)帶數(shù)據(jù)可讀POLLRDNORM普通數(shù)據(jù)可讀POLLRDBAND優(yōu)先級(jí)帶數(shù)據(jù)可讀POLLPRI高優(yōu)先級(jí)數(shù)據(jù)可讀POLLOUT普通數(shù)據(jù)可寫(xiě)POLLWRNORM普通數(shù)據(jù)可寫(xiě)POLLWRBAND優(yōu)先級(jí)帶數(shù)據(jù)可寫(xiě)POLLERR發(fā)生錯(cuò)誤POLLHUP發(fā)生掛起POLLNVAL描述字不是一個(gè)打開(kāi)的文件Poll事件類(lèi)型:#include int poll(st
16、ruct pollfd*fds, nfds_t nfds, int timeout);2)nfds參數(shù)指定被監(jiān)聽(tīng)fds集合的大小3)timeout參數(shù)指定poll的超時(shí)值,單位是毫秒,當(dāng)timeout為-1時(shí),poll調(diào)用將永遠(yuǎn)阻塞,直到某個(gè)事件發(fā)生,當(dāng)timeout為0時(shí),poll調(diào)用將立即返回。Poll系統(tǒng)調(diào)用的返回值的含義與select相同。例程:阻塞例程:判斷第i個(gè)描述符是否就緒epoll是Linux特有的I/O復(fù)用函數(shù),它在實(shí)現(xiàn)和使用上與select、poll有很大差異:準(zhǔn)備FDSelect/poll 模式epoll是Linux特有的I/O復(fù)用函數(shù),它在實(shí)現(xiàn)和使用上與select、p
17、oll有很大差異:epoll 模式epoll_createEpoll_waitprocess差異: epoll使用一組函數(shù)來(lái)完成任務(wù),而不是單個(gè)函數(shù); epoll把用戶(hù)關(guān)心的文件描述符上的事件放在內(nèi)核里的一個(gè)事件表中,從而無(wú)須像select和poll那樣每次調(diào)用都要重復(fù)傳入文件描述符集或事件集。但epoll需要使用一個(gè)額外的文件描述符,來(lái)唯一標(biāo)識(shí)內(nèi)核中的這個(gè)事件表。這個(gè)文件描述符使用epoll_create函數(shù)來(lái)創(chuàng)建: 函數(shù)聲明:intint epoll_createepoll_create( (intint size) ) 該函數(shù)生成一個(gè)epoll專(zhuān)用的文件描述符,其中的參數(shù)是指定生成描述符
18、的最大范圍 差異: epoll使用一組函數(shù)來(lái)完成任務(wù),而不是單個(gè)函數(shù); epoll把用戶(hù)關(guān)心的文件描述符上的事件放在內(nèi)核里的一個(gè)事件表中,從而無(wú)須像select和poll那樣每次調(diào)用都要重復(fù)傳入文件描述符集或事件集。但epoll需要使用一個(gè)額外的文件描述符,來(lái)唯一標(biāo)識(shí)內(nèi)核中的這個(gè)事件表。這個(gè)文件描述符使用epoll_create函數(shù)來(lái)創(chuàng)建: 函數(shù)聲明:intint epoll_createepoll_create( (intint size) ) 該函數(shù)生成一個(gè)epoll專(zhuān)用的文件描述符,其中的參數(shù)是指定生成描述符的最大范圍 ,返回的文件描述符將用作其它所有epoll系統(tǒng)調(diào)用的第一個(gè)參數(shù),以指
19、定要訪問(wèn)的內(nèi)核事件表。函數(shù)聲明:intint epoll_ctlepoll_ctl( (intint epfd, , intint op, , intint fd, , structstruct epoll_eventepoll_event * *event) )該函數(shù)用于控制某個(gè)文件描述符上的事件,可以注冊(cè)事件,修改事件,刪除事件。參數(shù):epfd:由 epoll_createepoll_create 生成的epoll專(zhuān)用的文件描述符;op:要進(jìn)行的操作例如注冊(cè)事件,可能的取值:EPOLL_CTL_ADDEPOLL_CTL_ADD 注冊(cè)、EPOLL_CTL_MODEPOLL_CTL_MOD 修
20、改、EPOLL_CTL_DELEPOLL_CTL_DEL 刪除fd:關(guān)聯(lián)的文件描述符;event:指向epoll_event結(jié)構(gòu)體的指針: struct epoll_event _uint32_t events;/epoll事件epoll_data_t data;/用戶(hù)數(shù)據(jù)如果調(diào)用成功返回0,不成功返回-1typedef union epoll_datavoid * ptr;int fd;uint32_ t u32;uint64_t u64;epoll_data_teventsevents字段字段 EPOLLINEPOLLIN :表示對(duì)應(yīng)的文件描述符可以讀 EPOLLOUT EPOLLOUT:
21、表示對(duì)應(yīng)的文件描述符可以寫(xiě) EPOLLPRI EPOLLPRI:表示對(duì)應(yīng)的文件描述符有緊急的數(shù)據(jù)可讀 EPOLLERR EPOLLERR:表示對(duì)應(yīng)的文件描述符發(fā)生錯(cuò)誤 EPOLLHUP EPOLLHUP:表示對(duì)應(yīng)的文件描述符被掛斷 EPOLLET EPOLLET:表示對(duì)應(yīng)的文件描述符有事件發(fā)生epoll_dataepoll_data 字段字段 epoll_data是個(gè)聯(lián)合體,其4個(gè)成員中使用最多的是fd,它指定事件所從屬的目標(biāo)文件描述符。函數(shù)聲明:intint epoll_waitepoll_wait( (intint epfd,structstruct epoll_eventepoll_ev
22、ent * * events,intint maxevents, intint timeout)該函數(shù)如果檢測(cè)到事件,就將所有就緒的事件從內(nèi)核事件表復(fù)制到它的第二個(gè)參數(shù)events指向的數(shù)組中;參數(shù):epfd:由epoll_createepoll_create 生成的epoll專(zhuān)用的文件描述符;epoll_event:用于回傳待處理事件的數(shù)組;maxevents:每次能處理的事件數(shù);timeout:等待I/O事件發(fā)生的超時(shí)值;返回發(fā)生事件數(shù)。 epollepoll的一般框架的一般框架局部的調(diào)整內(nèi)核事件表FD_SET(socketfd,&rfds);FD_SET(socketfd,&am
23、p;wfds);epoll_ctl(epollfd,EPOLL_CTL_ADD,newSocket,&ev)select(maxfd+1,&rfds,NULL,NULL,&timeout)epoll_wait(epollfd,events,MaxfdNum,timeout)FD_ISSET(socket,rfds)FD_ISSET(socket,wfds)if(eventsi-events&EPOLLOUT)遍歷所有描述符只輸出就緒事件epoll最擅長(zhǎng)的事情是監(jiān)視大量閑散連接,批量返回可用描述符LT和ET模式 EPOLL事件觸發(fā)有兩種模型:EdgeTriggered(ET,邊緣觸發(fā))和LevelTriggered(LT,電平觸發(fā))。 LT是默認(rèn)的工作模式,當(dāng)epoll_wait檢測(cè)到其上有事件發(fā)生并將此事件通知應(yīng)用程序后,應(yīng)用程序可以不立即處理該事件,這樣,當(dāng)應(yīng)用程序下一次調(diào)用epoll_wait時(shí),epoll_wai
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 廣東理工學(xué)院《蔬菜栽培學(xué)總論》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東科技學(xué)院《珠寶玉石概論》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東江門(mén)幼兒師范高等專(zhuān)科學(xué)?!吨兴幏治觥?023-2024學(xué)年第一學(xué)期期末試卷
- 廣東工業(yè)大學(xué)《現(xiàn)代儀器分析技術(shù)》2023-2024學(xué)年第一學(xué)期期末試卷
- 《吉蘭巴雷的護(hù)理》課件
- 課間安全教學(xué)課件
- 廣安職業(yè)技術(shù)學(xué)院《民法婚姻家庭與繼承編》2023-2024學(xué)年第一學(xué)期期末試卷
- 共青科技職業(yè)學(xué)院《報(bào)關(guān)實(shí)訓(xùn)》2023-2024學(xué)年第一學(xué)期期末試卷
- 贛州職業(yè)技術(shù)學(xué)院《技術(shù)軟件應(yīng)用》2023-2024學(xué)年第一學(xué)期期末試卷
- 贛南醫(yī)學(xué)院《通風(fēng)工程課程設(shè)計(jì)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2023年外交學(xué)院招聘筆試備考試題及答案解析
- 深基坑事故案例
- 中國(guó)茶文化(中文版)
- 02J401鋼梯安裝圖集
- 川省成都市2022屆高二上學(xué)期期末考試:英語(yǔ)
- 胸痛診治及轉(zhuǎn)診流程
- 人教版小學(xué)三年級(jí)語(yǔ)文上冊(cè)第三單元集體備課活動(dòng)記錄
- 消防安全操作規(guī)程
- 水利水電工程危險(xiǎn)源辨識(shí)與風(fēng)險(xiǎn)評(píng)價(jià)一覽表
- 重慶市綦江區(qū)石壕鎮(zhèn)石泉村建筑石料用灰?guī)r采礦點(diǎn)采礦權(quán)評(píng)估報(bào)告
- (完整版)成人學(xué)士學(xué)位英語(yǔ)考試歷年真題
評(píng)論
0/150
提交評(píng)論