分析&回答
IO多路復(fù)用
I/O multiplexing 這里面的 multiplexing 指的其實(shí)是在單個(gè)線程通過記錄跟蹤每一個(gè)Sock(I/O流)的狀態(tài)(對(duì)應(yīng)空管塔里面的Fight progress strip槽)來同時(shí)管理多個(gè)I/O流。直白點(diǎn)說:多路指的是多個(gè)socket連接,復(fù)用指的是復(fù)用一個(gè)線程進(jìn)行管理。發(fā)明它的原因,是盡量多的提高服務(wù)器的吞吐能力。
Linux IO多路復(fù)用依次出現(xiàn)了select、poll、epoll實(shí)現(xiàn),可以認(rèn)為select、poll是過期產(chǎn)品,現(xiàn)在推薦使用epoll,epoll性能比其他幾者要好。
Epoll介紹
epoll是linux2.6內(nèi)核的一個(gè)新的系統(tǒng)調(diào)用,epoll在設(shè)計(jì)之初,就是為了替代select, poll線性復(fù)雜度的模型,epoll的時(shí)間復(fù)雜度為O(1), 也就意味著,epoll在高并發(fā)場(chǎng)景,隨著文件描述符的增長(zhǎng),有良好的可擴(kuò)展性。
- select?和?poll?監(jiān)聽文件描述符list,進(jìn)行一個(gè)線性的查找 O(n)
- epoll: 使用了內(nèi)核文件級(jí)別的回調(diào)機(jī)制O(1)
Epoll高效原理
- 調(diào)用epoll_create時(shí),內(nèi)核除了幫我們?cè)趀poll文件系統(tǒng)里建了個(gè)file結(jié)點(diǎn),在內(nèi)核cache里建了個(gè)RB-Tree紅黑樹用于存儲(chǔ)以后epoll_ctl傳來的socket外,還會(huì)再建立一個(gè)list鏈表,用于存儲(chǔ)準(zhǔn)備就緒的事件。
- 調(diào)用epoll_wait時(shí),僅僅觀察這個(gè)list鏈表里有沒有數(shù)據(jù)即可。有數(shù)據(jù)就返回,沒有數(shù)據(jù)就sleep,等到timeout時(shí)間到后即使鏈表沒數(shù)據(jù)也返回。所以,epoll_wait非常高效。而且,通常情況下即使我們要監(jiān)控百萬計(jì)的句柄,大多一次也只返回很少量的準(zhǔn)備就緒句柄而已,所以,epoll_wait僅需要從內(nèi)核態(tài)copy少量的句柄到用戶態(tài)而已。
epoll高效的本質(zhì)在于:
- 減少了用戶態(tài)和內(nèi)核態(tài)的文件句柄拷貝
- 減少了對(duì)可讀可寫文件句柄的遍歷
- mmap 加速了內(nèi)核與用戶空間的信息傳遞,epoll是通過內(nèi)核與用戶mmap同一塊內(nèi)存,避免了無謂的內(nèi)存拷貝
- IO性能不會(huì)隨著監(jiān)聽的文件描述的數(shù)量增長(zhǎng)而下降
- 使用紅黑樹存儲(chǔ)fd,以及對(duì)應(yīng)的回調(diào)函數(shù),其插入,查找,刪除的性能不錯(cuò),相比于hash,不必預(yù)先分配很多的空間
反思&擴(kuò)展
IO多路復(fù)用涉及知識(shí)較多,如果你想成為你的亮點(diǎn),就繼續(xù)了解,如果應(yīng)付問題,可以淺嘗輒止。
IO多路復(fù)用模型 Reactor
異步IO Proactor
“真正”的異步IO需要操作系統(tǒng)更強(qiáng)的支持。
Epoll事件有兩種模型
邊沿觸發(fā):edge-triggered (ET), 水平觸發(fā):level-triggered (LT)文章來源:http://www.zghlxwxcb.cn/news/detail-697641.html
- 水平觸發(fā)(level-triggered)
- socket接收緩沖區(qū)不為空 有數(shù)據(jù)可讀 讀事件一直觸發(fā)
- socket發(fā)送緩沖區(qū)不滿 可以繼續(xù)寫入數(shù)據(jù) 寫事件一直觸發(fā)
- 邊沿觸發(fā)(edge-triggered)
- socket的接收緩沖區(qū)狀態(tài)變化時(shí)觸發(fā)讀事件,即空的接收緩沖區(qū)剛接收到數(shù)據(jù)時(shí)觸發(fā)讀事件
- socket的發(fā)送緩沖區(qū)狀態(tài)變化時(shí)觸發(fā)寫事件,即滿的緩沖區(qū)剛空出空間時(shí)觸發(fā)讀事件 邊沿觸發(fā)僅觸發(fā)一次,水平觸發(fā)會(huì)一直觸發(fā)。
喵嗚面試助手:一站式解決面試問題,你可以搜索微信小程序 [喵嗚面試助手]?或關(guān)注 [喵嗚刷題] -> 面試助手?免費(fèi)刷題。如有好的面試知識(shí)或技巧期待您的共享!文章來源地址http://www.zghlxwxcb.cn/news/detail-697641.html
到了這里,關(guān)于說說IO多路復(fù)用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!