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的理解,可能並不精確,希望廣大博友多多指點,謝謝指教


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