天天看點

web優化必須了解的原理之I/o的五種模型和web的三種工作模式

web優化必須了解的原理之I/o的五種模型和web的三種工作模式

===========================================

圖解五種I/O模型

圖解web支援的三種工作模式

 五種I/O:

 1)阻塞I/0

 2)非阻塞I/O

 3)I/O複用

 4)事件(信号)驅動I/O

 5)異步I/O

為什麼要發起系統調用?

    因為程序想要擷取磁盤中的資料,而能和硬體打交道的隻能是核心,程序通知核心說我要磁盤中的資料,此過程就是系統調用。

一次I/O的完成的步驟

    當程序發起系統調用時,這個系統調用就進入核心模式,然後開始I/O操作

I/O操作分為兩個步驟;

    1、磁盤把資料裝載到核心的記憶體空間,

    2、核心的記憶體空間的資料copy到使用者的記憶體空間中(此過程是I/O發生的地方)

以下是程序擷取資料的詳細圖解過程;

<a target="_blank" href="http://blog.51cto.com/attachment/201309/205126317.png"></a>

     整個過程:此程序需要對磁盤中的資料進行操作,則會向核心發起一個系統調用,然後此程序,将會被切換出去,此程序會被挂起或者進入睡眠狀态,也叫不可中斷的睡眠,因為資料還沒有得到,隻有等到系統調用的結果完成後,則程序會被喚醒,繼續接下來的操作,從系統調用的開始到系統調用結束經過的步驟:

①程序向核心發起一個系統調用,

②核心接收到系統調用,知道是對檔案的請求,于是告訴磁盤,把檔案讀取出來

③磁盤接收到來着核心的指令後,把檔案載入到核心的記憶體空間裡面

④核心的記憶體空間接收到資料之後,把資料copy到使用者程序的記憶體空間(此過程是I/O發生的地方)

⑤程序記憶體空間得到資料後,給核心發送通知

⑥核心把接收到的通知回複給程序,此過程為喚醒程序,然後程序得到資料,進行下一步操作

I/O發生的地方才會出現阻塞或非阻塞

    阻塞:程序發起I/O調用,程序又不得不等待I/O的完成,此時CPU把程序切換出去,程序處于睡眠狀态則此過程為阻塞I/O

    阻塞I/O系統怎麼通知程序?

       I/O完成,系統直接通知程序,則程序被喚醒

阻塞I/O的圖解

<a target="_blank" href="http://blog.51cto.com/attachment/201309/205500239.png"></a>

  非阻塞:程序發起I/O調用,I/O自己知道需過一段時間完成,就立即通知程序進行别的操作,則為非阻塞I/O

非阻塞I/O,系統怎麼通知程序?

   每隔一段時間,問核心資料是否準備完成,系統完成後,則程序擷取資料,繼續執行(此過程也稱盲等待)

非阻塞I/O的圖解:

<a target="_blank" href="http://blog.51cto.com/attachment/201309/205605819.png"></a>

I/O複用的圖解:

<a target="_blank" href="http://blog.51cto.com/attachment/201309/205635176.png"></a>

事件(信号)驅動I/O的圖解:

    水準觸發的事件驅動機制;核心通知程序來讀取資料,程序沒來讀取資料,核心需要一次一次的通知程序;

     邊緣觸發的事件驅動機制;核心隻通知一次讓程序來讀取資料,程序可以在逾時時間之内随時來讀取資料。

     nginx就采用了邊緣觸發的事件驅動機制,這就是為什麼nginx的并發性比apache好,當然nginx的性能比apache好,還有其它方面,如nginx支援異步I/O,mmap(記憶體映射)等等

<a target="_blank" href="http://blog.51cto.com/attachment/201309/210003879.png"></a>

異步I/O的圖解:

<a target="_blank" href="http://blog.51cto.com/attachment/201309/210054915.png"></a>

  前四種I/O屬于同步操作,最後的一種則屬于異步操作

五種I/O模型的比較:

<a target="_blank" href="http://blog.51cto.com/attachment/201309/212627938.png"></a>

web的三種工作模式

Prefork工作原理

    主程序生成多個工作程序,由工作程序一對一的去響應用戶端的請求

  圖解Prefork工作原理:

<a target="_blank" href="http://blog.51cto.com/attachment/201309/084450144.png"></a>

Worker工作原理

    主程序生成多個工作程序,每個工作程序生成一個多個線程,每個線程去

響應用戶端的請求

   圖解Worker工作原理:

<a target="_blank" href="http://blog.51cto.com/attachment/201309/084552193.png"></a>

Event工作原理

    主程序生成多個工作程序,每個工程程序響應多個用戶端的請求,當接收

到用戶端的I/O操作請求後,把I/O操作交給核心執行,程序去響應其他客

戶端的請求,此程序最後接到核心的通知,然後通過此程序回複用戶端的

請求結果,通過事件回調函數

  圖解Event工作原理:

<a target="_blank" href="http://blog.51cto.com/attachment/201309/084608255.png"></a>

    本部落格是根據看相應的文章,寫出的自己對I/O的了解,可能并不精确,希望廣大博友多多指點,謝謝指教

本文轉自 jie783213507 51CTO部落格,原文連結:http://blog.51cto.com/litaotao/1289790,如需轉載請自行聯系原作者

繼續閱讀