五種I O 模式

2021-06-07 02:17:18 字數 1962 閱讀 6612

1.阻塞i/o 模式是最普遍使用的i/o 模式。大部分程式使用的都是阻塞模式的i/o 。缺

省的,乙個套接字建立後所處於的模式就是阻塞i/o 模式。

對於乙個udp 套接字來說,資料就緒的標誌比較簡單:

l 已經收到了一整個資料報

l 沒有收到。

而tcp 這個概念就比較複雜,需要附加一些其他的變數。

在圖6-4 中,乙個程序呼叫recvfrom ,然後系統呼叫並不返回知道有資料報到達本地

系統,然後系統將資料拷貝到程序的快取中。(如果系統呼叫收到乙個中斷訊號,則它的

呼叫會被中斷)

我們稱這個程序在呼叫recvfrom 一直到從recvfrom 返回這段時間是阻塞的。當recvfrom

正常返回時,我們的程序繼續它的操作。

2.當我們將乙個套接字設定為非阻塞模式,我們相當於告訴了系統核心:「當我請求的

i/o 操作不能夠馬上完成,你想讓我的程序進行休眠等待的時候,不要這麼做,請馬上返

回乙個錯誤給我。」

我們可以參照圖6-5 來描述非阻塞模式i/o 。

我們開始對recvfrom 的三次呼叫,因為系統還沒有接收到網路資料,所以核心馬上返

回乙個ewouldblock的錯誤。第四次我們呼叫recvfrom 函式,乙個資料報已經到達了,

核心將它拷貝到我們的應用程式的緩衝區中,然後recvfrom 正常返回,我們就可以對接收

到的資料進行處理了。

當乙個應用程式使用了非阻塞模式的套接字,它需要使用乙個迴圈來不聽的測試是否

乙個檔案描述符有資料可讀(稱做polling)。應用程式不停的polling 核心來檢查是否i/o

操作已經就緒。這將是乙個極浪費cpu 資源的操作。這種模式使用中不是很普遍。

3.在使用i/o 多路技術的時候,我們呼叫select()函式和poll()函式,在呼叫它們的時候

阻塞,而不是我們來呼叫recvfrom(或recv)的時候阻塞。圖6-6 說明了它的工作方式。

當我們呼叫select 函式阻塞的時候,select 函式等待資料報套接字進入讀就緒狀態。當

select 函式返回的時候,也就是套接字可以讀取資料的時候。這時候我們就可以呼叫recvfrom

函式來將資料拷貝到我們的程式緩衝區中。

和阻塞模式相比較,select()和poll()並沒有什麼高階的地方,而且,在阻塞模式下只需

要呼叫乙個函式:讀取或傳送,在使用了多路復用技術後,我們需要呼叫兩個函式了:先

呼叫select()函式或poll()函式,然後才能進行真正的讀寫。

多路復用的高階之處在於,它能同時等待多個檔案描述符,而這些檔案描述符(套接

字描述符)其中的任意乙個進入讀就緒狀態,select()函式就可以返回。

4.訊號驅動 i/o 模式

我們可以使用訊號,讓核心在檔案描述符就緒的時候使用sigio 訊號來通知我們。我

們將這種模式稱為訊號驅動i/o 模式。

使用這種模式,我們首先需要允許套接字使用訊號驅動i/o ,還要安裝乙個sigio 的處

理函式。在這種模式下,系統呼叫將會立即返回,然後我們的程式可以繼續做其他的事

情。當資料就緒的時候,系統會向我們的程序傳送乙個sigio 訊號。這樣我們就可以在sigio

訊號的處理函式中進行i/o 操作(或是我們在函式中通知主函式有資料可讀)。

5.非同步 i/o 模式

當我們執行在非同步i/o 模式下時,我們如果想進行i/o 操作,只需要告訴核心我們要

進行i/o 操作,然後核心會馬上返回。具體的i/o 和資料的拷貝全部由核心來完成,我們

的程式可以繼續向下執行。當核心完成所有的i/o 操作和資料拷貝後,核心將通知我們的

程式。非同步i/o 和訊號驅動 i/o 的區別是:

l 訊號驅動 i/o 模式下,核心在操作可以被操作的時候通知給我們的應用程式傳送

sigio 訊息。

l 非同步 i/o 模式下,核心在所有的操作都已經被核心操作結束之後才會通知我們的

應用程式。

五種IO模型

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

五種IO模型

阻塞io 在核心將資料準備好之前,系統呼叫會一直等待,所有的套接字都是預設阻塞方式 非阻塞io 如果核心還沒有將資料準備好,系統呼叫會直接返回,並返回錯誤碼 非阻塞io往往需要以迴圈的方式反覆讀寫檔案描述符,這個過程稱為輪詢,對cpu的浪費較大,一般只在特定的場景下使用 訊號驅動io 核心將資料準備...

五種IO模型

1.五種io分為阻塞i o 非阻塞i o 訊號驅動io 多路復用i o select 和 poll 非同步i o 前四個被稱為同步io。1.1乙個輸入操作一般有兩個不同的階段 2.1阻塞io 程序呼叫recvfrom,從使用者態轉到核心態,直到資料準備好且拷貝到應用程式緩衝區或者出錯 最常見的錯誤是...