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

輪詢(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涉及到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)備好被處理了