Linux 五種IO模型 形象生動的例子

2021-09-23 20:52:03 字數 2378 閱讀 3424

在學習五種io模型之前,我們先看這樣乙個例子:大家都釣過魚吧,釣魚最主要的步驟實際就兩個:1. 等

2. 拉桿。 釣魚的時候你會發現有這樣幾種人:

張三(此人比較沉悶安靜):就一直緊緊盯著魚鉤,一動不動,誰也不理,有魚就拉桿

李四(此人生性活潑好動):在等魚的時候,一會去找張三聊天,「嘿,哥們,釣幾條魚了」,張三不理他,一會玩玩手機,然後去看看魚鉤,又去找張三聊天,又玩玩手機,看看魚鉤…

王五(此人非常非常機智):在魚竿處掛了乙個鈴鐺,然後就去做自己的事情了,鈴鐺響拉魚竿,鈴鐺不響就一直做自己的事情

趙六(此人是個土豪):開著大卡車來釣魚,放了一百個魚竿,哪個杆有魚拉哪個杆

田七(此人是個大土豪):專車司機來送,他告訴司機,你去給我釣魚,我要回去處理事情,順便給司機乙個盆,乙個**,等盤滿了給我打**就行。然後就開著車走了

上面五個人各有各的特點,但都有共同點,比如,前四個人在釣到魚之後做的事情都一樣,也就是拉桿,但釣到魚之前做的事情不一樣,有的做自己事情,有的一直等,還有的可以增加釣到魚的概率。

一定記住:io分兩步:1. 等 2. 資料搬遷(資料拷貝)

實際上,阻塞也分為兩步:1. 設定為非r狀態 2. 新增到等待佇列中

阻塞呼叫是指呼叫結果返回之前,當前執行緒會被掛起(執行緒進入非可執行狀態,在這個狀態下,cpu不會給執行緒分配時間片,即執行緒暫停執行)。函式只有在得到結果之後才會返回。

字面意思實際就可以理解:如果此時沒有資料,就一直在這等待阻塞,直到有資料為止才返回。

想一想是不是和上面張三是一樣的,一直在死等魚的到來,誰來理我都不管,對外界不聞不問,沒有魚我就等,等到魚上鉤的時候才繼續往下

正好與阻塞io相反,如果沒有資料,不會死等,而是立即返回,去做自己的事情,等一段時間再來看是都有資料,如果還是沒有,繼續做自己的事情…

想想上面例子的李四,是不是就是這樣,如果沒有魚,我就玩玩手機,找張三說說話,雖然張三不理他,過段時間,看看是否有魚上鉤,如果沒有,繼續玩玩手機,找張三,還是不理他…

a.非阻塞式io往往需要我們系統不能阻塞的等待資料,需要向下進行一些必要的邏輯

b.由於非阻塞的原因,往往需要輪詢的方式來進行呼叫。

c. 可以看到非阻塞式並沒有一直阻塞在系統呼叫,而是不斷返回,但是只有資料從核心拷貝到使用者才返回成功

顧名思義:也就是如果有資料的時候,就通知一下程序(給程序發個訊號),說我有資料了,你來拷貝吧。

上面例子的王五就是這樣幹的,掛了乙個鈴鐺,就相當於訊號,當鈴鐺響的時候就表示魚到了,就去拉魚竿。

a. 訊號驅動io是通過訊號的捕捉來提示資料準備好了,而不是io胸痛呼叫自己去等待,這樣就節省了大量的等待時間

b. 訊號驅動只花費了將資料從核心拷貝到使用者空間的時間

多路復用io實際上就是同時監控大量的檔案描述符,哪個就緒就處理哪個。

這實際上就是我麼使用到的 select

和上面趙六的做法是不是就是一樣的,同時放很多個魚竿,哪個魚竿有魚就收哪個

a. 可以看到io多路復用似乎和阻塞式沒有什麼不同,都是先等待資料的準備,然後將資料從核心拷貝到使用者。

b. 但是可以發現select可以監聽多個檔案描述符的就緒

非同步io就是我把事情都交給別人做,等完成了,給我個訊號(不負責資料的拷貝)

上述田七的做法就是非同步io,給司機個盆,**,等盆滿的時候就給田七打個**

a. 可以看到非同步io是在核心拷貝到使用者空間之後,才通知應用程式,你該去處理資料了。

a. io分為兩步:第一步 等,第二步資料拷貝

b. 前四種io都是同步io,都需要進行等,只不過等的方式不一樣,並且任務都是自己發起,自己等待,最後自己拷貝

Linux五種IO模型

五種io模型的理解 阻塞io 收銀台等待 在核心將資料準備好之前,系統調 會 直等待.所有的套接字,預設都是阻塞 式.阻塞io 座位等待 往往需要程式設計師迴圈的方式反覆嘗試讀寫檔案描述符,這個過程稱為輪詢.訊號驅動io 等服務員叫 核心將資料準備好的時候,使 sigio訊號通知應用程式進行io操作...

Linux 五種I O模型

首先,我們來看一下,有哪五種i o模型 小結 非阻塞i o,記錄鎖,系統v流機制,i o多路轉接 也叫i o多路復用 readv和writev函式以及儲存對映i o mmap 這些統稱為高階i o。首先,我們來看乙個介面 int fcntl int fd,int cmd,arg 功能 針對描述符提供...

關於網路程式設計五種IO模型的形象比喻

網摘錄如下比喻,實在生動貼切.老陳有乙個在外地工作的女兒,不能經常回來,老陳和她通過信件聯絡。他們的信會被郵遞員投遞到他們的信箱裡,這和socket模型非常類似。select模型 老陳非常想看到女兒的信。以至於他每隔10分鐘就下樓檢查信箱,看是否有女兒的信 在這種情況下,下樓檢查信箱 然後回到樓上耽...