激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類(lèi)導(dǎo)航

Linux|Centos|Ubuntu|系統(tǒng)進(jìn)程|Fedora|注冊(cè)表|Bios|Solaris|Windows7|Windows10|Windows11|windows server|

服務(wù)器之家 - 服務(wù)器系統(tǒng) - Linux - IO復(fù)用之select poll epoll的總結(jié)(推薦)

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

2021-12-21 18:42Linux教程網(wǎng) Linux

下面小編就為大家?guī)?lái)一篇IO復(fù)用之select poll epoll的總結(jié)(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

i/o復(fù)用使得程序能夠同時(shí)監(jiān)聽(tīng)多個(gè)文件描述符,對(duì)于提高程序性能至關(guān)重要。i/o復(fù)用不僅僅在網(wǎng)絡(luò)程序中使用,但是我接觸到的例子中,tcp網(wǎng)絡(luò)編程那塊使用i/o復(fù)用比較多,例如,tcp服務(wù)器同時(shí)處理監(jiān)聽(tīng)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)無(wú)法得到時(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ù)沒(méi)有被獲取,內(nèi)核就不斷通知你).如果文件描述符已經(jīng)就緒可以非阻塞的執(zhí)行io操作了,此時(shí)會(huì)觸發(fā)通知.允許在任意時(shí)刻重復(fù)檢測(cè)io的狀態(tài),沒(méi)有必要每次描述符就緒后盡可能多的執(zhí)行io.select,poll就屬于水平觸發(fā).

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

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

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

?
1
2
3
4
5
6
7
8
9
10
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 error
 
int poll(struct pollfd fds[],nfds_t nfds,int timeout);
returns number of ready file descriptors,0 on timeout,or -1 on error;
 
epoll
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);

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

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

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

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

poll和epoll_wait分別用nfds和maxevents參數(shù)指定最多監(jiān)聽(tīng)多少個(gè)文件描述符和事件。這兩個(gè)數(shù)值都能達(dá)到系統(tǒng)最大的文件描述符數(shù)目,即65535(cat/proc/sys/fs/file-max).而select允許監(jiān)聽(tīng)的最大文件描述符數(shù)量通常有限制。雖然用戶可以修改這個(gè)限制,但這可能導(dǎo)致不可預(yù)期的后果。

select和poll都只能工作在lt模式,而epoll可以工作在et模式。并且epoll還支持epolloneshot事件,該事件可以進(jìn)一步減少可讀、可寫(xiě)、和異常等事件被觸發(fā)的次數(shù)

實(shí)現(xiàn)原理上,select和poll采用輪詢的方式,即每次都要掃描整個(gè)注冊(cè)文件描述符集合,并將其中就緒的文件描述符返回給用戶程序,因此他們檢測(cè)就緒事件的時(shí)間復(fù)雜度為o(n).epoll_wait采用回調(diào)的方式,內(nèi)核檢測(cè)到就緒文件描述符時(shí),將觸發(fā)回調(diào)函數(shù),回調(diào)函數(shù)將該文件描述符上對(duì)應(yīng)的事件插入內(nèi)核就緒事件隊(duì)列。內(nèi)核最后在適當(dāng)時(shí)機(jī)將該就緒事件隊(duì)列中的內(nèi)容拷貝到用戶空間。因此epoll_wait無(wú)須輪詢整個(gè)文件描述符集合來(lái)檢測(cè)哪些文件描述符就緒,其算法復(fù)雜度為o(1).

總結(jié)起來(lái)如下表所示

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

以上這篇io復(fù)用之select poll epoll的總結(jié)(推薦)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持服務(wù)器之家。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲小视频在线观看,com | 中文字幕在线观看免费视频 | 一边吃奶一边摸下娇喘 | 久久国产精品成人免费网站 | 国产一级二级在线播放 | 精品一区二区中文字幕 | 精品91av| 国内精品久久久久影院不卡 | 亚洲草逼视频 | 欧美精品一区自拍a毛片在线视频 | 日本xxxx视频 | 天天透天天狠天天爱综合97 | 欧美淫视频 | 免费毛片电影 | 亚洲国产资源 | 国产资源视频在线观看 | 九九视频精品在线观看 | 神马福利网| 久久精品成人影院 | 在线中文字幕观看 | 国产午夜精品久久久久 | 久久久久久久免费看 | 在线播放亚洲 | 欧美淫交 | 全视频tv| 视频一区二区国产 | 欧美国产一区二区三区激情无套 | 日本不卡一区二区在线观看 | 欧美国产免费 | 牛牛碰在线 | 日本aaa一级片 | japanese massage tube | 黄色网址入口 | 欧美日韩在线看片 | 成人小视频在线播放 | 91短视频在线观看免费最新 | 激情97| 一区二区三区无码高清视频 | 夜夜夜影院 | 欧美成人影院 | 91视频观看|