同步阻塞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來說,諸如套介面...