IO多路復用機制:select、poll、epoll的區別
1.單個進程打開的文件描述符(fd文件句柄)不一致
select :有最大連接數限制數為1024,單個進程所能打開的最大連接數由FD_ZETSIZE宏定義。
poll:poll本質上與select沒有區別,但是它沒有最大連接數的限制,原因是它是基於鏈表來存儲的。
epoll:雖然連接有上限,但是很大,1G內存的機器可以打開10萬左右的連接,以此類推。
2.監聽Socket的方式不一致
select :輪詢的方式,一個一個的socket檢查過去,發現有socket活躍時才進行處理,當線性socket增多時,輪詢的速度將會變得很慢,造成線性造成性能下降問題。
poll:對select稍微進行了優化,只是修改了文件描述符,但是監聽socket的方式還是輪詢。
expoll:epoll內核中實現是根據每個fd上的callback函數來實現的,只有活躍的socket才會主動調用callback,通知expoll來處理這個socket。(會將連接的socket注冊到epoll中, 相當於socket的花名冊, 如果有一個socket活躍了, 會回調一個函數, 通知epoll,趕緊過來處理)
3.內存空間拷貝方式(消息傳遞方式)不一致
select:內核想將消息傳遞到用戶態,需要將數據從內核態拷貝到用戶態,這個過程非常的耗時
poll:同上
epoll:epoll的內核和用戶空間共享一塊內存,因此內存態數據和用戶態數據是共享的