淺談Linux下的五種I/O模型

 

 1、關於I/O模型的引出安全

  咱們都知道,爲了OS的安全性等的考慮,進程是沒法直接操做I/O設備的,其必須經過系統調用請求內核來協助完成I/O動做,而內核會爲每一個I/O設備維護一個buffer以下圖所示:異步

   

  整個請求過程爲: 用戶進程發起請求,內核接受到請求後,從I/O設備中獲取數據到buffer中,再將buffer中的數據copy到用戶進程的地址空間,該用戶進程獲取到數據後再響應客戶端。spa

  在整個請求過程當中,數據輸入至buffer須要時間,而從buffer複製數據至進程也須要時間。所以根據在這兩段時間內等待方式的不一樣,I/O動做能夠分爲如下五種模式:blog

  (1) 阻塞I/O (Blocking I/O)進程

  (2) 非阻塞I/O (Non-Blocking I/O)事件

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

  (4) 信號驅動的I/O (Signal Driven I/O)內存

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

 

2、關於I/O模型的劃分請求

  阻塞:調用的進程一直處於等待狀態,直到操做完成。

  非阻塞:在內核的數據還未準備好時,會當即返回,進程能夠去幹其餘事情。

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

    

 

3、I/O模型分述

  一、阻塞I/O

     

  從上圖能夠看到在整個過程當中,當用戶進程進行系統調用時,內核就開始了I/O的第一個階段,準備數據到緩衝區中,當數據都準備完成後,則將數據從內核緩衝區中拷貝到用戶進程的內存中,這時用戶進程才解除block的狀態從新運行。

  因此,Blocking I/O的特色就是在I/O執行的兩個階段都被block了。

 

  二、非阻塞I/O

     

  從上圖能夠看到在I/O執行的兩個階段中,用戶進程只有在第二個階段被阻塞了,而第一個階段沒有阻塞,可是在第一個階段中,用戶進程須要盲等,不停的去輪詢內核,看數據是否準備好了,所以該模型是比較消耗CPU的。

 

  三、I/O複用

    

   從上圖能夠看到在I/O複用模型中,I/O執行的兩個階段都是用戶進程都是阻塞的,可是兩個階段是獨立的,在一次完整的I/O操做中,該用戶進程是發起了兩次系統調用。

 

  四、信號驅動的I/O

     

  該模型也叫做基於事件驅動的I/O模型,能夠看到該模型中,只有在I/O執行的第二階段阻塞了用戶進程,而在第一階段是沒有阻塞的。

  乍看起來感受和非阻塞模型很類似,其實不一樣之處就在於,該模型在I/O執行的第一階段,當數據準備完成以後,會主動的通知用戶進程數據已經準備完成,即對用戶進程作一個回調。該通知分爲兩種,一爲水平觸發,即若是用戶進程不響應則會一直髮送通知,二爲邊緣觸發,即只通知一次。

 

  五、異步I/O

     

  在該模型中,當用戶進程發起系統調用後,馬上就能夠開始去作其它的事情,而後直到I/O執行的兩個階段都完成以後,內核會給用戶進程發送通知,告訴用戶進程操做已經完成了。

 

4、五種模型總結

   

相關文章
相關標籤/搜索