I/O模型


wKioL1VlpZXwaLyTAAFH1kMkDpE529.jpg


1. 客戶發起請求,

2. 服務器網卡接受到報文轉交給內核TCP/IP協議棧處理;

3. 內核將請求轉發給工作在用戶空間的Web daemon

4. Web daemon根據用戶請求的頁面,向內核申請系統調用完成I/O操作

5. 內核發現web服務器進程請求的是一個存放在硬盤上的資源,因此通過驅動程序連接磁盤

6. 內核調度磁盤,獲取需要的資源

7. 內核將資源複製到內核buffer中,並通知Web daemon

8. Web daemon通過系統調用取得資源,並將其複製到進程自己的緩衝區中

9. Web daemon形成響應,通過系統調用再次發給內核以響應用戶請求

10.內核將封裝報文,併發送到網卡

11.網卡將報文發送響應給用戶





wKiom1VloEniTgvjAACiwAmppeY559.jpg


進程無法直接操作I/O(爲了安全的原因),需要通過系統調用,進程請求內核完成I/O

內核會爲每個I/O設備維護一個buffer,將數據複製進buffer中有一個等待的過程。將buffer中的數據複製到進程也有一個等待的過程。根據等待模式不同I/O動作可分爲五種類型。




wKiom1VloEmgBm2MAAI6y4BsObY392.jpg


blocking I/O

進程請求內核完成I/O時一直處於阻塞狀態,直到數據從buffer複製到進程後,內核喚醒進程。一個請求接入後不能再接收其它請求。

 

noblocking I/O

進程請求內核完成I/O時,等待數據複製到內核buffer過程中,一直測試數據是否準備好。從內核buffer複製到進程過程中,進程一直出於阻塞狀態。

 

I/O複用

進程向內核請求系統調用完成I/O,等待數據複製到內核buffer過程一直出於阻塞狀態。複製到內核buffer後。內核不再將內核buffer中數據複製到進程,而是進程再次請求系統調用,將內核buffer中數據複製到進程,這個過程中進程也出於阻塞狀態。

 

evetn-driven I/O

進程向內核請求系統調用完成I/O,等待數據複製到內核buffer過程不阻塞,而是複製完成後通知進程。複製到內核buffer後。內核不再將內核buffer中數據複製到進程,而是進程再次請求系統調用,將內核buffer中數據複製到進程,這個過程中進程處於阻塞狀態。

 

AIO

整個過程都不阻塞,而是將內核buffer中數據複製到進程後通知進程,進程可以直接取數據響應。




web服務的常見工作方式:

多進程方式:每個進程處理一個請求,生成、銷燬進程間切換消耗大量CPU資源的內存資源,當負載較大,性能顯著降低。

優點: 比較穩定,各進程之間是獨立的,單個進程問題不會影響其他進程。

缺點: 資源佔用大


多線程方式:一個進程生成多個線程,每個線程處理一個請求。由於線程開銷明顯小於進程,而且部分資源還可以共享,因此效率較高

優點:效率高,低開銷。線程間部分數據是共享的,且線程生成與線程間的切換所需資源開銷比進程間切換小得多。

缺點:穩定性差,負載高時,線程快速切換過快會造成線程抖動,且線程過多會造成服務器不穩定。


異步方式:使用非阻塞方式處理請求,一個進程或一個線程處理多個請求。

優點:性能好,一個進程或線程處理多個請求,沒有線程間切換。

缺點:穩定差,某個進程或線程出錯,可能導致大量請求無法處理



apache三種工作模式

我們都知道Apache有三種工作模塊,分別爲prefork、worker、event。

  prefork:多進程,每個請求用一個進程響應,這個過程會用到select機制來通知。

 worker:多線程,一個進程生成多個線程,每個線程響應一個請求,但通知機制還是select不過可以接受更多的請求。

  event:基於異步I/O模型,一個進程或線程,每個進程或線程響應多個用戶請求,它是基於事件驅動(也就是epoll機制)實現的。


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