国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 網(wǎng)站 > 建站經(jīng)驗(yàn) > 正文

IO復(fù)用之select poll epoll的總結(jié)(推薦)

2019-11-02 16:50:01
字體:
供稿:網(wǎng)友

I/O復(fù)用使得程序能夠同時(shí)監(jiān)聽多個(gè)文件描述符,對(duì)于提高程序性能至關(guān)重要。I/O復(fù)用不僅僅在網(wǎng)絡(luò)程序中使用,但是我接觸到的例子中,TCP網(wǎng)絡(luò)編程那塊使用I/O復(fù)用比較多,例如,TCP服務(wù)器同時(shí)處理監(jiān)聽socket和連接socket.

在了解I/O復(fù)用之前,我們需要先了解幾個(gè)概念。

1,同步I/O與異步I/O

2,LT(水平觸發(fā))和ET(邊緣觸發(fā))

POSIX把兩個(gè)術(shù)語(yǔ)定義如下:

同步I/O:導(dǎo)致請(qǐng)求進(jìn)程阻塞,直到I/O操作完成

異步I/O:不導(dǎo)致請(qǐng)求進(jìn)程阻塞

阻塞是進(jìn)程在等待某種資源,但是不能馬上得到,必須等待別的進(jìn)程釋放資源才能繼續(xù),屬于被動(dòng)無法得到時(shí)間片,內(nèi)核就切換其它進(jìn)程運(yùn)行。

它與休眠和掛起的區(qū)別:休眠一般為主動(dòng)式的放棄一段CPU時(shí)間。  

掛起是運(yùn)行時(shí)間片到了,內(nèi)核要調(diào)度其它進(jìn)程運(yùn)行,被動(dòng)式的失去CPU。(掛起可以被別的進(jìn)程給搶占導(dǎo)致掛起,也可以自己主動(dòng)掛起自己。)

Unix下可用的5種I/O模型:1,阻塞式I/O 2,非阻塞式I/O 3,I/O 復(fù)用 4,信號(hào)驅(qū)動(dòng)I/O(SIGIO) 5,異步I/O

1--4為同步I/O,5為異步I/O。

我們關(guān)注的I/O復(fù)用屬于同步I/O,會(huì)導(dǎo)致進(jìn)程阻塞。

在linux的IO多路復(fù)用中有水平觸發(fā),邊緣觸發(fā)兩種模式,這兩種模式的區(qū)別如下:

水平觸發(fā)(LT,level-triggered,也被稱為條件觸發(fā)):只要滿足條件,就觸發(fā)一個(gè)事件(只要有數(shù)據(jù)沒有被獲取,內(nèi)核就不斷通知你).如果文件描述符已經(jīng)就緒可以非阻塞的執(zhí)行IO操作了,此時(shí)會(huì)觸發(fā)通知.允許在任意時(shí)刻重復(fù)檢測(cè)IO的狀態(tài),沒有必要每次描述符就緒后盡可能多的執(zhí)行IO.select,poll就屬于水平觸發(fā).

邊緣觸發(fā)(ET,edge-triggered)每當(dāng)狀態(tài)變化時(shí),觸發(fā)一個(gè)事件.如果文件描述符自上次狀態(tài)改變后有新的IO活動(dòng)到來,此時(shí)會(huì)觸發(fā)通知.在收到一個(gè)IO事件通知后要盡可能多的執(zhí)行IO操作,因?yàn)槿绻谝淮瓮ㄖ袥]有執(zhí)行完IO那么就需要等到下一次新的IO活動(dòng)到來才能獲取到就緒的描述符.信號(hào)驅(qū)動(dòng)式IO就屬于邊緣觸發(fā).

epoll既可以選擇水平觸發(fā),也可以選擇邊緣觸發(fā)

下面具體介紹三大I/O復(fù)用:select,poll,epoll

int select(int nfds,fd_set *readfds,fd_set *writefds,fd_set *exceptfds,struct timeval *timeout);returns numbers of ready descriptors,0 on timeout,or -1 on errorint poll(struct pollfd fds[],nfds_t nfds,int timeout);returns number of ready file descriptors,0 on timeout,or -1 on error;epollint 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);

下面從事件集、最大支持文件描述符、工作模式、具體實(shí)現(xiàn)四個(gè)方面進(jìn)行對(duì)比:

3組系統(tǒng)調(diào)用都通過某種結(jié)構(gòu)體來高速內(nèi)核監(jiān)聽哪些文件描述符上的事件,并使用該結(jié)構(gòu)體類型的參數(shù)來獲取內(nèi)核處理的結(jié)構(gòu)。

select的參數(shù)類型fd_set沒有將文件描述符和事件綁定,只能處理可讀、可寫、異常事件,這使得select不能處理更多類型的事件。由于內(nèi)核對(duì)fd_set的修改,應(yīng)用程序下次調(diào)用select前需要重置這3個(gè)fd_set集合。

poll通過把文件描述符和事件定義在pollfd中,任何事件都被統(tǒng)一處理,從而使得編程接口簡(jiǎn)潔許多。并且內(nèi)核每次修改的是pollfd結(jié)構(gòu)體的revents成員,而events成員保持不變,因此下次調(diào)用poll時(shí)無須重置pollfd結(jié)構(gòu)體類型的事件集參數(shù)。由于每次select 和poll調(diào)用都返回整個(gè)用戶注冊(cè)的事件集合(其中包括就緒的和未就緒的),所以應(yīng)用程序索引就緒文件描述符的時(shí)間復(fù)雜度為O(n).epoll 則采用與select和poll完全不同的方式來管理用戶注冊(cè)的事件。它在內(nèi)核中維護(hù)一個(gè)事件表,并提供了一個(gè)獨(dú)立的系統(tǒng)調(diào)用epoll_ctl來控制往其中添加、刪除、修改事件。這樣,每次epoll_wait調(diào)用都直接從該內(nèi)核事件表中取得用戶注冊(cè)的事件,而無須反復(fù)從用戶空間讀入這些事件。epoll_wait系統(tǒng)調(diào)用的events參數(shù)僅用來返回就緒的事件,這使得應(yīng)用程序索引就緒文件描述符的時(shí)間復(fù)雜度為O(1)

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 屏东市| 县级市| 黄陵县| 宣恩县| 宜州市| 贵州省| 兴国县| 中宁县| 鹤峰县| 阳谷县| 京山县| 平远县| 周口市| 横峰县| 崇明县| 搜索| 南皮县| 奎屯市| 北碚区| 南陵县| 康定县| 鞍山市| 吴川市| 香港 | 黄石市| 延吉市| 元阳县| 海安县| 东安县| 丰顺县| 连城县| 吉首市| 扶风县| 萨迦县| 清涧县| 潜江市| 清河县| 闽侯县| 广汉市| 富蕴县| 东光县|