epoll与select区别
文章一:
最近有朋友在面試的時候被問了select 和epoll效率差的原因,和一般人一樣,大部分都會回答select是輪詢、epoll是觸發(fā)式的,所以效率高。?
?
select 模式低效是由select的定義所決定的,與操作系統(tǒng)實現(xiàn)無關(guān),任何內(nèi)核在實現(xiàn)select時必須做輪循,才能知道這些socket的情況,這是會消耗 cpu的。此外,當(dāng)你擁有一個很大socket集的時候,盡管任一時間只有小部分的socket是"活躍"的,但每次你都不得不將所有的socket填入到一個FD_SET中,這也會消耗一些cpu,并且當(dāng)select返回后,處理業(yè)務(wù)時你可能還需要做“上下文映射”,同樣也會有一些性能影響,因此 select比epoll相對低效。?
文章二:
epoll是多路復(fù)用IO(I/O Multiplexing)中的一種方式,但是僅用于linux2.6以上內(nèi)核,在開始討論這個問題之前,先來解釋一下為什么需要多路復(fù)用IO.
以一個生活中的例子來解釋.
假設(shè)你在大學(xué)中讀書,要等待一個朋友來訪,而這個朋友只知道你在A號樓,但是不知道你具體住在哪里,于是你們約好了在A號樓門口見面.
如果你使用的阻塞IO模型來處理這個問題,那么你就只能一直守候在A號樓門口等待朋友的到來,在這段時間里你不能做別的事情,不難知道,這種方式的效率是低下的.
現(xiàn)在時代變化了,開始使用多路復(fù)用IO模型來處理這個問題.你告訴你的朋友來了A號樓找樓管大媽,讓她告訴你該怎么走.這里的樓管大媽扮演的就是多路復(fù)用IO的角色.
進(jìn)一步解釋select和epoll模型的差異.
select版大媽做的是如下的事情:比如同學(xué)甲的朋友來了,select版大媽比較笨,她帶著朋友挨個房間進(jìn)行查詢誰是同學(xué)甲,你等的朋友來了,于是在實際的代碼中,select版大媽做的是以下的事情:
int?n?=?select(&readset,NULL,NULL,100);
for?(int?i?=?0;?n?>?0;?++i)
{
???if?(FD_ISSET(fdarray[i],?&readset))
???{
??????do_something(fdarray[i]);
????? --n;
???}
}
epoll版大媽就比較先進(jìn)了,她記下了同學(xué)甲的信息,比如說他的房間號,那么等同學(xué)甲的朋友到來時,只需要告訴該朋友同學(xué)甲在哪個房間即可,不用自己親自帶著人滿大樓的找人了.于是epoll版大媽做的事情可以用如下的代碼表示:
n=epoll_wait(epfd,events,20,500);
????
for(i=0;i<n;++i)
{
????do_something(events[n]);
}
在epoll中,關(guān)鍵的數(shù)據(jù)結(jié)構(gòu)epoll_event定義如下:
typedef?union?epoll_data?{
????????????????void?*ptr;
????????????????int?fd;
????????????????__uint32_t?u32;
????????????????__uint64_t?u64;
????????}?epoll_data_t;
????????struct?epoll_event?{
????????????????__uint32_t?events;??????/*?Epoll?events?*/
????????????????epoll_data_t?data;??????/*?User?data?variable?*/
????????};? 可以看到,epoll_data是一個union結(jié)構(gòu)體,它就是epoll版大媽用于保存同學(xué)信息的結(jié)構(gòu)體,它可以保存很多類型的信息:fd,指針,等等.有了這個結(jié)構(gòu)體,epoll大媽可以不用吹灰之力就可以定位到同學(xué)甲.
別小看了這些效率的提高,在一個大規(guī)模并發(fā)的服務(wù)器中,輪詢IO是最耗時間的操作之一.再回到那個例子中,如果每到來一個朋友樓管大媽都要全樓的查詢同學(xué),那么處理的效率必然就低下了,過不久樓底就有不少的人了.
對比最早給出的阻塞IO的處理模型, 可以看到采用了多路復(fù)用IO之后, 程序可以自由的進(jìn)行自己除了IO操作之外的工作, 只有到IO狀態(tài)發(fā)生變化的時候由多路復(fù)用IO進(jìn)行通知, 然后再采取相應(yīng)的操作, 而不用一直阻塞等待IO狀態(tài)發(fā)生變化了.
從上面的分析也可以看出,epoll比select的提高實際上是一個用空間換時間思想的具體應(yīng)用.
總結(jié)
以上是生活随笔為你收集整理的epoll与select区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。