高效能伺服器程式框架1 I O模型

2021-09-25 15:50:25 字數 1996 閱讀 8586

在學習linux高效能伺服器程式框架時,學到了i/o模型。

linux下的五種i/o模型:

關於同步與非同步,阻塞與非阻塞的概念,在我以前的部落格裡面有詳細的介紹,戳這裡啦!

程序會一直阻塞,直到資料拷貝完成

針對阻塞i/o執行的系統呼叫可能因為無法立即完成而被作業系統掛起,直到等待的事件發生為止。

比如,客戶端通過 connect 向伺服器發起連線時,connect 將首先傳送同步報文段給伺服器,然後等待伺服器返回確認報文段。如果伺服器的確認報文段沒有立即到達客戶端,則 connect 呼叫將被掛起,直到客戶端收到確認報文段並喚醒 connect 呼叫。

socket 的基礎 api 中,可能被阻塞的系統呼叫包括 accept、send、 recv 和 connect。

如下圖:在呼叫 recv(recvfrom) 函式時,發生在核心中等待資料和複製資料過程。

非阻塞i/o執行的系統呼叫則總是立即返回,而不管事件是否已經發生。

如果事件沒有立即發生,這些系統呼叫就返回-1,和出錯的情況一樣。此時我們必須根據 errno 來區分這兩種情況。

對 accept、send 和 recv 而言,事件未發生時 ermo 通常被設定成 eagain (意為「再來一次」),或者ewouldblock ( 意為「期望阻塞」);對 connect 而言,erno 則被設定成 einprogress (意為「在處理中」)。

如下圖:

很顯然,我們只有在事件已經發生的情況下,操作非阻塞i/o (讀、寫等),才能提高程式的效率。因此,非阻塞i/o通常要和其他i/o通知機制一起使用,比如i/o復用和sigio訊號。

i/o復用是最常使用的io通知機制。

i/o復用指應用程式通過i/o復用函式向核心註冊一組事件,核心通過io復用函式把其中就緒的事件通知給應用程式。

linux 上常用的i/o復用函式是 select、poll 和 epoll wait 。需要指出的是,i/o復用函式本身是阻塞的,它們能提高程式效率的原因在於其具有同時監聽多個i/o事件的能力。

如下圖:

兩次呼叫,兩次返回 

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

如下圖:

資料拷貝的時候程序無需阻塞

使用者可以直接對i/o執行讀寫操作,這些操作告訴核心使用者讀寫緩衝區的位置,以及i/o操作完成之後核心通知應用程式的方式。

非同步io的讀寫操作總是立即返回,而不論i/o是否是阻塞的,因為真正的讀寫操作已經由核心接管。

也就是說,同步i/o模型要求使用者**自行執行i/o操作(將資料從核心緩衝區讀入使用者緩衝區,或將資料從使用者緩衝區寫入核心緩衝區);而非同步io機制則由核心來執行i/o操作(資料在核心緩衝區和使用者緩衝區之間的移動是由核心在「後台」完成的)。

可以這樣認為,同步i/o向應用程式通知的是i/o就緒事件,而非同步i/o向應用程式通知的是i/o完成事件。linux 環境下,aio.h 標頭檔案中定義的函式提供了對非同步i/o的支援。

如下圖:

傳送門:

高效能伺服器程式框架2——事件處理模式

高效能伺服器程式框架3——併發模式

Linux 高效能伺服器程式框架

伺服器解構主要分為如下三個主要模組 1 i o處理單元。接收客戶端傳送的資料都屬於i o處理單元。2 邏輯單元。接收到資料之後進行的一些處理都屬於邏輯單元。3 儲存單元。如下圖所示 伺服器程式設計框架 1 c s模型 c就是客戶端,s就是伺服器。所以這個模型也稱客戶端 伺服器模型。c s模型如下圖所...

伺服器程式框架之1 伺服器模型

期末的時候做完開題報告,用了半個寒假投了一篇英文 出去。兩本書籍已經閱讀完畢,現總結高效能伺服器程式框架內容,分四篇文章介紹伺服器模型 i o模型 四種i o模型 兩種高效事件處理模式和兩種高效的併發模式。正文開始 1.c s模型 圖 1 c s模型 c s模型的邏輯很簡單。伺服器期待後,首先建立乙...

高效能伺服器設計1

先後檢視了 haproxy l7sw 和 lighttpd 的相關原始碼,無一例外,他們一致認為多路復用是效能最好的伺服器架構。事實也確實應該如此,程序的出現一方面就是為了儲存任務的執行上下文從而簡化應用程式設計,如果程式的邏輯結構不是很複雜,那麼用整個程序控制塊來儲存執 行上下文未免有些大材小用,...