網路基礎 I O模型

2021-06-22 15:40:38 字數 2691 閱讀 8665

(一)  i/o模型

i/o模型基本可以分為以下五類:

對於乙個套接字上的輸入(獲取資料)操作,通常包含兩種情況:

(二)  阻塞式i/o模型

阻塞i/o是最常用的模型,也是預設的套接字模型。以udp套接字為例,可以用如下的圖示表示:

在上圖中,程序呼叫recvfrom,其系統呼叫直到資料報達到且被複製到應用程序的緩衝區中或者發生錯誤才返回。從上圖看出,程序在i/o的兩個階段都被阻塞了。

阻塞i/o在簡單環境下較適用,如果沒有其他事需要同時進行處理,阻塞i/o也不錯。但是,如果存在多個連線的情況,則會引發問題。**片段如下示例:

char buf[1024];

int i, n;

while (i_still_want_to_read()) else if (result == -1)

}//use outbuf todo something

}void run(void)

else }}

}int main(int c, char **v)

為每個連線建立乙個程序或者執行緒是否可行呢? 如果作為伺服器,連線數達到成千上萬個,開如此多的程序或者執行緒並不是明智的選擇。如果不採用該方案,那如何應付高併發的成千上萬的連線數?在i/o模型中引入了非阻塞套接字。

(三) 非阻塞式i/o

非阻塞i/o主要思想,就是應用程序不需要進入阻塞,而是直接通過recvfrom返回乙個錯誤。可以用如下的圖示表示:

當乙個月與程序像這樣對乙個非阻塞描述符迴圈呼叫recvfrom時,稱之為輪詢(polling)。該種模式往往會耗費大量cpu,所以極少情況使用。**片段如下所示:

int i, n;

char buf[1024];

for (i=0; i < n_sockets; ++i)

fcntl(fd[i], f_setfl, o_nonblock);

while (i_still_want_to_read()) else if (n < 0) else }}

以上非阻塞呼叫,一則耗費cpu,二則需要對每個連線描述符進行核心呼叫,不論連線上是否有資料。自然,我們想「等待這些連線描述符,直到有資料到來才喚醒應用程序,並且應用程序知道是哪個描述符有資料」。對此,廣泛採用的較為古老的方式是使用select()。

(四) i/o復用模型

有了i/o復用,我們就可以呼叫select或者poll,阻塞在這些系統呼叫之上。用如下的圖示表示:

我們阻塞select呼叫,等待連線套接字變為可讀,當select返回套接字可讀這一條件時,我們呼叫recvfrom把所讀的資料複製到應用程序緩衝區。

對於只含有單個連線描述符的情況,select( )基本等同於阻塞i/o模型,但是對於連線數情況,該復用模型具有明顯的優勢。**片段如下所示:

while (i_still_want_to_read()) 

select(maxfd+1, &readset, null, null, null);

for (i=0; i < n_sockets; ++i) else if (n < 0) else }}

}

select模型是否就是最有效的呢?事實並非如此,因為生成和讀取select的位陣列的時間與用於select最大fd成正比,隨著套接字個數的增加,select呼叫的開銷也將會急劇增加。不同的作業系統為select提供了不同的替代版本,包括poll、epoll、evports、/dev/poll等。

(五) 訊號驅動式i/模型o

我們也可以用訊號,讓核心在描述符就緒時傳送sigio訊號通知我們,該模型即為訊號驅動式i/o。

(六) 非同步i/o模型

非同步i/o模型,該模型工作機制是:告知核心啟動某個操作,並讓在整個操作(包括將資料從核心複製到我們自己的緩衝區)完成後通知我們。訊號驅動式i/o是由核心通知我們何時可以啟動乙個i/o操作,而非同步i/o模型是由核心通知我們i/o操作何時完成。

同步i/o做i/o操作時將程序阻塞。 之前的阻塞i/o、非阻塞i/o、i/o復用、訊號驅動i/o 都屬於同步i/o(這裡定義的i/o操作就是例子中recvfrom這個系統呼叫)。非同步i/o則不一樣,程序發起i/o操作後,就直接返回,直到核心傳送乙個訊號,告訴程序說i/o完成。下圖給出各種i/o的比較:

對於同步io,都需要程序主動的呼叫 recvfrom來將資料拷貝到使用者記憶體。而同步 io則完全不同。它就像是使用者程序將整個io操作交給了核心(kernel)完成,然後核心做完後發訊號通知使用者程序。

網路IO模型

為了更好地了解io模型,我們需要事先回顧下 同步 非同步 阻塞 非阻塞 1.網路傳輸中的兩個階段 分別是 waitdata 和 copydata send copydata recv waitdata copydata 記住這兩點很重要,因為這些io模型的區別就是在兩個階段上各有不同的情況。2.阻塞...

網路IO模型

io有兩種操作,同步io和非同步io。同步io指的是,必須等待io操作完成後,控制權才返回給使用者程序。非同步io指的是,無須等待io操作完成,就將控制權返回給使用者程序。網路中的io,由於不同的io裝置有著不同的特點,網路通訊中往往需要等待。常見的有以下4種情況。1 輸入操作 等待資料到達套接字接...

網路IO模型

一 阻塞io模型 阻塞io基於socket程式 原理 recv接收資料時,不是直接接收資料,而是程式將系統呼叫的命令傳送到作業系統 當作業系統收到接收資料的請求,若此時無資料,作業系統會繼續等待,處於等待資料階段 wait for data階段 這個階段相對漫長 當資料來了,作業系統會拷貝資料 co...