先認識一下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)