一, 程序,線程?
程序是具有一定獨立功能的,在計算機中已經運作的程式的實體。在linux2.4以前,程序是基本運作的機關,在隻是線程的系統中,線程才是最基本的運作機關,而程序隻是線程的容器,程式本身隻是指令,資料及其組織形式的描述,程序才是程式的真正運作執行個體。若幹程序有可能在同一程式相關,且每個程序皆可以同步或異步的方式獨立運作。現代計算機系統可在同一時間内以程序的形式将多個程式加載到儲存器中,并借由時間共享,以在一個處理器上表現出同時運作的感覺,同樣的,使用多線程技術(每一個線程都代表一個程序内的一個獨立執行上下文)的作業系統或計算機架構,同樣程式的平行線程,可在多cpu主機或網絡上真正同時運作。
二, 常見Web服務方式
一個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操作
本文轉自 小新銳 51CTO部落格,原文連結:http://blog.51cto.com/13407306/2056602,如需轉載請自行聯系原作者