I O模型 和 兩種高效的事件處理模式

2021-10-23 14:10:35 字數 1960 閱讀 8884

io模型

i/o復用是最常使用的i/o通知機制。它指的是,應用程式通過i/o復用函式向核心註冊一組事件,核心通過i/o復用函式把其中就緒的事件通知給應用程式。linux上常用的i/o復用函式是select,poll和epoll_wait。需要指出的是,i/o復用函式本身是阻塞的,它們能提高程式效率的原因在於它們具有同時監聽多個i/o事件的能力。

sigio訊號也可以用來報告i/o事件。我們可以為乙個目標檔案描述符制定宿主程序,那麼被指定的宿主程序將捕獲到sigio訊號。這樣,當目標檔案描述符上有事件發生時,signo訊號的訊號處理函式將被觸發,我們也就可以在該訊號處理函式中對目標檔案描述符執行非阻塞i/o操作了。

從理論上說,阻塞i/o、i/o復用和訊號驅動i/o都是同步i/o模型。因為這三種i/o模型中,i/o的讀寫操作,都是在i/o事件發生之後,由應用程式來完成的。而posix規範所定義的非同步i/o模型則不同。

對非同步i/o而言,使用者可以直接對i/o執行讀寫操作,這些操作告訴核心使用者讀寫緩衝區的位置,以及i/o操作完成之後核心通知應用程式的方式。非同步i/o的讀寫操作總是立即返回,而不論i/o是否是阻塞的,因為真正的讀寫操作已經由核心接管。也就是說,同步i/o模型要求使用者**自行執行i/o操作(將資料從核心緩衝區讀入使用者緩衝區,或將資料從使用者緩衝區寫入核心緩衝區),而非同步i/o機制則由核心來執行i/o操作(資料在核心緩衝區和使用者緩衝區之間的移動是由核心在」後台「完成的)。你可以這樣認為,同步i/o向應用程式通知的是i/o就緒事件,而非同步i/o向應用程式通知的是i/o完成事件。

linux環境中,aio.h標頭檔案中定義的函式提供了對非同步i/o的支援。

作為總結,我們將上面討論的幾種i/o模型的差異列於下圖中

兩種高效的事件處理模式

這兩種高效的事件處理模式為:reactor和proactor

> 隨著網路設計模式的興起,reactor和proactor事件處理模式應運而生。同步i/o模型通常用於實現reactor模式,非同步i/o模型則用於實現proactor模式。

reactor模式

reactor是這樣一種模式,他要求主線程(i/o處理單元,下同)只負責監聽檔案描述符上是否有事件發生,有的話就立即將該事件通知工作執行緒(邏輯單元,下同)。

除此之外,主線程不做任何其他實質性的工作。讀寫資料,接受新的連線,以及處理客戶請求均在工作執行緒中完成。

使用同步i/o模型(以epoll_wait為例)實現的reactor模式的工作流程是:

主線程往epoll核心事件表中註冊socket上的度就緒事件。

主線程呼叫epoll_wait等待socket上有資料可讀。

當socket上有資料可讀時,epoll_wait通知主線程。主線程則將socket可讀事件放入請求佇列。

睡眠在請求佇列上的某個工作執行緒被喚醒,它從socket讀取資料,並處理客戶請求,然後往epoll核心事件表中註冊該socket上的寫就緒事件。

主線程呼叫epoll_wait等待socket可寫

當socket可寫時,epoll_wait通知主線程。主線程將socket可寫事件放入請求佇列。

睡眠在請求佇列上的某個工作執行緒被喚醒,它往socket上寫入伺服器處理客戶請求的結果。

下圖總結了reactor模式的工作流程

圖中,工作執行緒從請求佇列中取出事件後,將根據事件的型別來決定如何處理它:對於可讀事件,執行讀操作和處理請求的操作;對於可寫事件,執行寫資料的操作。

因此上圖所示的reactor模式中,沒必要區分所謂的「讀工作執行緒」 和 「寫工作執行緒」

參考書籍 《linux高效能伺服器程式設計》

共模電壓和差模電壓兩種理解方式

共模電壓和差模電壓理解 我們需要的是整個有意義的 輸入訊號 要把兩個輸入端看作 整體 就像初中時平面座標需要用 x,y 兩個數表示,而到了高中或大學就只要用乙個 數 v,但這個 v 是由 x,y 兩個數構成的 向量 而共模 差模正是 輸入訊號 整體的屬性,差分輸入可以表示為vi vi vi 也可以表...

註冊事件的兩種方式

element.onclick function 特點 傳統的註冊方式具有唯一性,即同乙個元素同一事件只能設定乙個函式,如果寫了多個函式,最後乙個函式會把之前的函式都覆蓋掉。證明 傳統註冊事件 button 方法監聽註冊事件 button ie9 attachevent button var btn...

JMS的兩種程式設計模型

jms訊息機制主要分為兩種模型 ptp模型和pub sub模型。ptp模型 point to point 對點模型 每乙個訊息傳遞給乙個訊息消費者,保證訊息傳遞給訊息消費者,且訊息不會同時被多個消費者接收。如果訊息消費者暫時不在連線範圍內,jms會自動保證訊息不會丟失,直到訊息消費者進入連線,訊息將...