1、
針對非阻塞i/o執行的系統呼叫總是立即返回,而不管事件是否已經發生。如果事件沒有立即發生,這些系統呼叫返回-1,和出錯情況是一樣的。此時必須根據errno來區分這兩種情況。
很顯然,我們只能在事件已經發生的情況下操作非阻塞i/o,才能提高程式效率,因此,非阻塞i/o通常需要和其他的i/o通知機制一起使用,比如i/o復用和sigio訊號。
2、i/o復用是最常使用的i/o通知機制。他指的是,應用程式通過i/o復用函式向核心註冊一組事件,核心通過i/o復用函式把其中就緒的事件通知給應用程式。linux常用的i/o復用函式有select、poll、epoll_wait
3、阻塞i/o、i/o復用和訊號驅動i/o都是都是同步i/o模型。因為在這三種i/o模型中,i/o的讀寫操作都是在i/o事件發生之後,由應用程式來完成的。而非同步i/o模型則不同,使用者可以直接對i/o執行讀寫操作,這些操作告訴核心讀寫緩衝區的位置,以及i/o操作完成之後核心通知應用程式的方式。非同步i/o的讀寫操作總是立即返回,無論i/o是否是阻塞的,因為真正的讀寫操作已經由核心接管。
也就是說,(1)同步i/o模型要求使用者**自行執行i/o操作(將資料從核心緩衝區讀入使用者緩衝區,或者將資料從使用者緩衝區寫入核心緩衝區)
(2)而非同步i/o機制則由核心來執行實際的i/o操作(資料在核心緩衝區和使用者緩衝區之間的移動是由核心在後台完成的)
最後,總結一句話,可以認為,同步i/o向應用程式通知i/o就緒事件,而非同步i/o向應用程式通知i/o完成事件。
兩種高效的事件處理模型:reactor模式和proactor模式。一般情況下,同步i/o用於實現reactor模式,非同步i/o用於實現proactor模式。
4、兩種高效的併發模式:半同步/半非同步 和 領帶著/追隨者
如果程式是計算密集型的,併發程式設計並沒有太大優勢,反而由於任務的切換降低效率。但如果程式是i/o密集型的,比如經常讀寫檔案,訪問資料庫等,則情況就不一樣了。由於i/o操作的速度遠遠沒有cpu計算速度快,所以讓程式阻塞於i/o操作將浪費大量的cpu時間。如果程式有多個執行執行緒,在當前被i/o操作所阻塞的執行執行緒可以主動放棄的cpu(或者由作業系統來排程),並將執行權交給其他的執行緒,這樣一來,cpu就可以用來做更多有意義的事情(除非所有執行緒都被i/o操作阻塞),而不是等待i/o操作完成。
併發程式設計主要有多程序和多執行緒兩種。
併發模式是指i/o處理單元和多個邏輯單元之間協調完成任務的方法,伺服器主要有兩種併發模式:半同步/半非同步 和 領帶著/追隨者
(1)半同步/半非同步
這裡的「同步」和「非同步」與i/o模型中的「同步」和「非同步」是完全不同的概念。
a)在i/o模型中,「同步」和「非同步」區分的是核心向應用程式通知的是何種i/o事件(就緒事件還是完成事件),以及由誰來真正的執行i/o操作(是應用程式自己完成還是交由核心來完成)
b)在併發模式中,「同步」指的是程式完全按照**序列順序執行;「非同步」指的是程式的執行需要由系統事件來驅動。常見的有中斷、訊號等。
如下圖:
按同步方式執行的執行緒稱為同步執行緒,按非同步方式執行的執行緒稱為非同步執行緒。顯然非同步執行緒的執行效率高。但是編寫非同步執行的程式相對複雜,,難於除錯和擴充套件,而且不太適應於大量的併發。而同步執行緒則相反,雖然效率低,實時性較差,但是邏輯簡單。因此對於伺服器這種既要求較好的實時性,又要求同時能處理多個客戶的請求的應用程式,我們就應該同時使用同步執行緒和非同步執行緒,即半同步/半非同步模式。
在半同步/半非同步模式中,同步執行緒用於處理客戶邏輯,非同步執行緒用於處理i/o事件。非同步執行緒監聽到客戶請求後,將其封裝成請求物件並插入請求佇列中。請求佇列將通知某個工作在同步模式的工作執行緒來讀取並處理請求物件。
結合考慮兩種事件處理模式和集中i/o模型,則半同步/半非同步模式模式存在多種變體,其中最主要的是
半同步/半反應堆模式(half-sync/half-reactive)
半同步/半反應堆模式(half-sync/half-reactive):
半同步/半反應堆模式(half-sync/half-reactive)採用的事件處理模式是reactor模式:要求工作執行緒自己從socket上讀取客戶請求和往socket上寫入伺服器應答。這就是該模式中名稱half-sync/half-reactive的含義。
I O模型 I O模型
輸入 輸出 i o 是在主存和外部裝置 例如磁碟驅動器 終端和網路 之間複製資料的過程。輸入操作是從 i o 裝置複製資料到主存,輸出資料是從主存複製資料到 i o 裝置。描述的是使用者執行緒與核心的互動方式 描述的是使用者執行緒呼叫核心 i o 操作的方式 乙個 i o 操作其實分成了兩個步驟 發...
併發程式設計之IO模型
io模型 io指的是輸入輸出,模型指的是套路,io模型就是指所有可以實現輸入輸出的套路。io的分類 io分為兩類 1.本地io 指的是輸入輸出到本地計算機,比如寫入硬碟,從硬碟中讀取資料等 2.網路io 指的是輸入輸出到網路計算機,速度遠比本地io慢。網路io是非常重要的乙個知識點 io模型一共分為...
非同步通知I O模型和重疊I O模型
理解非同步通知i o模型 理解同步和非同步 同步i o的缺點及非同步方式的解決方案 理解非同步通知i o模型 實現非同步通知i o模型 wsaeventselect函式和通知 include intwsaeventselect socket s,wsaevent heventobject,long ...