網路I O模型 5種常見的網路I O模型

2022-07-20 01:03:10 字數 1883 閱讀 9415

阻塞與非阻塞

阻塞就是卡在那兒什麼也不做,雙方之間也沒有資訊溝通。

非阻塞就是即使對方不能馬上完成請求,雙方之間也有資訊的溝通。

同步與非同步

同步就是一件事件只由乙個過程處理完成,不論阻塞與非阻塞,最後完成這個事情的都是同乙個過程

非同步就是一件事由兩個過程完成,前面乙個過程通知,後面乙個過程接受返回的結果。

非同步和事件驅動(multi io)

非同步是指資料準備好並且已經拷貝到使用者空間,在通知使用者來取資料

事件驅動理解為準備好資料了但是沒有拷貝到使用者空間,這個時候去通知使用者,使用者再去取資料,經過拷貝過程取得資料。 

5種常見的網路i/o模型

1. blocking i/o  -- 阻塞型別的i/o

流程圖如下:

linux下socket預設是阻塞的,阻塞模式在準備資料和拷貝資料兩個過程都是阻塞的,在這期間客戶端一直卡著,雙方也沒有資料交流。

2.nonblocking i/o -- 非阻塞型別的i/o

流程圖:

linux下使用fcntl方法將socket設定為非阻塞模式 

flags = fcntl(sockfd, f_getfl, 0);                        //獲取檔案的flags值。

fcntl(sockfd, f_setfl, flags | o_nonblock);   //設定成非阻塞模式;

非阻塞模式下,如果資料還沒有準備好,服務端會返回error,客戶端根據這個error判斷後,再次發起recv,直到資料準備好,這個過程雖然客戶端也在這裡卡著了,但是這期間一直和服務有著資訊交換。

3.i/o multiplexing -- 多路復用型i/o

流程圖:

多路復用型io,有的也稱為事件驅動型io,常用select,poll,epoll來處理多個io連線狀態。當某個io連線的資料準備好了,select返回,通知使用者進行read操作,這種io的好處是一次可以監聽多個連線,壞處是要兩次呼叫,兩次返回,單個連線和非阻塞io沒有多大的效能提公升。

在多路復用模型中,對於每乙個socket,一般都設定成為non-blocking,但是,如上圖所示,整個使用者的process其實是一直被block的。只不過process是被select這個函式block,而不是被socket io給block。因此select()與非阻塞io類似。

4.signal-driven i/o -- 訊號驅動型i/o

流程圖:

首先我們允許套介面進行訊號驅動i/o,並安裝乙個訊號處理函式,程序繼續執行並不阻塞。當資料準備好時,程序會收到乙個sigio訊號,可以在訊號處理函式中呼叫i/o操作函式處理資料。

5.asynchronous i/o -- 非同步i/o

流程圖:

當乙個非同步過程呼叫發出後,呼叫者不能立刻得到結果。實際處理這個呼叫的部件在完成後,通過狀態、通知和**來通知呼叫者的輸入輸出操作

參考資源:

五種網路IO模型

一 概述 在網路程式設計中,阻塞 非阻塞 同步 非同步經常被提到,下面談一下i o在生活中的釣魚場景 純屬虛構,如有雷同,純屬巧合 1.阻塞式i o 開始釣魚,眼睛一直盯著,魚兒上鉤拉桿。2.非阻塞式i o 開始釣魚,你一直懷疑魚兒在偷吃魚餌,一直拉桿,沒有魚,然後重複放杆拉桿,直到有釣上魚。3.i...

網路IO模型

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

網路IO模型

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