I/O 多路復(fù)用

什么是 I/O 多路復(fù)用:
I/O 多路復(fù)用指的是可以通過某種機(jī)制,監(jiān)視多個文件描述符,一旦某個文件描述符準(zhǔn)備就緒后,就能夠通知程序進(jìn)行相關(guān)的讀寫操作,目前 I/O 多路復(fù)用機(jī)制主要包含三種:select、poll、epoll

select:
select 函數(shù)監(jiān)視的文件描述符包含三類:writefds、readfds、exceptfds,當(dāng)調(diào)用 select 函數(shù)后,會有阻塞,直到有相關(guān)的文件描述符準(zhǔn)備就緒,select 函數(shù)返回,當(dāng)返回后,可以通過遍歷 fdset 獲取相關(guān)的已經(jīng)準(zhǔn)備就緒的文件描述符

select 函數(shù)的本質(zhì)是通過設(shè)置或者檢查存放 fd 標(biāo)志位的數(shù)據(jù)結(jié)構(gòu)進(jìn)行下一次的處理,select 機(jī)制包含有幾個缺點(diǎn):

  1. 單個進(jìn)程能打開的文件描述符有數(shù)量限制,由 FD_SETSIZE 控制,默認(rèn)是 1024
  2. 掃描 socket 的時候,采用的是線性掃描,也就是輪詢的方式,這樣的話效率比較低
  3. 需要維護(hù)一個用于保存大量 fd 的數(shù)據(jù)結(jié)構(gòu),這樣的話會使得在用戶態(tài)和內(nèi)核空間之間傳遞該數(shù)據(jù)結(jié)構(gòu)的時候增大復(fù)制的開銷

poll:
poll 和 select 在本質(zhì)上沒有太大的差別, poll 將用戶傳入的數(shù)組拷貝至內(nèi)核空間,查詢每一個 fd 對應(yīng)的設(shè)備狀態(tài),如果 fd 對應(yīng)的設(shè)備狀態(tài)處于準(zhǔn)備就緒,則會在設(shè)備等待列表中存入一項繼續(xù)遍歷,如果遍歷完所有 fd 后發(fā)現(xiàn)沒有處于準(zhǔn)備就緒狀態(tài)的設(shè)備,那么會將當(dāng)前進(jìn)程掛起,直到有相關(guān)設(shè)備處于準(zhǔn)備就緒狀態(tài),再次被喚醒,等被喚醒后需要再次進(jìn)行多次遍歷

poll 機(jī)制中沒有最大連接數(shù)的限制,因為它采用的是鏈表方式存儲,但是這樣做會有一些缺陷:

  1. 大量的 fd 的數(shù)組被整體復(fù)制于用戶空間和內(nèi)核地址空間中,而不管這些復(fù)制是不是有意義
  2. poll 還有一個特點(diǎn),支持水平觸發(fā),如果 fd 被上報但是沒有被處理,那么下一次 poll 時會繼續(xù)上報這個 fd

epoll:
epoll 是 select 和 poll 的增強(qiáng)版本,epoll 相比較于 select 和 poll 更加的靈活,epoll 使用一個文件描述符管理多個文件描述符,將用戶關(guān)系的文件描述符的事件保存在一個內(nèi)核的時間列表中,這樣在用戶空間和內(nèi)核空間只需要復(fù)制一次

epoll:
epoll 支持水平觸發(fā)和邊緣觸發(fā),最大的優(yōu)點(diǎn)在于邊緣觸發(fā),它只會告訴進(jìn)程剛剛變?yōu)闇?zhǔn)備就緒狀態(tài)的 fd,并且只會通知一次,還有一個特點(diǎn)是,它采用的是事件就緒的通知方式,通過 epoll_ctl 注冊 fd,一旦 fd 準(zhǔn)備就緒后,內(nèi)核會采用類似 callback 回調(diào)函數(shù)的機(jī)制激活 fd,然后 epoll_await 等待通知

epoll的優(yōu)點(diǎn):

  1. 沒有最大并發(fā)連接數(shù)的限制,打開 fd 的上限遠(yuǎn)高于 1024
  2. epoll 的效率高,沒有采用輪詢的方式,不會隨著 fd 的數(shù)目增加而降低效率,只有處于活躍狀態(tài)的 fd 才會調(diào)用 callback 函數(shù),epoll 最大的特點(diǎn)就在于它只管活躍狀態(tài)的連接,和連接總數(shù)沒有關(guān)系,這也是在實際網(wǎng)絡(luò)中 epoll 要比 poll 和 select 效率高的原因
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容