web優化必須瞭解的原理之I/o的五種模型和web的三種工做模式nginx
===========================================web
圖解五種I/O模型apache
圖解web支持的三種工做模式併發
===========================================異步
五種I/O:
ide
1)阻塞I/0函數
2)非阻塞I/O性能
3)I/O複用優化
4)事件(信號)驅動I/Ospa
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的理解,可能並不精確,但願廣大博友多多指點,謝謝指教