select,poll,epoll本質上都是同步I/O,因爲他們都需要在讀寫事件就緒後自己負責進行讀寫,也就是說這個讀寫過程是阻塞的
select
本质上是通过设置或检查存放fd标志位的数据结构进行下一步处理
select 的缺點1. 需要維護一個用來存放大量fd的數據結構,這樣會使得用戶空間和內核空間在傳遞該結構時複製開銷大
2. 對socket進行掃描時是線性掃描,即採用輪詢的方法,效率較低
3. select 支持的文件描述符數量太小了,32位機默認是1024個。64位機默認是2048.
poll
poll 的缺點:
1. 大量的fd的數組被整體複製於用戶態和內核地址空間之間,而不管這樣的複製是不是有意義
2. 如果報告了fd後,沒有被處理,那麼下次poll時會再次報告該fd
epoll
1. epoll支持水平觸發和邊緣觸發,最大的特點在於邊緣觸發,並且只會通知一次。
2. 還有一個特點是,epoll使用“事件”的就緒通知方式,通過epoll_ctl註冊fd,一旦該fd就緒,內核就會採用類似callback的回調機制來激活該 fd,epoll_wait 便可以收到通知
沒有最大併發連接的限制,能打開的FD的上限遠大於1024(1G的內存上能監聽約10萬個端口
內存拷貝,利用mmap()文件映射內存加速與內核空間的消息傳遞;即epoll使用mmap減少複製開銷
參考資料:
No comments:
Post a Comment