select的缺點:
1疑故、單個進(jìn)程能夠監(jiān)視的文件描述符的數(shù)量存在最大限制杠览,通常是1024,當(dāng)然可以更改數(shù)量纵势,但由于select采用輪詢的方式掃描文件描述符踱阿,文件描述符數(shù)量越多,性能越差钦铁;(在linux內(nèi)核頭文件中软舌,有這樣的定義:#define __FD_SETSIZE? ? 1024)
2、內(nèi)核 / 用戶空間內(nèi)存拷貝問題牛曹,select每次都會改變內(nèi)核中的句柄數(shù)據(jù)結(jié)構(gòu)集葫隙,因而每次select調(diào)用時都需要從用戶空間向內(nèi)核空間復(fù)制所有的句柄數(shù)據(jù)結(jié)構(gòu),產(chǎn)生巨大的開銷
3躏仇、select返回的是含有整個句柄的數(shù)組恋脚,應(yīng)用程序需要遍歷整個數(shù)組才能發(fā)現(xiàn)哪些句柄發(fā)生了事件
4、select的觸發(fā)方式是水平觸發(fā)焰手,應(yīng)用程序如果沒有完成對一個已經(jīng)就緒的文件描述符進(jìn)行IO操作糟描,那么之后每次select調(diào)用還是會將這些文件描述符通知進(jìn)程
epoll實現(xiàn):
epoll在內(nèi)核中會維護(hù)一個紅黑樹和一個雙向鏈表,紅黑樹存放通過epoll_ctl方法向epoll對象中添加進(jìn)來的事件书妻,所以不需要每次調(diào)用epoll_wait都全量復(fù)制所有的事件結(jié)構(gòu)船响。雙向鏈表存放就緒的事件,所有添加到epoll中的事件都會與設(shè)備(網(wǎng)卡)驅(qū)動程序建立回調(diào)關(guān)系躲履,也就是說见间,當(dāng)相應(yīng)的事件發(fā)生時會調(diào)用這個回調(diào)方法,這個回調(diào)方法在內(nèi)核中叫ep_poll_callback,它會將發(fā)生的事件添加到rdlist雙鏈表中工猜。調(diào)用epoll_wait就會直接返回鏈表中的就緒事件米诉,效率高。
select適合少量活躍連接篷帅,一般幾千。
epoll適合大量不太活躍的連接。
如果有大量活躍連接可以使用多進(jìn)程+select师郑。