IO多路復(fù)用 Select和epoll

背景說(shuō)明

I/O多路復(fù)用就通過(guò)一種機(jī)制,可以監(jiān)視多個(gè)描述符,一旦某個(gè)描述符就緒(一般是讀就緒或者寫(xiě)就緒),能夠通知程序進(jìn)行相應(yīng)的讀寫(xiě)操作。但select,poll,epoll本質(zhì)上都是同步I/O,因?yàn)樗麄兌夹枰谧x寫(xiě)事件就緒后自己負(fù)責(zé)進(jìn)行讀寫(xiě),也就是說(shuō)這個(gè)讀寫(xiě)過(guò)程是阻塞的,而異步I/O則無(wú)需自己負(fù)責(zé)進(jìn)行讀寫(xiě),異步I/O的實(shí)現(xiàn)會(huì)負(fù)責(zé)把數(shù)據(jù)從內(nèi)核拷貝到用戶空間。

epoll跟select都能提供多路I/O復(fù)用的解決方案。在現(xiàn)在的Linux內(nèi)核里有都能夠支持,其中epoll是Linux所特有,而select則應(yīng)該是POSIX所規(guī)定,一般操作系統(tǒng)均有實(shí)現(xiàn)

Select

select.png

Select模型使用單個(gè)線程監(jiān)聽(tīng)客戶端連接請(qǐng)求,連接建立成功后注冊(cè)讀寫(xiě)事件到Selector中,Selector調(diào)用操作系統(tǒng)內(nèi)核的方法注冊(cè)讀寫(xiě)事件,然后Selector阻塞等待讀寫(xiě)事件。

客戶端發(fā)送數(shù)據(jù)到服務(wù)端,操作系統(tǒng)內(nèi)核輪訓(xùn)socket連接的讀寫(xiě)事件,當(dāng)存在讀寫(xiě)事件時(shí),生成對(duì)應(yīng)的可讀列表readList和可寫(xiě)列表writeList,應(yīng)用層遍歷讀寫(xiě)事件列表readList和writeList,做相應(yīng)的讀寫(xiě)操作,進(jìn)行后續(xù)的業(yè)務(wù)處理。

從上面的流程可以看出,主要存在兩個(gè)問(wèn)題:
(1) 輪訓(xùn),每次調(diào)用時(shí)都會(huì)對(duì)連接進(jìn)行線性遍歷,所以隨著連接數(shù)的增加會(huì)造成遍歷速度慢的“線性下降性能問(wèn)題”,性能瓶頸可能會(huì)出現(xiàn)。
(2) 連接數(shù)量。連接數(shù)量首先影響輪訓(xùn)效率,其次,如果連接數(shù)很多,連接在應(yīng)用層和內(nèi)核層的相互copy,也會(huì)有一定的性能影響。

epoll

epoll.png

epoll模型主要解決了select模型的兩個(gè)問(wèn)題:

  1. 輪訓(xùn)問(wèn)題, epoll模型是在創(chuàng)建一個(gè)socket連接時(shí),會(huì)在操作系統(tǒng)內(nèi)核層的epoll模型中 注冊(cè)此socket連接的callback函數(shù),當(dāng)后續(xù)檢測(cè)到存在讀寫(xiě)事件時(shí),通過(guò)此回調(diào)函數(shù),將事件記錄到epoll模型中。
  2. 連接句柄符復(fù)制問(wèn)題。 epoll模型在創(chuàng)建socket連接時(shí),就會(huì)把連接建立的句柄符保存到操作系統(tǒng)內(nèi)核層的epoll模型中,這樣就避免后續(xù)在應(yīng)用層和內(nèi)核層來(lái)回復(fù)制從而產(chǎn)生的性能問(wèn)題。
    epoll模型在操作系統(tǒng)內(nèi)核層的實(shí)現(xiàn)可以參考這篇文章(深入理解select、poll和epoll及區(qū)別)(https://blog.csdn.net/wteruiycbqqvwt/article/details/90299610)

總結(jié)思考

  1. epoll 的事件通知機(jī)制,內(nèi)核和應(yīng)用層的mmp機(jī)制還需要具體看下。
  2. 通過(guò)epoll 和 select的對(duì)比,可以發(fā)現(xiàn)方案是逐步演化的,聯(lián)系到目前的業(yè)務(wù)架構(gòu)中也是類(lèi)似的,架構(gòu)不是一步到位的,避免過(guò)度設(shè)計(jì),針對(duì)痛點(diǎn)問(wèn)題及時(shí)調(diào)整即可。
  3. epoll的事件通知機(jī)制類(lèi)似于設(shè)計(jì)模式的觀察者模式,spring的事件通知機(jī)制,可以極大的解耦和提高性能,后面的業(yè)務(wù)中也要著重學(xué)習(xí)這種設(shè)計(jì)思路。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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