網路BIO NIO 多路復用

2021-10-08 18:36:48 字數 1222 閱讀 9399

同步阻塞io模型下,網路io的互動流程。

客戶端向伺服器端申請建立連線

服務端同意建立連線

服務端呼叫accept,接受客戶端連線,生成檔案描述符fd

客戶端傳送訊息給伺服器

網絡卡接收到訊息,寫入連線的buffer中

然後呼叫io中斷,將訊息通過io中斷寫入核心中對應的fd的buffer中,完成核心態的互動

伺服器端效用read函式,通過軟中斷(80中斷)呼叫核心函式,讀取fd buffer中的資料。如果fd的buffer中沒有資料,將會阻塞read直到有資料進來。

同步非阻塞io模型下,網路io的互動流程

客戶端向伺服器端申請建立連線

服務端同意建立連線

服務端呼叫accept,接受客戶端連線,生成檔案描述符fd,儲存建立連線的fd。

客戶端傳送訊息給伺服器

網絡卡接收到訊息,寫入連線的buffer中

然後呼叫io中斷,將訊息通過io中斷寫入核心中對應的fd的buffer中,完成核心態的互動

伺服器端遍歷建立連線的fd,呼叫read函式,通過軟中斷(80中斷)呼叫核心函式,讀取fd buffer中的資料。如果fd的buffer中沒有資料,返回0,繼續read下乙個fd。

同步非阻塞io模型下呼叫核心select/poll多路復用,網路io的互動流程

服務端啟動埠監聽,開啟乙個多路復用器selector,將serversocket註冊到selector中,並監聽accept事件。

當selector.select()多路復用器中的keys大於0時,呼叫selector.selectedkeys()獲取選中的keys,這個keys,在select和poll中是維護的陣列,select一次只能檢視1024個key的狀態,poll沒有限制,並且在核心態依然是o(n)的時間複雜度;在epoll中維護的是紅黑樹+鍊錶時間複雜度是o(1)-o(lgn)。

客戶端向伺服器端申請建立連線

服務端獲取到key,判斷他是accetable的狀態,獲取該鏈結並接收,生成新的fd,將這個fd註冊到多路復用器中並監聽read事件。

客戶端傳送訊息給伺服器

網絡卡接收到訊息,寫入連線的buffer中

然後呼叫io中斷,將訊息通過io中斷寫入核心中對應的fd的buffer中,完成核心態的互動

多路復用器監聽到fd狀態變化,服務端不斷輪詢獲取變化的fd,多路復用器一次性將所有可以觸發事件的fd返回給服務端。

伺服器端獲取到fd後進行響應的accept,read,write操作。

《網路程式設計》I O 多路復用

在前面的文章中介紹了五種 i o 模型 i o 模型 這裡介紹 i o 模型中 i o 多路復用在 tcp 套接字程式設計中的使用。在 i o 多路復用中主要是 select 和 poll 函式的使用。該函式允許程序指示核心等待多個事件中的任何乙個發生,並只在乙個或多個事件發生或超過指定時間後才被喚...

Linux IO多路復用

一.select 函式 include include include int select int n,fd set readfds,fd set writefds,fd set exceptfds,struct timeval timeout fd clr int fd,fd set set f...

I O多路復用

一 五種i o模型 1 阻塞i o模型 最流行的i o模型是阻塞i o模型,預設情形下,所有套介面都是阻塞的。我們以資料報套介面為例來講解此模型 我們使用udp而不是tcp作為例子的原因在於就udp而言,資料準備好讀取的概念比較簡單 要麼整個資料報已經收到,要麼還沒有。然而對於tcp來說,諸如套介面...