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.網卡將報文發送響應給用戶
進程無法直接操作I/O(爲了安全的原因),需要通過系統調用,進程請求內核完成I/O。
內核會爲每個I/O設備維護一個buffer,將數據複製進buffer中有一個等待的過程。將buffer中的數據複製到進程也有一個等待的過程。根據等待模式不同I/O動作可分爲五種類型。
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機制)實現的。