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

2022-02-09 13:18:33 字數 2933 閱讀 2676

1 阻塞i/o(blocking io)

應用程式呼叫乙個io函式,導致應用程式阻塞,如果資料已經準備好,從核心拷貝到使用者空間,否則一直等待下去。乙個典型的讀操作流程大致如下圖,當使用者程序呼叫recvfrom這個系統呼叫時,kernel就開始了io的第乙個階段:準備資料,就是資料被拷貝到核心緩衝區中的乙個過程(很多網路io資料不會那麼快到達,如沒收乙個完整的udp包),等資料到作業系統核心緩衝區了,就到了第二階段:將資料從核心緩衝區拷貝到使用者記憶體,然後kernel返回結果,使用者程序才會解除block狀態,重新執行起來。blocking io的特點就是在io執行的兩個階段使用者程序都會block住;

2 非阻塞i/o(nonblocking io)

非阻塞i/o模型,我們把乙個套介面設定為非阻塞就是告訴核心,當所請求的i/o操作無法完成時,不要將程序睡眠,而是返回乙個錯誤。這樣我們的i/o操作函式將不斷的測試資料是否已經準備好,如果沒有準備好,繼續測試,直到資料準備好為止。在這個不斷測試的過程中,會大量的占用cpu的時間

當使用者程序發出read操作時,如果kernel中資料還沒準備好,那麼並不會block使用者程序,而是立即返回error,使用者程序判斷結果是error,就知道資料還沒準備好,使用者可以再次發read,直到kernel中資料準備好,並且使用者再一次發read操作,產生system call,那麼kernel 馬上將資料拷貝到使用者記憶體,然後返回;所以nonblocking io的特點是使用者程序需要不斷的主動詢問kernel資料好了沒有。

阻塞io乙個執行緒只能處理乙個io流事件,要想同時處理多個io流事件要麼多執行緒要麼多程序,這樣做效率顯然不會高,而非阻塞io可以乙個執行緒處理多個流事件,只要不停地詢所有流事件即可,當然這個方式也不好,當大多數流沒資料時,也是會大量浪費cpu資源;為了避免cpu空轉,引進**(select和poll,兩種方式相差不大),**可以觀察多個流i/o事件,空閒時會把當前執行緒阻塞掉,當有乙個或多個i/o事件時,就從阻塞態醒過來,把所有io流都輪詢一遍,於是沒有io事件我們的程式就阻塞在select方法處,即便這樣依然存在問題,我們從select出只是知道有io事件發生,卻不知道是哪幾個流,還是只能輪詢所有流,epoll這樣的**就可以把哪個流發生怎樣的io事件通知我們;

3 i/o多路復用模型(io multiplexing)

i/o多路復用就在於單個程序可以同時處理多個網路連線io,基本原理就是select,poll,epoll這些個函式會不斷輪詢所負責的所有socket,當某個socket有資料到達了,就通知使用者程序,這三個functon會阻塞程序,但和io阻塞不同,這些函式可以同時阻塞多個io操作,而且可以同時對多個讀操作,寫操作io進行檢驗,直到有資料到達,才真正呼叫io操作函式,呼叫過程如下圖;所以io多路復用的特點是通過一種機制乙個程序能同時等待多個檔案描述符,而這些檔案描述符(套接字描述符)其中任意乙個進入就緒狀態,select函式就可以返回。

io多路復用的優勢在於併發數比較高的io操作情況,可以同時處理多個連線,和bloking io一樣socket是被阻塞的,只不過在多路復用中socket是被select阻塞,而在阻塞io中是被socket io給阻塞。

4訊號驅動i/o模型

可以用訊號,讓核心在描述符就緒時傳送sigio訊號通知我們,通過sigaction系統呼叫安裝乙個訊號處理函式。該系統呼叫將立即返回,我們的程序繼續工作,也就是說它沒有被阻塞。當資料報準備好讀取時,核心就為該程序產生乙個sigio訊號。我們隨後既可以在訊號處理函式中呼叫recvfrom讀取資料報,並通知主迴圈資料已經準備好待處理。特點:等待資料報到達期間程序不被阻塞。主迴圈可以繼續執行,只要等待來自訊號處理函式的通知:既可以是資料已準備好被處理,也可以是資料報已準備好被讀取

5非同步i/o(asynchronous io)

非同步io告知核心啟動某個操作,並讓核心在整個操作(包括將核心資料複製到我們自己的緩衝區)完成後通知我們,

呼叫aio_read(posix非同步i/o函式以aio_或lio_開頭)函式,給核心傳遞描述字、緩衝區指標、緩衝區大小(與read相同的3個引數)、檔案偏移以及通知的方式,然後系統立即返回。我們的程序不阻塞於等待i/0操作的完成。當核心將資料拷貝到緩衝區後,再通知應用程式。 

使用者程序發起read操作之後,立刻就可以開始去做其它的事。而另一方面,從kernel的角度,當它受到乙個asynchronous read之後,首先它會立刻返回,所以不會對使用者程序產生任何block。然後,kernel會等待資料準備完成,然後將資料拷貝到使用者記憶體,當這一切都完成之後,kernel會給使用者程序傳送乙個signal,告訴它read操作完成了

UNIX五種I O模型

unix的五種i o模型 阻塞式i o模型,非阻塞式i o模型,i o復用模型,訊號驅動式i o模型,非同步i o模型。這些概念看似容易混淆,從unix底層的i o操作的角度來分析,其實不難理解。乙個輸入操作通常包括以下兩個階段 等待資料準備好 包括等待資料從網路中到達,資料到達後存入核心的緩衝區中...

Unix下五種IO模型簡介

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

五種IO模型

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