原本是想要介紹Node.js的輪詢技術,可是在這以前先了解下操做系統I/O模式的演進,有助於以後的一些理解,操做系統對於I/O的處理一般是有兩步html
Github技術博客: Node.js技術棧node
I/O複用輪詢技術select和epoll的區別?
,參考:#從應用程序開始系統調用->數據就緒,進行拷貝->拷貝結束,這之間應用程序都處於等待狀態,不能作其它事情,直到將數據拷貝到用戶空間或出錯才返回,咱們稱之爲阻塞I/O模式。linux
相比於同步阻塞I/O模式,同步非阻塞I/O在每次調用以後,若是數據沒有就緒就會當即返回,以後重複調用來檢查I/O操做是否就緒,這對CPU資源是一個極其浪費的操做,直到數據就緒將數據從內核拷貝到用戶空間,返回成功指示給到應用程序。git
Read:就是一種實現,經過重複輪詢I/O來判斷。github
連接(Socket)併發大的狀況,上面兩種就不適合了,前面一個處理不完,後面就只能乾等,這裏就用到了I/O多路複用,下圖所示相比較前兩種,分爲了兩步,先進行select數據就緒後,在調用recvfrom進行真正的I/O讀寫操做。它的高級之處還在於可以一個線程同時處理多個Socket。面試
I/O多路服用有多種實現模式:select
、poll
、epoll
、kqueue
數據庫
經過輪詢檢查在文件描述符上設置的標識位來進行判斷,Select的輪詢至關於在數據庫中查找一條記錄沒有創建索引,對全部的Socket進行所有遍歷,這對CPU是浪費的。另外Select還有一個限制,對於單個進程所能打開的文件描述符最大隻能是1024,那麼基於Select的輪詢技術最多也只能很好的處理1000併發的吞吐量,能夠查看上一個10年,著名的C10K併發鏈接問題編程
poll和select在實現上沒有本質的區別,相比較select,poll基於鏈表來實現,沒有了最大連接1024的限制。可是當文件描述符多了以後,每次調用都會對連接進行線性遍歷,性能仍是十分低下的。數組
是linux下效率最高的I/O事件通知機制,沒有最大連接限制,經過callbak回調通知機制,不在是每次調用都對連接進行線性遍歷,這樣就不會隨着文件描述符的增長致使效率降低。服務器
在1GB內存的機器上能監聽大約10萬個端口,遠超過select的1024限制,具體能夠在服務器上查看cat /proc/sys/fs/file-max
與epoll相似,僅存於FreeBSD(一種類UNIX操做系統)。
僅在Unix上支持,與I/O多路複用相比避免了select的阻塞輪詢。應用程序進行系統調用後當即返回,處理其它事物,在數據就緒以後系統會發送一個SIGIO信號到應用程序,應用進程開始讀取數據。
異步I/O模型是目前最理想的一種形式,應用程序發起系統調用後無需等待直接返回當前調用狀態,進行後續的其它任務,結果由內核完成I/O操做以後經過回調通知到咱們的應用程序,中間沒有阻塞過程。
在Linux2.6以後增長了異步I/O的實現方式 AIO
,可是不多系統可以實現。
若是問到輪詢技術的實現通常也會考察select和epoll的區別
白話風格(小明與妹子的邂逅)講解操做系統I/O模型及輪詢技術演變
故事標題
:小明與妹子的邂逅
情節介紹
:小明在校園一次文藝晚會上邂逅了一位妹子,在只得知妹子名字、手機號的狀況下,通過幾天的苦苦追尋,歷經千山萬水,終得美人歸!
演員介紹
:男一號@小明、女一號@妹子、串場@門衛大爺
小明電話相約妹子在校門口,而後小明很專注、不見到妹子不回家,期間沒有作任何事情,一直在等待!
小明電話相約妹子在校門口,妹子還沒準備好(出門前化妝幾小時。。。),這時候的小明很執着,每隔一下子給妹子發個信息直到妹子準備好了。
I/O多路複用模式
信號驅動I/O模式
小明電話相約妹子在校門口,此時妹子回覆說我還沒準備好(出門前化妝幾小時。。。),這個時候小明也沒去,而是先去幹其它事情了,等妹子準備好以後電話通知小明,我已經準備好了,小明這個時候纔去校門口等着和妹子的約會。
小明告訴妹子咱們在校園門口相約,以後小明沒有在那乾等了,而是先回宿舍休息會或者和朋友在打會球等等,妹子到校門口以後電話通知小明,我已經來啦。
做者:五月君
連接:www.imooc.com/article/285…
來源:慕課網
Github: Node.js技術棧