1. 程式人生 > >web服務處理過程,各種I/O模型詳解,

web服務處理過程,各種I/O模型詳解,

web服務處理過程 各種i/o模型詳解

一, 進程,線程?

進程是具有一定獨立功能的,在計算機中已經運行的程序的實體。在linux2.4以前,進程是基本運作的單位,在只是線程的系統中,線程才是最基本的運作單位,而進程只是線程的容器,程序本身只是指令,數據及其組織形式的描述,進程才是程序的真正運行實例。若幹進程有可能在同一程序相關,且每個進程皆可以同步或異步的方式獨立運行。現代計算機系統可在同一時間內以進程的形式將多個程序加載到儲存器中,並借由時間共享,以在一個處理器上表現出同時運行的感覺,同樣的,使用多線程技術(每一個線程都代表一個進程內的一個獨立執行上下文)的操作系統或計算機架構,同樣程序的平行線程,可在多cpu主機或網絡上真正同時運行。

二, 常見Web服務方式

  1. 一個web請求處理的過程:

技術分享圖片

(1),用戶發起請求到服務器網卡;

(2),服務器網卡接收到請求後,轉交給內核處理;

(3),內核根據請求對應的套接字,將請求交給工作在用戶控件的web服務器進程;

(4),Web服務器進程根據用戶請求,向內核進行系統調用,申請獲取相應的資源;

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

(6),內核調度磁盤,獲取需要的資源;

(7),內核將資源存放在自己的緩沖區中,並通知web服務器進程;

(8),web服務器進程通過系統調用取得資源,並將其復制到進程自己的緩沖區中;

(9),web服務器進程形成響應,通過系統調用再次發給內核以響應自己用戶請求;

(10),內核將響應發給網卡;

(11),網卡發送響應給用戶;

簡單來說:用戶請求—>送達用戶空間—>系統調用—>內核空間—>內核到磁盤上讀取網頁的資源—>返回到用戶空間—>響應給用戶。

2.三種工作模型比較:

多進程方式:為每個請求啟動一個進程來處理,由於在操作系統中,生成進程,銷毀進程,進程間切換都很耗費CPU和內存,當負載高時,性能會明顯降低。

優點:穩定性!由於采用獨立進程處理地理請求,而進程之間是獨立的,單個進程問題不會影響其他進程,因此穩定性是最好的

缺點:占用資源!當請求過大時,需要大量的進程處理請求,進程生成,切換開銷很大,而且進程間資源是獨立的,造成內存重復利用。

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

優點:開銷較小!線程部分數據是共享的,且線程生成與線程間的切換所需要的資源開銷比進程間切換小的多

缺點:穩定性!線程切換過快可能造成線程抖動,且線程過多會造成服務器不穩定。

異步方式:使用非阻塞方式處理請求,是三種方式中開銷最小的,但異步方式雖然效率高,但要求也高,因為多任務之間的調度如果出現故障,就可能出現整體故障,因此使用異步工作的,一般是一些功能相對簡單,但卻符合服務器任務調度,且代碼中沒有影響調度的錯誤代碼存在的程序。

優點:性能最好!一個進程或線程處理多個請求,不需要額外開銷,性能最好,資源占用最低。

缺點:穩定性!某個進程或線程出錯,可能導致大量請求無法處理,甚至導致整個服務器宕機。

三, 各種I/O模型詳解

通過一的連接分析,我們知道工作在用戶空間的web服務器進程是無法直接操作I/O的,需要通過系統調用進行。

技術分享圖片

進程向內核進行系統調用申請I/O,內核將資源從IO調度到內核的buffer中(wait階段),內核還需將數據從內核buffer中復制(copy階段)到web服務器進程所在的用戶空間,才算完成一次IO調度,這幾個階段都是需要時間的,根據wait和copy階段的處理等待機制不同,可將I/O動作分為如下五中模式:

阻塞I/O:所有過程全阻塞

非阻塞I/O:如果沒有數據buffer,則立即返回

I/O復用(select和poll):在wait和copy階段分別阻塞(select和poll)

信號驅動I/O:在wait階段不阻塞,但在copy階段阻塞(信號驅動I/O,既通知)

異步I/O:完全無阻塞方式每當I/O完成時提供信號

阻塞和非阻塞:

阻塞和非阻塞指的是執行一個操作是等操作結束再返回,還是馬上返回。

阻塞:在出菜窗口等待,直到廚師炒完菜後將菜送到窗口,然後服務員再將菜送到用戶手中

非阻塞:等一會再到窗口來問廚師,某個菜好了沒,如果沒有就先處理其他事情,等會再去問一次;

同步和異步:

同步和異步是另外一個概念,它是事件本身的一個屬性。

服務員直接和廚師打交道,菜出來沒出來,服務員直接指導,但只有當廚師將菜送到服務員手上這個過程才算正常完成,這就是同步事件,同步只能以阻塞的方式去做。

有些餐館有專門的傳菜人員,當廚師炒好菜後,傳菜員將菜送到傳菜窗口,並通知服務員,這就變成異步了。異步也可以分為兩種:帶通知的和不帶通知的。前面說的屬於帶通知的,有些傳菜員可能幹活主動性不是很夠,不會主動通知你,你需要時不時關註一下狀態,這就是不帶通知的異步。異步 阻塞和非阻塞都是可以。非阻塞又分為兩種方式:主動查詢和被動接收消息,被動的效率更高,因為主動查詢裏絕大部分的查詢是在做無用功

全異步I/O:

回到I/O,不管是I還是O,對外設(磁盤)的訪問都可以分為請求和執行兩個階段,請求就是看外設的狀態信息,執行才是真正的I/O操作


web服務處理過程,各種I/O模型詳解,