1. 程式人生 > >web優化必須瞭解的原理之I/o的五種模型和web的三種工作模式

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

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

圖解五種I/O模型

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

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

 五種I/O:

 1)阻塞I/0

 2)非阻塞I/O

 3I/O複用

 4)事件(訊號)驅動I/O

 5)非同步I/O

為什麼要發起系統呼叫?

    因為程序想要獲取磁碟中的資料,而能和硬體打交道的只能是核心,程序通知核心說我要磁碟中的資料,此過程就是系統呼叫。

一次I/O的完成的步驟

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

操作

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

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

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

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

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

①程序向核心發起一個系統呼叫,

②核心接收到系統呼叫,知道是對檔案的請求,於是告訴磁碟,把檔案讀取出來

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

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

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

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

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

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

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

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

阻塞I/O的圖解


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

阻塞I/O

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

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

非阻塞I/O的圖解:

I/O複用的圖解:

事件(訊號)驅動I/O的圖解:

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

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

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

非同步I/O的圖解:

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

五種I/O模型的比較:

web的三種工作模式

Prefork工作原理

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

  圖解Prefork工作原理:

Worker工作原理

    主程序生成多個工作程序,每個工作程序生成一個多個執行緒,每個執行緒去

響應客戶端的請求

   圖解Worker工作原理:

Event工作原理

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

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

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

請求結果,通過事件回撥函式

  圖解Event工作原理:

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