舉個例子:假設進程有10萬個TCP連接,且只有幾百個連接是有事件需要處理的。那麼在每一個時刻進程只需要處理這幾百個有事件需要處理的連接即可。
事件:即TCP連接上有數據需要交互。
select和poll這樣處理的:在某一時刻,進程收集所有的連接。並把所有連接的套接字傳給操作系統(這個過程其實是用戶態內存到內核態內存的複製),而由操作系統內核尋找這那幾百個有事件需要處理的連接並處理,然後返回數據給用戶。
Note:這個過程需要操作系統把全部的連接處理一邊,極大浪費系統資源。
而epoll是這樣做的:
1、調用epoll_creat函數建立一個epoll對象(一顆紅黑樹,一個準備就緒list鏈表)。
2、調用epoll_ctl函數把socket放到紅黑樹上,給內核中斷處理程序註冊一個回調函數,告訴內核,如果這個句柄的中斷到了,就把這個socket放到準備就緒list鏈表裏。
3、調用epoll_wait到準備就緒list鏈表中處理socket,並把數據返回給用戶。
Note:不需要把全部的連接處理一遍,只需要去list鏈表裏處理socket。