最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2017年01月11日 10:43:24   投稿:jingxian  
下面小編就為大家?guī)硪黄狪O復用之select poll epoll的總結(jié)(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

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

在了解I/O復用之前,我們需要先了解幾個概念。

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

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

POSIX把兩個術(shù)語定義如下:

同步I/O:導致請求進程阻塞,直到I/O操作完成

異步I/O:不導致請求進程阻塞

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

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

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

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

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

我們關(guān)注的I/O復用屬于同步I/O,會導致進程阻塞。

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

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

邊緣觸發(fā)(ET,edge-triggered)每當狀態(tài)變化時,觸發(fā)一個事件.如果文件描述符自上次狀態(tài)改變后有新的IO活動到來,此時會觸發(fā)通知.在收到一個IO事件通知后要盡可能多的執(zhí)行IO操作,因為如果在一次通知中沒有執(zhí)行完IO那么就需要等到下一次新的IO活動到來才能獲取到就緒的描述符.信號驅(qū)動式IO就屬于邊緣觸發(fā).

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

下面具體介紹三大I/O復用: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 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);

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

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)核對fd_set的修改,應用程序下次調(diào)用select前需要重置這3個fd_set集合。

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

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

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

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

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

以上這篇IO復用之select poll epoll的總結(jié)(推薦)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • apache基于端口創(chuàng)建虛擬主機的示例

    apache基于端口創(chuàng)建虛擬主機的示例

    這篇文章主要介紹了apache基于端口創(chuàng)建虛擬主機的示例,本文以創(chuàng)建虛擬主機(a、b、c)為例子,給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • Shell中如何刪除文本比較長的行的實現(xiàn)方法

    Shell中如何刪除文本比較長的行的實現(xiàn)方法

    這篇文章主要介紹了 Shell中如何刪除文本比較長的行的實現(xiàn)方法的相關(guān)資料,希望通過本文能幫助到大家,讓大家掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10
  • Linux下修改jar、zip等文件內(nèi)的文件詳解

    Linux下修改jar、zip等文件內(nèi)的文件詳解

    這篇文章主要介紹了Linux下修改jar、zip等文件內(nèi)的文件詳解的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • centos配置mutt和msmtp實現(xiàn)郵件發(fā)送

    centos配置mutt和msmtp實現(xiàn)郵件發(fā)送

    這篇文章主要為大家詳細介紹了centos配置mutt和msmtp實現(xiàn)郵件發(fā)送,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • linux停止和查看啟動服務的命令使用方法

    linux停止和查看啟動服務的命令使用方法

    這篇文章主要介紹了linux停止和查看啟動服務的命令使用方法,需要的朋友可以參考下
    2014-02-02
  • linux用戶和組管理常見命令總結(jié)

    linux用戶和組管理常見命令總結(jié)

    這篇文章主要介紹了linux用戶和組管理常見命令,總結(jié)整理了linux用戶和組管理相關(guān)原理、操作命令與使用注意事項,需要的朋友可以參考下
    2020-03-03
  • Linux服務器掛載新硬盤方式

    Linux服務器掛載新硬盤方式

    本文詳細記錄了在一臺主機上插上一塊8T硬盤后遇到的問題及解決過程,初始問題包括無法重啟和/etc/fstab文件配置錯誤,通過手動掛載、查看文件系統(tǒng)類型以及系統(tǒng)日志,最終確定是插槽順序問題導致硬盤名稱混亂,通過調(diào)整/etc/fstab文件中的掛載分區(qū)和文件系統(tǒng)類型
    2025-02-02
  • Linux實現(xiàn)免密登錄的配置方法

    Linux實現(xiàn)免密登錄的配置方法

    這篇文章主要介紹了Linux實現(xiàn)免密登錄的配置方法,實現(xiàn)的效果是,當前服務器的test賬號可以免密登陸15服務器的test賬號,需要的朋友可以參考下
    2024-04-04
  • haproxy+keepalived實現(xiàn)高可用負載均衡(理論篇)

    haproxy+keepalived實現(xiàn)高可用負載均衡(理論篇)

    軟件負載均衡一般通過兩種方式來實現(xiàn):基于操作系統(tǒng)的軟負載實現(xiàn)和基于第三方應用的軟負載實現(xiàn)。LVS就是基于Linux操作系統(tǒng)實現(xiàn)的一種軟負載,HAProxy就是開源的并且基于第三應用實現(xiàn)的軟負載
    2013-01-01
  • Linux部署python爬蟲腳本,并設置定時任務的方法

    Linux部署python爬蟲腳本,并設置定時任務的方法

    今天小編就為大家分享一篇Linux部署python爬蟲腳本,并設置定時任務的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06

最新評論

米易县| 务川| 邵武市| 舞钢市| 伊吾县| 刚察县| 天峻县| 三门县| 老河口市| 万安县| 盐山县| 沂南县| 龙里县| 崇礼县| 平和县| 朔州市| 常宁市| 凤山市| 济宁市| 酉阳| 淄博市| 温泉县| 金山区| 修武县| 商丘市| 石台县| 新野县| 太康县| 醴陵市| 鱼台县| 垦利县| 准格尔旗| 自贡市| 凤冈县| 永德县| 兴业县| 永州市| 赣州市| 手机| 房产| 彝良县|