借鑑提煉自
在網路程式設計中,肯定會有讀寫io的問題。這時候就會有了五種io模型。取自unix network programing
五種模型分別是,阻塞,非阻塞,io多路復用(select poll epoll),訊號驅動,非同步。
這五種有時候容易出現混亂。網上部落格寫的也比較晦澀,不過看那本書裡的圖形倒是很有趣很清晰。源自於文末的部落格。
在io處理中有兩個重要步驟,1,提出io需求,等待核心準備好。2,從核心傳送資料回來。從核心拷貝回程序。
這時候兩步,區分出了五種io區別。
1.阻塞,在1,2時都是在等待核心返回,函式就停在那了。用的都是recvfrom系統呼叫。
2.非阻塞,在1,時候立馬返回乙個錯誤值,這樣時不時的去迴圈查詢,直到,返回ok,之後再處理2。
3.io多路復用,在1,的時候呼叫了select,poll,epoll等函式,這時候就是交給他們處理了。合理後呼叫recvfrom處理2.這裡呼叫了兩個系統呼叫。
4.訊號驅動,這個用的比較少了。不多說了。
5.非同步,在1,的時候每一步都有乙個返回。而到2處理完直接返回。
同步非同步,同步是指程序阻塞直到io操作完成,而非同步是立馬完成,這兒的io操作是recvfrom系統呼叫。
阻塞非阻塞關鍵看呼叫者也就是左邊是否立馬得到結果。同步非同步考慮的是雙方的關係。阻塞非阻塞是我這個請求者的狀態。而同步非同步是雙方的溝通方式。
比如買書,阻塞非阻塞,阻塞是一定要等到最後好的結果。非阻塞是立馬得到結果無論好壞。而同步非同步則是兩邊的溝通方式,一直在這等著結果,還是有結果後打**通知?
這篇部落格還有一段例子很不錯。分別總結了1,2,3,5四種例子。生動形象。
最後,再舉幾個不是很恰當的例子來說明這四個io model:
有a,b,c,d四個人在釣魚:
a用的是最老式的魚竿,所以呢,得一直守著,等到魚上鉤了再拉桿;
b的魚竿有個功能,能夠顯示是否有魚上鉤,所以呢,b就和旁邊的mm聊天,隔會再看看有沒有魚上鉤,有的話就迅速拉桿;
c用的魚竿和b差不多,但他想了乙個好辦法,就是同時放好幾根魚竿,然後守在旁邊,一旦有顯示說魚上鉤了,它就將對應的魚竿拉起來;
d是個有錢人,乾脆僱了乙個人幫他釣魚,一旦那個人把魚釣上來了,就給d發個簡訊。
阻塞I O,非阻塞I O
拿 socket舉例。當read資料時,如果這時沒有資料可讀,阻塞i o會一直等待有資料讀,資料從kernel copy 到socket的buffer後返回 非阻塞i o會立即返回,但如果有資料可讀,非阻塞i o也是等資料從kernel copy 到socket的buffer後返回。以上是阻塞與非阻...
UNIX網路程式設計 非阻塞式IO總結
這兩周又一次忙於專案,不過好在我的考試基本都結束了,所以抓緊速度把unp這本書全部過了一遍,程式全部編譯執行過,重點本分自己手敲了部分 現在回來補上自己部落格拉下的債了。這一部分在unp書上的做法實際上時非常複雜的,為了實現非阻塞的io讀寫,創立了兩個緩衝區,1.用來讀取來自客戶端上的輸入,並輸出給...
網路IO之阻塞 非阻塞 同步 非同步總結
對於乙個network io 以read為例 它會涉及到兩個系統物件,乙個是呼叫該io的process or thread 另乙個是系統核心 kernel 當乙個read操作發生時,它會經歷兩個階段 1.等待資料準備 waiting for the data to be ready 2.將資料從核心...