epoll為什麼這麼快 非常形象

2021-06-03 01:15:25 字數 1268 閱讀 1318

epoll是多路復用io(i/o multiplexing)中的一種方式,但是僅用於linux2.6以上核心,在開始討論這個問題之前,先來解釋一下為什麼需要多路復用io.

以乙個生活中的例子來解釋.

假設你在大學中讀書,要等待乙個朋友來訪,而這個朋友只知道你在a號樓,但是不知道你具體住在**,於是你們約好了在a號樓門口見面.

如果你使用的阻塞io模型來處理這個問題,那麼你就只能一直守候在a號樓門口等待朋友的到來,在這段時間裡你不能做別的事情,不難知道,這種方式的效率是低下的.

現在時代變化了,開始使用多路復用io模型來處理這個問題.你告訴你的朋友來了a號樓找樓管大媽,讓她告訴你該怎麼走.這裡的樓管大媽扮演的就是多路復用io的角色.

進一步解釋select和epoll模型的差異.

select版大媽做的是如下的事情:比如同學甲的朋友來了,select版大媽比較笨,她帶著朋友挨個房間進行查詢誰是同學甲,你等的朋友來了,於是在實際的**中,select版大媽做的是以下的事情:

int n = select(&readset,null,null,100);

for (

int i = 0; n > 0; ++i)

} epoll版大媽就比較先進了,她記下了同學甲的資訊,比如說他的房間號,那麼等同學甲的朋友到來時,只需要告訴該朋友同學甲在哪個房間即可,不用自己親自帶著人滿大樓的找人了.於是epoll版大媽做的事情可以用如下的**表示:

n=epoll_wait(epfd,events,20,500);

for(i=0;i在epoll中,關鍵的資料結構epoll_event定義如下:

typedef union epoll_data  epoll_data_t;

struct epoll_event ; 

可以看到,epoll_data是乙個union結構體,它就是epoll版大媽用於儲存同學資訊的結構體,它可以儲存很多態別的資訊:fd,指標,等等.有了這個結構體,epoll大媽可以不用吹灰之力就可以定位到同學甲.

別小看了這些效率的提高,在乙個大規模併發的伺服器中,輪詢io是最耗時間的操作之一.再回到那個例子中,如果每到來乙個朋友樓管大媽都要全樓的查詢同學,那麼處理的效率必然就低下了,過不久樓底就有不少的人了.

對比最早給出的阻塞io的處理模型, 可以看到採用了多路復用io之後, 程式可以自由的進行自己除了io操作之外的工作, 只有到io狀態發生變化的時候由多路復用io進行通知, 然後再採取相應的操作, 而不用一直阻塞等待io狀態發生變化了.

從上面的分析也可以看出,epoll比select的提高實際上是乙個用空間換時間思想的具體應用.

epoll為什麼比select這麼快

epoll是多路復用io i o multiplexing 中的一種方式,但是僅用於linux2.6以上核心,在開始討論這個問題之前,先來解釋一下為什麼需要多路復用io.以乙個生活中的例子來解釋.假設你在大學中讀書,要等待乙個朋友來訪,而這個朋友只知道你在a號樓,但是不知道你具體住在 於是你們約好了...

epoll為什麼快

epoll是linux下的一種i o多路復用的操作方式,是event poll的意思 i o多路復用,舉個栗子,在酒吧,乙個服務員,10個顧客在喝酒,服務員有這麼幾種服務方式 服務員從第乙個顧客開始問,你要酒嗎,再問第二個,你要酒嗎,依次問下去,問完一圈,再從頭開始,服務員就是不停的在bbb,要酒嗎...

Redis為什麼這麼快?

今天我在乙個技術群裡提出乙個問題 redis為什麼這麼快,redis的那些特性能夠支援了它的高併發?之前的我,也只是知道redis是記憶體資料庫,所以讀取速度快 io使用的是多路復用,使用乙個執行緒來輪詢描述符,減少了執行緒上下文的切換,將資料庫的開 關 讀 寫都轉化成了時間,所以io時也有加速。雖...