網路IO模型(同步非同步,阻塞非阻塞)

2021-07-13 09:06:21 字數 1773 閱讀 9942

摘錄自:

網路應用需要處理的無非兩大類問題:網路i/o,資料計算

網路io的模型大致有如下幾種:

同步模型:

阻塞非阻塞

多路復用

訊號驅動式

非同步io

網路io的本質是socket的讀取,socket在linux系統被抽象為流,io可以理解為對流的操作。

這個操作分為2個階段:

1 等待流資料準備

2 從核心向程序複製資料

對於socket流而言,

第一步通常涉及等待網路上的資料分組到達,然後被複製到核心的某個緩衝區

第二步把資料從核心緩衝區複製到應用程序緩衝區

阻塞,就是程序被休息,cpu處理其他程序去了。在網路io的時候,程序發起recvform系統呼叫,然後程序就被阻塞了,什麼也不幹,直到資料準備好,並且將資料從核心複製到使用者程序。最後程序再處理資料,在等待資料和處理資料這兩個階段,整個程序都被阻塞。不能處理別的網路io。

與阻塞io不一樣,非阻塞io在recvform系統呼叫之後,程序並沒有阻塞,核心會馬上返回給程序,如果資料還沒準備好,此時會返回乙個erro。程序在得到這個返回後,可以幹別的事情。然後再發起

recvform

系統呼叫。重複上面的過程,迴圈往復的進行

recvform

系統呼叫。這個過程稱為輪詢。輪詢檢查核心資料,直到資料準備好,再拷貝資料到程序,進行資料處理。拷貝資料的整個過程,程序仍然是阻塞態的。

非阻塞io的特點是使用者程序需要不斷的主動詢問kernel資料是否準備好

由於非阻塞的呼叫,輪詢佔據了很大一部分過程,會消耗大量的cpu時間。

如果輪詢不是程序的使用者態,而是有人幫忙就好了。這就是多路復用。

多路復用有2個特別的系統呼叫select或poll。

select呼叫時核心級別的,select輪詢相對非阻塞的輪詢在於—前者可以等待多個socket,當其中任何乙個socket的資料準備好,就能返回進行可讀。

多路復用有兩種阻塞,select或poll呼叫之後,會阻塞程序,與第一種阻塞不同,此時的select不是等到socket資料全部到達再處理,而是有了一部分資料就會呼叫使用者程序來處理。

多路復用的特點是通過一種機制乙個程序能同時等待io檔案描述符,核心監視這些檔案描述符(套接字描述符),其中任意乙個進入讀就緒狀態,select,poll,epoll函式就返回。

上述三種模式,在使用者程序進行系統呼叫的時候,在等待資料到來時,處理方式分別是,直接等待,輪詢,

select

或poll

輪詢。從整個

io過程來看,他們都是順序執行的,因此可以歸為同步模型。都是程序主動向核心檢查。

相對於同步io,非同步io不是順序執行。使用者程序進行aio_read呼叫之後,無論核心資料是否準備好,都會直接返回給使用者程序,然後使用者態程序可以去做別的事情。等到socket資料準備好,核心直接複製資料給程序,然後從核心向程序傳送通知。io兩個階段,程序都是非阻塞的。

同步和非同步,阻塞非阻塞,是兩組概念。

所謂同步就是在整個io過程,尤其是拷貝資料的過程是阻塞程序的,並且都是應用程序去檢查核心態。非同步則是整個

io過程,使用者程序都是非阻塞的,並且資料拷貝完成後,是核心傳送通知給使用者程序。

I O模型 阻塞 非阻塞 I O復用 同步 非同步

第一手教育 2016 10 14 11 25 i o模型不論在實際使用還是準備筆試面試中都是重要的內容,參考unix網路程式設計進行總結如下。尤其注意紅色標註處 1.明確i o考察的物件和流程 參考unix網路程式設計,乙個輸入操作通常包括兩個不同的階段 1 等待資料準備好 2 從核心向程序複製資料...

談談 IO模型 同步 非同步 阻塞 非阻塞

linux os中,有幾種常見的io模型 程式進行io讀 寫操作通常包括幾個階段 資料準備 資料更新 阻塞式io 程式發起read io請求,核心接受到系統呼叫並開始對磁碟進行讀取資料到核心緩衝區,這一過程程式所在的執行緒是阻塞狀態的。資料準備好,核心需要將資料複製到使用者程序空間,複製過程也是阻塞...

阻塞 非阻塞 同步 非同步以及IO模型

什麼是同步和非同步?什麼是阻塞和非阻塞?同步就意味著阻塞嗎?非同步就一定是非阻塞嗎?另外io模型一共5種,這裡面也涉及到同步非同步,阻塞非阻塞不同的組合,如果直接理解起來是比較費勁的,所以可以先把同步非同步,阻塞非阻塞理解清楚,那麼理解io模型將會好很多。從簡單的開始,我們以經典的讀取檔案的模型舉例...