日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

关于epoll,select,poll的理解

發(fā)布時間:2023/12/9 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于epoll,select,poll的理解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。