操做系統I/O模型及輪詢技術演變

原本是想要介紹Node.js的輪詢技術,可是在這以前先了解下操做系統I/O模式的演進,有助於以後的一些理解,操做系統對於I/O的處理一般是有兩步html

  • 應用程序先發起系統調用待數據就緒
  • 將數據從內核緩衝區拷貝到應用緩衝區

Github技術博客: Node.js技術棧node

快速導航

面試指南

  • I/O複用輪詢技術select和epoll的區別?,參考:#

同步阻塞IO

從應用程序開始系統調用->數據就緒,進行拷貝->拷貝結束,這之間應用程序都處於等待狀態,不能作其它事情,直到將數據拷貝到用戶空間或出錯才返回,咱們稱之爲阻塞I/O模式。linux

圖片描述

同步非阻塞IO

相比於同步阻塞I/O模式,同步非阻塞I/O在每次調用以後,若是數據沒有就緒就會當即返回,以後重複調用來檢查I/O操做是否就緒,這對CPU資源是一個極其浪費的操做,直到數據就緒將數據從內核拷貝到用戶空間,返回成功指示給到應用程序。git

Read:就是一種實現,經過重複輪詢I/O來判斷。github

圖片描述

IO多路複用

連接(Socket)併發大的狀況,上面兩種就不適合了,前面一個處理不完,後面就只能乾等,這裏就用到了I/O多路複用,下圖所示相比較前兩種,分爲了兩步,先進行select數據就緒後,在調用recvfrom進行真正的I/O讀寫操做。它的高級之處還在於可以一個線程同時處理多個Socket。面試

圖片描述

I/O多路服用有多種實現模式:selectpollepollkqueue數據庫

  • select

經過輪詢檢查在文件描述符上設置的標識位來進行判斷,Select的輪詢至關於在數據庫中查找一條記錄沒有創建索引,對全部的Socket進行所有遍歷,這對CPU是浪費的。另外Select還有一個限制,對於單個進程所能打開的文件描述符最大隻能是1024,那麼基於Select的輪詢技術最多也只能很好的處理1000併發的吞吐量,能夠查看上一個10年,著名的C10K併發鏈接問題編程

  • poll

poll和select在實現上沒有本質的區別,相比較select,poll基於鏈表來實現,沒有了最大連接1024的限制。可是當文件描述符多了以後,每次調用都會對連接進行線性遍歷,性能仍是十分低下的。數組

  • epoll

是linux下效率最高的I/O事件通知機制,沒有最大連接限制,經過callbak回調通知機制,不在是每次調用都對連接進行線性遍歷,這樣就不會隨着文件描述符的增長致使效率降低。服務器

在1GB內存的機器上能監聽大約10萬個端口,遠超過select的1024限制,具體能夠在服務器上查看cat /proc/sys/fs/file-max

  • kqueue

與epoll相似,僅存於FreeBSD(一種類UNIX操做系統)。

信號驅動IO

僅在Unix上支持,與I/O多路複用相比避免了select的阻塞輪詢。應用程序進行系統調用後當即返回,處理其它事物,在數據就緒以後系統會發送一個SIGIO信號到應用程序,應用進程開始讀取數據。

圖片描述

異步IO模型

異步I/O模型是目前最理想的一種形式,應用程序發起系統調用後無需等待直接返回當前調用狀態,進行後續的其它任務,結果由內核完成I/O操做以後經過回調通知到咱們的應用程序,中間沒有阻塞過程。

在Linux2.6以後增長了異步I/O的實現方式 AIO,可是不多系統可以實現。

圖片描述

select和epoll的區別

若是問到輪詢技術的實現通常也會考察select和epoll的區別

  • 在操做方式上select採用了線性遍從來查找,連接多了以後能夠想象一下在一個諾大的數組中每次經過遍從來鎖定一個連接,是多麼的消耗性能。epoll則不須要遍歷,採用的是回調機制,能夠看做一個HashTable,來鎖定一個對象是很快的。對於文件描述符(最大鏈接數)select限制爲1024,epoll則沒有這個限制,一般在1G內存的機器上所能支持的鏈接數爲10W左右。
  • 操做系統支持上來看,目前流行的高性能Web服務器Nginx是基於epoll來實現高併發,固然若是你的連接很小的狀況下區別仍是不大的select也能知足,若是是大流量、高併發狀況epoll目前仍是首選模型。

白話風格

白話風格(小明與妹子的邂逅)講解操做系統I/O模型及輪詢技術演變

故事標題:小明與妹子的邂逅
情節介紹:小明在校園一次文藝晚會上邂逅了一位妹子,在只得知妹子名字、手機號的狀況下,通過幾天的苦苦追尋,歷經千山萬水,終得美人歸!
演員介紹:男一號@小明、女一號@妹子、串場@門衛大爺

  1. 同步阻塞I/O模式

小明電話相約妹子在校門口,而後小明很專注、不見到妹子不回家,期間沒有作任何事情,一直在等待!

  1. 同步非阻塞I/O模式

小明電話相約妹子在校門口,妹子還沒準備好(出門前化妝幾小時。。。),這時候的小明很執着,每隔一下子給妹子發個信息直到妹子準備好了。

  1. I/O多路複用模式

    1. select 小明電話相約妹子在校門口,委託門衛select大爺幫忙,select大爺很敬業每出去一我的都會進行詢問,可是select大爺有個限制最多隻能詢問1024個。
    2. poll poll相似於select功能,不一樣的是poll大爺沒有1024限制,能夠一直堅持,可是當poll大爺超過1024,詢問的愈來愈多以後就顯得愈來愈精疲力盡了。
    3. epoll 小明電話相約妹子在校門口,委託門衛epoll大爺幫忙,epoll大爺不在是每一個詢問,規定每一個人出入校門必須帶上學生證,這樣opoll大爺就是知道哪一個是小明的女神了,epoll大爺找到女神以後在電話通知小明。
  2. 信號驅動I/O模式

小明電話相約妹子在校門口,此時妹子回覆說我還沒準備好(出門前化妝幾小時。。。),這個時候小明也沒去,而是先去幹其它事情了,等妹子準備好以後電話通知小明,我已經準備好了,小明這個時候纔去校門口等着和妹子的約會。

  1. 異步I/O模式

小明告訴妹子咱們在校園門口相約,以後小明沒有在那乾等了,而是先回宿舍休息會或者和朋友在打會球等等,妹子到校門口以後電話通知小明,我已經來啦。

下一節Node.js中的EventLoop

做者:五月君
連接:www.imooc.com/article/285…
來源:慕課網
Github: Node.js技術棧

參考指南

相關文章
相關標籤/搜索