講一下epoll

先認識一下select 和 poll

select 過程:

首先將一個連接分配一個channel,然後註冊到select上面,每一個channel都有一個自己的狀態,表示自己是否就緒,然後select 會遍歷所有的channel,然後判斷是都就緒,就緒的話就開啓一個線程爲他分配一個buffer,然後去讀寫操作

poll : 因爲select能存儲的fd,只有1024個,所以會限制併發量。select 採用類似於數組存儲 fd, 而 poll 是採用鏈表存儲的。所以沒有限制 fd的大小。

 

epoll : 和上面兩種完全不一樣,epoll 是採用的回調的形式出發 fd 進入就緒鏈表。是這樣的,首先 epoll_ctl 會將所有的fd都加載到 內核並綁定一個 回調函數,也就是當 fd 進入就緒狀態他就會觸發回調函數,將 fd 加入到就緒鏈表裏面,然後就 epoll_wait 就只需要判斷 就緒鏈表是不是爲空就可以。 然後去啓動線程分配buffer。

關於epoll的兩種觸發模式 

LT: 水平觸發,意思就是隻要是讀寫狀態就會觸發。

ET:邊緣觸發,只有在從不可讀寫變成可讀寫纔會觸發。

一般epoll都是使用ET模式的,因爲 LT會對 一個 fd  有多次觸發。 而ET不會。

 

 

另外說一下, nginx,nginx是基於epoll 的 IO多路複用。

nginx有一個master進程,還有多個worker進程。wroker進程數 = cpu個數。

 master負責監控 worker進程,如果worker掛掉了,master就會啓動一個worker。(fork)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章