select_poll_epoll

select模型

說的通俗一點就是各個客戶端連接的文件描述符也就是套接字,都被放到了一個集合中,調用select函數之後會一直監視這些文件描述符中有哪些可讀,如果有可讀的描述符那麼我們的工作進程就去讀取資源。PHP 中有內置的函數來完成 select 系統調用。

poll模型:

poll 和 select 的實現非常類似,本質上的區別就是存放 fd 集合的數據結構不一樣。select 在一個進程內可以維持最多 1024 個連接,poll 在此基礎上做了加強,可以維持任意數量的連接。

但 select 和 poll 方式有一個很大的問題就是,我們不難看出來 select 是通過輪訓的方式來查找是否可讀或者可寫,打個比方,如果同時有100萬個連接都沒有斷開,而只有一個客戶端發送了數據,所以這裏它還是需要循環這麼多次,造成資源浪費。

所以後來出現了 epoll系統調用。

epoll模型:

epoll 是 select 和 poll 的增強版,epoll 同 poll 一樣,文件描述符數量無限制。

epoll是基於內核的反射機制,在有活躍的 socket 時,系統會調用我們提前設置的回調函數。而 poll 和 select 都是遍歷。

但是也並不是所有情況下 epoll 都比 select/poll 好,比如在如下場景:

在大多數客戶端都很活躍的情況下,系統會把所有的回調函數都喚醒,所以會導致負載較高。既然要處理這麼多的連接,那倒不如 select 遍歷簡單有效。

 

 

 

 

 

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