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,如需轉載請自行聯系原作者