UNIX五種I O模型

2022-07-24 11:36:10 字數 1684 閱讀 7051

unix的五種i/o模型:阻塞式i/o模型,非阻塞式i/o模型,i/o復用模型,訊號驅動式i/o模型,非同步i/o模型。這些概念看似容易混淆,從unix底層的i/o操作的角度來分析,其實不難理解。

乙個輸入操作通常包括以下兩個階段:

等待資料準備好;包括等待資料從網路中到達,資料到達後存入核心的緩衝區中。

從核心向程序複製資料。把資料從核心緩衝區複製到程序緩衝區。

下面要講的五種i/o模型實際上就是在這兩個階段中的阻塞策略不同。接下來以udp的recvfrom為例,進行說明。

blocking io,最直觀的i/o模型。應用程序呼叫recvfrom方法時,會進行阻塞,直到兩個階段都結束,資料複製到程序緩衝區時,方法才返回。成功返回後,應用程式再進行後續工作。流程如下圖所示:

此種模型下,recvfrom方法可立即返回。若核心資料沒有準備好,則返回乙個錯誤;若資料準備好,進行第二階段複製操作,再返回成功指示。流程如下圖所示:

該種模型較為少見,因為往往需要應用程式持續輪詢核心,看看操作有沒有準備就緒。這樣會耗費大量cpu時間。

i/o復用是生產中最常見的網路模型。呼叫select或者poll方法去檢視核心中資料是否準備好,準備完畢即返回,否則保持阻塞。但是請注意,select呼叫和recvfrom呼叫往往不在乙個執行緒中,所以此處的阻塞不會影響真正的io操作。當套接字可讀,select返回,**執行recvfrom,完成輸入操作。如下圖所示:

如果只是線性地看兩個階段是否有阻塞,io復用似乎沒什麼優勢。但實際上,使用select的優勢在於「多路復用」,即乙個selector等待多個檔案描述符。

訊號驅動式i/o模型,先通過sigaction呼叫安裝乙個訊號處理函式,並立即返回。當套接字可讀時,核心傳送sigio訊號通知應用程式,執行recvfrom方法執行io輸入。如下圖所示:

這種模型,在接收到sigio訊號之前,程序不會被阻塞。

前面四種io模型,實際上在第二階段(從核心緩衝區讀取資料到使用者緩衝區)都是阻塞的。而非同步i/o模型在兩個階段都是非阻塞的。即先告知核心啟動io操作,立即返回,在兩個階段(準備資料和讀取資料)全部完成時,核心傳送訊號通知使用者程序。如下圖所示:

各種i/o模型的比較

首先明確兩個概念:同步i/o非同步i/o,posix對其定義如下:

五種模型的對比如下

五種i/o模型中,除了非同步i/o,其餘四種或多或少都有阻塞的過程。因此,按照posix的標準,阻塞式i/o模型、非阻塞式i/o模型、i/o復用模型、訊號驅動式i/o模型,都稱之為同步i/o。

IO模型之一 Unix的五種I O模型

1 阻塞i o blocking io 應用程式呼叫乙個io函式,導致應用程式阻塞,如果資料已經準備好,從核心拷貝到使用者空間,否則一直等待下去。乙個典型的讀操作流程大致如下圖,當使用者程序呼叫recvfrom這個系統呼叫時,kernel就開始了io的第乙個階段 準備資料,就是資料被拷貝到核心緩衝區...

Unix下五種IO模型簡介

阻塞式io 阻塞式io模型是最一般的io模型。在這種模型下,io函式呼叫 read write等等 都會在操作完成或者發生中斷以後才會返回。如果指定的運算元據沒有就緒,或者操作需要的外部條件 比如緩衝區 尚未符合要求,操作會一直阻塞。非阻塞式io 相對於阻塞式io模型,非阻塞式io的特點就是 當所請...

五種IO模型

再講io模型之前,給大家舉乙個釣魚的例子。張三去釣魚,他釣魚的時候一動不動,一直看著魚竿,看有沒有動,無論是誰叫他,他都不動,只有等魚梢動了 魚上鉤了 他才會動 李四去釣魚,他沒有像張三那樣瓷楞著,只是時不時的輪詢檢查魚竿有沒有動。一直在動。王五也來釣魚,他就比較聰明了,在魚竿上掛個鈴鐺,只要鈴鐺響...