BIO、NIO、AIO原理解析

1. BIO

阻塞式IO,一個(gè)線(xiàn)程處理一個(gè)請(qǐng)求。

2. NIO

NIO模型.png

輪詢(xún)器只需要一個(gè)線(xiàn)程就可以管理多個(gè)請(qǐng)求
輪詢(xún)器有select和poll,select和poll的區(qū)別是fds的數(shù)量限制,select是有限制的,poll沒(méi)有限制,其他的沒(méi)有區(qū)別
遍歷channel的狀態(tài)由內(nèi)核做,不需要來(lái)回切換用戶(hù)態(tài)和內(nèi)核態(tài)的上下文
只需要一次告訴內(nèi)核我們需要遍歷的所有通道的fds(文件描述符)就行,內(nèi)核會(huì)一次性將已經(jīng)準(zhǔn)備就緒的文件描述符返回
只會(huì)發(fā)生1次系統(tǒng)調(diào)用,2次用戶(hù)態(tài)和內(nèi)核態(tài)的上下文切換
select基于輪詢(xún)查看事件是否準(zhǔn)備就緒
epoll基于事件通知

怎么理解多路復(fù)用?

一次調(diào)用可以查詢(xún)到多個(gè)路通道的狀態(tài),多個(gè)路通道被一次調(diào)用復(fù)用了,稱(chēng)為IO多路復(fù)用。

說(shuō)一下epoll
epoll.png

epoll涉及到3個(gè)方法
1.epoll_create 會(huì)在內(nèi)核開(kāi)辟兩塊空間,一個(gè)是紅黑樹(shù),一個(gè)是雙向鏈表
2.epoll_ctl 會(huì)將要監(jiān)聽(tīng)的fd及需要監(jiān)聽(tīng)的事件放到紅黑樹(shù)的中
3.epoll_wait 遍歷雙向鏈表中準(zhǔn)備就緒的fd

雙向鏈表中的數(shù)據(jù)是怎么來(lái)的?
場(chǎng)景示例:當(dāng)網(wǎng)卡接收到數(shù)據(jù)時(shí),內(nèi)核就會(huì)檢測(cè)到網(wǎng)絡(luò)套接字的狀態(tài)變化,此時(shí)網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序會(huì)通過(guò)內(nèi)核將數(shù)據(jù)放入到對(duì)應(yīng)的fd中的接收緩沖區(qū),并修改相應(yīng)的文件描述符狀態(tài),內(nèi)核就會(huì)檢查紅黑樹(shù)中注冊(cè)的文件描述符發(fā)現(xiàn)對(duì)應(yīng)的fd現(xiàn)在是準(zhǔn)備就緒狀態(tài),內(nèi)核就會(huì)把fd放到雙向鏈表中。表示這個(gè)文件描述符已經(jīng)準(zhǔn)備好被處理了

3. AIO

最后編輯于
?著作權(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)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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