網路I/O模型--5種常見的網路I/O模型
阻塞與非阻塞
阻塞就是卡在那兒什麼也不做,雙方之間也沒有資訊溝通。
非阻塞就是即使對方不能馬上完成請求,雙方之間也有資訊的溝通。
同步與非同步
同步就是一件事件只由一個過程處理完成,不論阻塞與非阻塞,最後完成這個事情的都是同一個過程
非同步就是一件事由兩個過程完成,前面一個過程通知,後面一個過程接受返回的結果。
非同步和事件驅動(multi IO)
非同步是指資料準備好並且已經拷貝到使用者空間,在通知使用者來取資料
事件驅動理解為準備好資料了但是沒有拷貝到使用者空間,這個時候去通知使用者,使用者再去取資料,經過拷貝過程取得資料。
5種常見的網路I/O模型
- blocking I/O -- 阻塞型別的I/O
- nonblocking I/O -- 非阻塞型別的I/O
- I/O Multiplexing -- 多路複用型I/O
- Signal-Driven I/O -- 訊號驅動型I/O
- Asynchronous I/O -- 非同步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
流程圖:
當一個非同步過程呼叫發出後,呼叫者不能立刻得到結果。實際處理這個呼叫的部件在完成後,通過狀態、通知和回撥來通知呼叫者的輸入輸出操作
參考資源:
http://www.cnblogs.com/findumars/p/6361627.html
https://www.cnblogs.com/kunhu/p/3624000.html