1. 程式人生 > 其它 >I/O 模型

I/O 模型

目錄

參考資料

1.阻塞式IO

一個輸入操作通常包括2個階段:

  1. 等待資料準備好
  2. 從核心向程序拷貝資料

Linux 作業系統和驅動程式執行在核心空間,應用程式執行在使用者空間。兩者不能簡單地使用指標傳遞資料,因為Linux使用的虛擬記憶體機制,使用者空間的資料可能被換出,當核心空間使用使用者空間指標時,對應的資料可能不在記憶體中。使用者空間的記憶體對映採用段頁式,而核心空間有自己的規則;

2.非阻塞IO

當核心無資料準備好時,程序呼叫 receiveFrom 方法不是阻塞而是返回一個EWOULDBLOCK錯誤,程序輪詢(polling)呼叫receiveFrom 方法直到返回成功。

3.IO 複用模型

有了IO複用,我們就可以阻塞在呼叫 select 或者 poll上,而不是阻塞在真正的 I/O 系統呼叫上。

4.訊號驅動式 IO 模型

讓核心在描述符就緒時用 SIGIO 訊號通知我們,稱為“訊號驅動式 IO”。

首先開啟套接字的訊號驅動式IO功能,並通過 sigaction 安裝一個訊號處理函式。該系統呼叫立即返回,我們的程序繼續工作。
當資料包準備好,核心為該程序產生一個 SIGIO 訊號。隨後可以在訊號處理函式中呼叫 recvFrom 讀取資料包,通知主迴圈資料已準備好待處理。
也可以立即通知主迴圈處理函式。

5.非同步 IO

呼叫 aio_read 函式給核心傳遞描述符,緩衝區指標,緩衝區大小(與 read 相同的三個引數)和檔案偏移,
並告訴核心當整個操作完成後通知我們。該系統呼叫立即返回,在等待 I/O 完成期間,程序不會被阻塞。

6. IO 模型的比較