select,poll,epoll区别面试常问
select,poll,epoll區(qū)別:
select優(yōu)點(diǎn)
1)select()的可移植性更好,在某些Unix系統(tǒng)上不支持poll()
2)select() 對(duì)于超時(shí)值提供了更好的精度:微秒,而poll是毫秒。
?
select缺點(diǎn)
1) 單個(gè)進(jìn)程可監(jiān)視的fd數(shù)量被限制。
2) 需要維護(hù)一個(gè)用來(lái)存放大量fd的數(shù)據(jù)結(jié)構(gòu),這樣會(huì)使得用戶空間和內(nèi)核空間在傳遞該結(jié)構(gòu)時(shí)復(fù)制開銷大。
3) 對(duì)fd進(jìn)行掃描時(shí)是線性掃描。fd劇增后,IO效率較低,因?yàn)槊看握{(diào)用都對(duì)fd進(jìn)行線性掃描遍歷,所以隨著fd的增加會(huì)造成遍歷速度慢的性能問題
4)select() 函數(shù)的超時(shí)參數(shù)在返回時(shí)也是未定義的,考慮到可移植性,每次在超時(shí)之后在下一次進(jìn)入到select之前都需要重新設(shè)置超時(shí)參數(shù)。
poll
poll與select不同,通過一個(gè)pollfd數(shù)組向內(nèi)核傳遞需要關(guān)注的事件,故沒有描述符個(gè)數(shù)的限制,
pollfd中的events字段和revents分別用于標(biāo)示關(guān)注的事件和發(fā)生的事件,故pollfd數(shù)組只需要被初始化一次。
poll的實(shí)現(xiàn)機(jī)制與select類似,其對(duì)應(yīng)內(nèi)核中的sys_poll,只不過poll向內(nèi)核傳遞pollfd數(shù)組,然后對(duì)pollfd中的每個(gè)描述符進(jìn)行poll,相比處理fdset來(lái)說(shuō),poll效率更高。
poll返回后,需要對(duì)pollfd中的每個(gè)元素檢查其revents值,來(lái)得指事件是否發(fā)生。
poll優(yōu)點(diǎn)
1)poll() 不要求開發(fā)者計(jì)算最大文件描述符加一的大小。
2)poll() 在應(yīng)付大數(shù)目的文件描述符的時(shí)候相比于select速度更快
3)它沒有最大連接數(shù)的限制,原因是它是基于鏈表來(lái)存儲(chǔ)的。
poll缺點(diǎn)
1)大量的fd的數(shù)組被整體復(fù)制于用戶態(tài)和內(nèi)核地址空間之間,而不管這樣的復(fù)制是不是有意義。
2)與select一樣,poll返回后,需要輪詢pollfd來(lái)獲取就緒的描述符
epoll
epoll是Linux下多路復(fù)用IO接口select/poll的增強(qiáng)版本。
它能顯著減少程序在大量并發(fā)連接中只有少量活躍的情況下的系統(tǒng)CPU利用率,因?yàn)樗粫?huì)復(fù)用文件描述符集合來(lái)傳遞結(jié)果而迫使開發(fā)者每次等待事件之前都必須重新準(zhǔn)備要被偵聽的文件描述符集合。
另一點(diǎn)原因就是獲取事件的時(shí)候,它無(wú)須遍歷整個(gè)被偵聽的描述符集,只要遍歷那些被內(nèi)核IO事件異步喚醒而加入Ready隊(duì)列的描述符集合就行了。
epoll除了提供select/poll 那種IO事件的電平觸發(fā)(Level Triggered)外,還提供了邊沿觸發(fā)(Edge Triggered),這就使得用戶空間程序有可能緩存IO狀態(tài),減少epoll_wait/epoll_pwait的調(diào)用,提高應(yīng)用程序效率。
底層實(shí)現(xiàn)
epoll在底層實(shí)現(xiàn)了自己的高速緩存區(qū),并且建立了一個(gè)紅黑樹用于存放socket,另外維護(hù)了一個(gè)鏈表用來(lái)存放準(zhǔn)備就緒的事件。
工作過程:
執(zhí)行epoll_ create時(shí),創(chuàng)建了紅黑樹和就緒鏈表,執(zhí)行epoll_ ctl時(shí),如果增加socket句柄,則檢查在紅黑樹中是否存在,存在立即返回,不存在則添加到樹干上,然后向內(nèi)核注冊(cè)回調(diào)函數(shù),用于當(dāng)中斷事件來(lái)臨時(shí)向準(zhǔn)備就緒鏈表中插入數(shù)據(jù)。執(zhí)行epoll_wait時(shí)立刻返回準(zhǔn)備就緒鏈表里的數(shù)據(jù)即可。
epoll優(yōu)點(diǎn)
1)支持一個(gè)進(jìn)程打開大數(shù)目的socket描述符(FD)
2)IO效率不隨FD數(shù)目增加而線性下降
3)使用mmap加速內(nèi)核與用戶空間的消息傳遞。
總結(jié)
以上是生活随笔為你收集整理的select,poll,epoll区别面试常问的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tcp三次握手为啥不是4次
- 下一篇: 常见mysql性能优化方法