关于epoll,select,poll的理解
select: 輪詢+fd_set
1.采用fd_set存儲fd(fd_set通過數(shù)組位圖實現(xiàn))
2.每次調(diào)用select,都需要把fd集合從用戶態(tài)拷貝到內(nèi)核態(tài),fd越多開銷越大
3.每次調(diào)用select,都需要在內(nèi)核遍歷傳遞進來的fd,開銷大(輪詢)
4.select支持的fd數(shù)量太少,1024(32個32位的整數(shù),也就是2的10次方),受fd_setsize參數(shù)限制,改變這個參數(shù)的話需要重新編譯內(nèi)核
具體想要突破fd_setsize參數(shù)限制的話有以下2個方法:
1)修改sys/types.h頭文件中的fd_setsize值并且重新編譯內(nèi)核,當(dāng)然這并不是一個好的方法,fd_setsize的值變大意味著我們輪詢一次的時間需要加長
2)通過多核CPU,采用分而治之+負(fù)載均衡的思想將連接注冊在多個select上,并發(fā)select不僅能突破fd_setsize限制而且能提高性能,有點map -reduce的思想,這里還有一個問題,就是當(dāng)一個輪詢器poller上的最大輪詢數(shù)量超過了1024還能不能注冊的問題,我們同樣可以采用分而治之的多線程輪詢策略來解決,比如連接數(shù)2000,線程1輪詢0到1023,線程2輪詢1024-2000
?
5.調(diào)用select,返回的是含有整個句柄的數(shù)組,需要遍歷整個數(shù)組才知道哪些句柄發(fā)生了事件(輪詢)
6.select的觸發(fā)是LT模式,效率不高
?
poll:輪詢+鏈表
1.采用鏈表存儲fd,沒有了fd數(shù)量限制,但是上述其他缺點依然存在
?
epoll:紅黑樹+雙鏈表+回調(diào)機制
1.紅黑樹掛載事件,事件發(fā)生時通過回調(diào)機制將事件添加到雙鏈表中
2.檢查是否有事件發(fā)生時,不需要輪詢,只需要檢查雙鏈表即可
3.保證每個fd只會被拷貝一次(事件被加入到epoll中時,fd就會被拷貝進入內(nèi)核,而不是在epoll_wait時拷貝),使用了mmap加速內(nèi)核與用戶空間的消息傳遞,無論是select還是poll都需要內(nèi)核把fd消息通知給用戶空間,如何1避免不必要的內(nèi)存拷貝就很重要,在這點上,epoll通過內(nèi)核與用戶空間mmap同一塊內(nèi)存實現(xiàn)!
4.fd數(shù)量上限為最大可以打開的文件數(shù)目,這個我們可以通過調(diào)整內(nèi)核的參數(shù)來改變,通過ulimit -n來調(diào)整或者setrlimit函數(shù)設(shè)置,當(dāng)然這個需要root權(quán)限,但是一個系統(tǒng)能打開的文件最大數(shù)目也是有限制的,取決于內(nèi)存大小,可以通過cat/proc/sys/fs/file-max查看
該雙鏈表我們一般叫做就緒事件鏈表
?
當(dāng)然,以上的優(yōu)缺點僅僅是在高并發(fā)且任一時間只有少數(shù)socket活躍的特定場景下的,如果并發(fā)量高,socket都比較活躍的情況下,select就不見得會比epoll慢(就像我們常常是快排比插入排序快,但是在特定的情況下并不成立)
什么情況下使用select,poll的性能好于使用epoll?
高并發(fā),少活躍socket的情況下,select的輪詢在于每次輪詢都會輪詢到不活躍的套接字,從而浪費了時間導(dǎo)致效率慢
但是當(dāng)高并發(fā),多活躍socket的情況下,select的輪詢每次都能很快的輪詢到活躍的套接字,這種情況下也是可以考慮使用select的!
?
最后,總結(jié)一下
并發(fā)低 ? socket活躍 ? select/poll
并發(fā)低 ? socket不活躍 select/poll
這兩種情況使用epoll[紅黑樹+鏈表+回調(diào)機制]有點殺雞用牛刀的感覺
?
并發(fā)高 ? socket活躍 ? ? ? select/poll的性能不一定比epoll差
并發(fā)高 ? socket不活躍 ? ? epoll
?
?
?
//先碼著,后面準(zhǔn)備自己實現(xiàn)一下這三種機制
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/yinbiao/p/10945624.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的关于epoll,select,poll的理解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vissim免修改时间工具_视频剪辑工具
- 下一篇: doip 源码_DoIP协议源码车载以太