1. 程式人生 > >5種I/O模型

5種I/O模型

 一、關於I/O模型的引出

  我們都知道,為了OS的安全性等的考慮,程序是無法直接操作I/O裝置的,其必須通過系統呼叫請求核心來協助完成I/O動作,而核心會為每個I/O裝置維護一個buffer。如下圖所示:

   

  整個請求過程為: 使用者程序發起請求,核心接受到請求後,從I/O裝置中獲取資料到buffer中,再將buffer中的資料copy到使用者程序的地址空間,該使用者程序獲取到資料後再響應客戶端。

  在整個請求過程中,資料輸入至buffer需要時間,而從buffer複製資料至程序也需要時間。因此根據在這兩段時間內等待方式的不同,I/O動作可以分為以下五種模式:

  (1) 同步阻塞I/O (Blocking I/O)

  (2) 同步非阻塞I/O (Non-Blocking I/O)

  (3) I/O複用(I/O Multiplexing)

  (4) 訊號驅動的I/O (Signal Driven I/O)

  (5) 非同步I/O (Asynchrnous I/O)

二、關於I/O模型的劃分

  阻塞:呼叫的程序一直處於等待狀態,直到操作完成。

  非阻塞:在核心的資料還未準備好時,會立即返回,程序可以去幹其他事情。

  從同步非同步,以及阻塞、非阻塞兩個維度來劃分來看:

    

三、

1.同步阻塞I/O

在呼叫 read 系統呼叫時,應用程式會阻塞並對核心進行上下文切換。直有得到結果之後才會解除阻塞並返回

2.同步非阻塞I/O

 發出呼叫後,程式不會阻塞,但是需要不斷輪詢去檢視資料是否已經準備好,所以該過程會大量消耗CPU

3.I/O複用

使得我們能同時監聽多個I/O事件,將I/O事件新增到select/poll/epoll系統呼叫上,程序阻塞在select上,而不是read/write系統呼叫上,當有任意一個I/O事件有資料,select就返回。呼叫2次系統呼叫select 和read

4.訊號驅動

首先開啟套接字的訊號驅動式I/O功能,並通過sigaction系統呼叫安裝一個訊號處理函式。改系統呼叫將立即返回,我們的程序繼續工作,也就是說他沒有被阻塞。當資料報準備好讀取時,核心就為該程序產生一個SIGIO訊號。我們隨後就可以在訊號處理函式中呼叫read讀取資料報,並通知主迴圈資料已經準備好待處理,也可以立即通知主迴圈,讓它讀取資料報

優點:不阻塞

缺點:訊號佇列溢位

5.非同步I/O

讀請求會立即返回,說明 read 請求已經成功發起了。在後臺完成讀操作時,應用程式然後會執行其他處理操作。當 read 的響應到達時,就會產生一個訊號或執行一個基於執行緒的回撥函式來完成這次 I/O 處理過程。

發出一個呼叫就返回了,沒有得到結果,而是被呼叫者通過訊號或者回調函式來處理這個I/O