




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、IO多路復(fù)用學(xué)習總結(jié)學(xué)生姓名: 李向勇 指導(dǎo)教師: 喬永鋒 完成時間:2022年3月8日IO多路復(fù)用學(xué)習總結(jié)3一基本概念3二IO多路復(fù)用的函數(shù)31. select()32. poll()63. epoll()8三總結(jié)區(qū)別11IO多路復(fù)用學(xué)習總結(jié)一基本概念I(lǐng)O多路復(fù)用是指內(nèi)核一旦發(fā)現(xiàn)進程指定的一個或者多個IO條件準備讀取,它就通知該進程。IO多路復(fù)用適用如下場合:l 當客戶處理多個描述字時(一般是交互式輸入和網(wǎng)絡(luò)套接口),必須使用I/O復(fù)用。l 當一個客戶同時處理多個套接口時。l 如果一個TCP服務(wù)器既要處理監(jiān)聽套接口,又要處理已連接套接口,一般也要用到I/O復(fù)用。l 如果一個服務(wù)器即要處理TC
2、P,又要處理UDP,一般要使用I/O復(fù)用。l 如果一個服務(wù)器要處理多個服務(wù)或多個協(xié)議,一般要使用I/O復(fù)用。與多進程和多線程技術(shù)相比,I/O多路復(fù)用技術(shù)的最大優(yōu)勢是系統(tǒng)開銷小,系統(tǒng)不必創(chuàng)建進程/線程,也不必維護這些進程/線程,從而大大減小了系統(tǒng)的開銷。二IO多路復(fù)用的函數(shù)1. select()select函數(shù)準許進程指示內(nèi)核等待多個事件中的任何一個發(fā)送,并只在有一個或多個事件發(fā)生或經(jīng)歷一段指定的時間后才喚醒。函數(shù)原型如下:#include <sys/select.h>#include <sys/time.h>int select(int maxfdp1,fd_set *
3、readset,fd_set *writeset,fd_set *exceptset,const struct timeval *timeout)返回值:就緒描述符的數(shù)目,超時返回0,出錯返回-1函數(shù)參數(shù)介紹如下:1) 第一個參數(shù)maxfdp1指定待測試的描述字個數(shù),它的值是待測試的最大描述字加1(因此把該參數(shù)命名為maxfdp1),描述字0、1、2.maxfdp1-1均將被測試。2) 中間的三個參數(shù)readset、writeset和exceptset指定我們要讓內(nèi)核測試讀、寫和異常條件的描述字。如果對某一個的條件不感興趣,就可以把它設(shè)為空指針。struct fd_set可以理解為一個集合,這
4、個集合中存放的是文件描述符,可通過以下四個宏進行設(shè)置: void FD_ZERO(fd_set *fdset); /清空集合 void FD_SET(int fd, fd_set *fdset); /將一個給定的文件描述符加入集合之中
5、60; void FD_CLR(int fd, fd_set *fdset); /將一個給定的文件描述符從集合中刪除 int FD_ISSET(int fd, fd_set *fdset); / 檢查集合中指定的文件描述符是否可以讀寫 3) timeout告知內(nèi)核等待所指定描述字中的任何一個就緒可花多少時間。其timeval結(jié)構(gòu)用于指定這段時間的秒數(shù)和微秒數(shù)。 &
6、#160; struct timeval long tv_sec; /seconds long tv_usec; /microsec
7、onds ;這個參數(shù)有三種可能:(1)永遠等待下去:僅在有一個描述字準備好I/O時才返回。為此,把該參數(shù)設(shè)置為空指針NULL。(2)等待一段固定時間:在有一個描述字準備好I/O時返回,但是不超過由該參數(shù)所指向的timeval結(jié)構(gòu)中指定的秒數(shù)和微秒數(shù)。(3)根本不等待:檢查描述字后立即返回,這稱為輪詢。為此,該參數(shù)必須指向一個timeval結(jié)構(gòu),而且其中的定時器值必須為0?;驹恚簣D一select的幾大缺點:(1)每次調(diào)用select,都需要把fd集合從用戶態(tài)拷貝到內(nèi)核態(tài),這個開銷在fd很多時會很大(2)同時每次調(diào)用sel
8、ect都需要在內(nèi)核遍歷傳遞進來的所有fd,這個開銷在fd很多時也很大(3)select支持的文件描述符數(shù)量太小了,默認是10242. poll()poll()函數(shù):這個函數(shù)是用于執(zhí)行與select()函數(shù)同等功能的函數(shù)。函數(shù)原型如下:#include <poll.h>int poll(struct pollfd fds, nfds_t nfds, int timeout);pollfd結(jié)構(gòu)體定義如下:struct pollfd int fd; /*
9、 文件描述符 */short events; /* 等待的事件 */short revents; /* 實際發(fā)生了的事件 */ 每一個pollfd結(jié)構(gòu)體指定了一個被監(jiān)視的文件描述符,可以傳遞多個結(jié)構(gòu)體,指示poll()監(jiān)視多個文件描述符。每個結(jié)構(gòu)體的events域是監(jiān)視該文件描述符的事件掩碼,由用戶來設(shè)置這個
10、域。revents域是文件描述符的操作結(jié)果事件掩碼,內(nèi)核在調(diào)用返回時設(shè)置這個域。events域中請求的任何事件都可能在revents域中返回。合法的事件如下:POLLIN 有數(shù)據(jù)可讀。POLLRDNORM 有普通數(shù)據(jù)可讀。POLLRDBAND 有優(yōu)先數(shù)據(jù)可讀。POLLPRI 有緊迫數(shù)據(jù)可讀。POLLOUT 寫數(shù)據(jù)不會導(dǎo)致阻塞。POLLWRNORM 寫普通數(shù)據(jù)不會導(dǎo)致阻塞。POLLWRBAND 寫優(yōu)先數(shù)據(jù)不會導(dǎo)致阻塞。POLLMSGSIGPOLL 消
11、息可用。此外,revents域中還可能返回下列事件:POLLER 指定的文件描述符發(fā)生錯誤。POLLHUP 指定的文件描述符掛起事件。POLLNVAL指定的文件描述符非法。參數(shù)說明:fds:是一個struct pollfd結(jié)構(gòu)類型的數(shù)組,用于存放需要檢測其狀態(tài)的Socket描述符;每當調(diào)用這個函數(shù)之后,系統(tǒng)不會清空這個數(shù)組,操作起來比較方便;特別是對于socket連接比較多的情況下,在一定程度上可以提高處理的效率;這一點與select()函數(shù)不同,調(diào)用select()函數(shù)之后,select()函數(shù)會清空它所檢測的socket描述符集合,導(dǎo)致每次調(diào)用select
12、()之前都必須把socket描述符重新加入到待檢測的集合中;因此,select()函數(shù)適合于只檢測一個socket描述符的情況,而poll()函數(shù)適合于大量socket描述符的情況;nfds:nfds_t類型的參數(shù),用于標記數(shù)組fds中的結(jié)構(gòu)體元素的總數(shù)量;timeout:是poll函數(shù)調(diào)用阻塞的時間,單位:毫秒;返回值:>0:數(shù)組fds中準備好讀、寫或出錯狀態(tài)的那些socket描述符的總數(shù)量;=0:數(shù)組fds中沒有任何socket描述符準備好讀、寫,或出錯;此時poll超時,超時時間是timeout毫秒;換句話說,如果所檢測的socket描述符上沒有任何事件發(fā)生的話,那么poll()函
13、數(shù)會阻塞timeout所指定的毫秒時間長度之后返回,如果timeout=0,那么poll() 函數(shù)立即返回而不阻塞,如果timeout=INFTIM,那么poll() 函數(shù)會一直阻塞下去,直到所檢測的socket描述符上的感興趣的事件發(fā)生是才返回,如果感興趣的事件永遠不發(fā)生,那么poll()就會永遠阻塞下去;-1: poll函數(shù)調(diào)用失敗,同時會自動設(shè)置全局變量errno;如果待檢測的socket描述符為負值,則對這個描述符的檢測就會被忽略,也就是不會對成員變量events進行檢測,在events上注冊的事件也會被忽略,poll()函數(shù)返回的時候,會把成員變量revents
14、設(shè)置為0,表示沒有事件發(fā)生;另外,poll() 函數(shù)不會受到socket描述符上的O_NDELAY標記和O_NONBLOCK標記的影響和制約,也就是說,不管socket是阻塞的還是非阻塞的,poll()函數(shù)都不會收到影響;而select()函數(shù)則不同,select()函數(shù)會受到O_NDELAY標記和O_NONBLOCK標記的影響,如果socket是阻塞的socket,則調(diào)用select()跟不調(diào)用select()時的效果是一樣的,socket仍然是阻塞式TCP通訊,相反,如果socket是非阻塞的socket,那么調(diào)用select()時就可以實現(xiàn)非阻塞式TCP通訊;3. epoll()epol
15、l使用一個文件描述符管理多個描述符,將用戶關(guān)系的文件描述符的事件存放到內(nèi)核的一個事件表中,這樣在用戶空間和內(nèi)核空間的copy只需一次。epoll操作過程需要三個接口,分別如下:#include <sys/epoll.h>int epoll_create(int size);int epoll_ctl(int epfd, int op, int fd, struct epoll_event * event);int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);1) int
16、epoll_create(int size);創(chuàng)建一個epoll的句柄,size用來告訴內(nèi)核這個監(jiān)聽的數(shù)目一共有多大。這個參數(shù)不同于select()中的第一個參數(shù),給出最大監(jiān)聽的fd+1的值。需要注意的是,當創(chuàng)建好epoll句柄后,它就是會占用一個fd值,在linux下如果查看/proc/進程id/fd/,是能夠看到這個fd的,所以在使用完epoll后,必須調(diào)用close()關(guān)閉,否則可能導(dǎo)致fd被耗盡。2) int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);epoll的事件注冊函數(shù),它不同與select()是
17、在監(jiān)聽事件時告訴內(nèi)核要監(jiān)聽什么類型的事件epoll的事件注冊函數(shù),它不同與select()是在監(jiān)聽事件時告訴內(nèi)核要監(jiān)聽什么類型的事件,而是在這里先注冊要監(jiān)聽的事件類型。第一個參數(shù)是epoll_create()的返回值,第二個參數(shù)表示動作,用三個宏來表示:EPOLL_CTL_ADD:注冊新的fd到epfd中;EPOLL_CTL_MOD:修改已經(jīng)注冊的fd的監(jiān)聽事件;EPOLL_CTL_DEL:從epfd中刪除一個fd;第三個參數(shù)是需要監(jiān)聽的fd,第四個參數(shù)是告訴內(nèi)核需要監(jiān)聽什么事,struct epoll_event結(jié)構(gòu)如下:struct epoll_event _uint32_t events
18、; /* Epoll events */ epoll_data_t data; /* User data variable */;events可以是以下幾個宏的集合:EPOLLIN :表示對應(yīng)的文件描述符可以讀(包括對端SOCKET正常關(guān)閉);EPOLLOUT:表示對應(yīng)的文件描述符可以寫;EPOLLPRI:表示對應(yīng)的文件描述符有緊急的數(shù)據(jù)可讀(這里應(yīng)該表示有帶外數(shù)據(jù)到來);EPOLLERR:表示對應(yīng)的文件描述符發(fā)生錯誤;EPOLLHUP:表示對應(yīng)的文件描述符被掛斷;EPOLLET: 將EPOLL設(shè)為邊緣觸發(fā)(Edge Triggered)模式,這是相對于水平觸發(fā)(Level Triggered
19、)來說的。EPOLLONESHOT:只監(jiān)聽一次事件,當監(jiān)聽完這次事件之后,如果還需要繼續(xù)監(jiān)聽這個socket的話,需要再次把這個socket加入到EPOLL隊列里。3) int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);等待事件的產(chǎn)生,類似于select()調(diào)用。參數(shù)events用來從內(nèi)核得到事件的集合,maxevents告之內(nèi)核這個events有多大,這個maxevents的值不能大于創(chuàng)建epoll_create()時的size,參數(shù)timeout是超時時間(毫秒,0會立即返回,-1將不確定,也有說法說是永久阻塞)。該函數(shù)返回需要處理的事件數(shù)目,如返回0表示已超時。4) 工作模式:epoll對文件描述符的操作有兩種模式:LT(le
溫馨提示
- 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ī)推拿課件
- 到夢空間培訓(xùn)課件
- 肝臟穿刺護理課件
- 楓楊外國語初二數(shù)學(xué)試卷
- 工大附中高三數(shù)學(xué)試卷
- 福建南平七下數(shù)學(xué)試卷
- 2025年微電子科學(xué)與工程專業(yè)就業(yè)前景調(diào)查報告
- 2025年中級會計實務(wù)考試提升實務(wù)能力試題及答案
- 膜分離聯(lián)合工藝處理工業(yè)廢氣研究-全面剖析
- 《生物活性物質(zhì)》課件
- 廣東省珠海市香洲區(qū)2023-2024學(xué)年五年級下學(xué)期語文期末考試試卷(含答案)
- 2025天然氣管道工程安裝合同協(xié)議書
- 2025-2030中國煙草行業(yè)市場深度調(diào)研及發(fā)展策略研究報告
- 導(dǎo)熱油購買合同協(xié)議
- 駐唱歌手合同協(xié)議
- 銀行安全培訓(xùn)
- 燃氣行業(yè)法律法規(guī)培訓(xùn)
評論
0/150
提交評論