多路IO復用

之前看《UNIX網絡編程》時,對于Linux IO 模式的理解總覺得不夠徹底。最近借著看spp源碼的機會,對這部分知識進行了相關梳理。以下討論內容的背景是Linux環境下的網絡IO。

網絡IO:網絡IO涉及網絡上數據的傳輸,其顯著特點是IO的時延比較大。一次網絡IO過程(read 操作)通??煞纸鉃閭z個操作過程,1、等待數據準備就緒(填充內核緩存) 2、將數據從內核拷貝到用戶進程空間

阻塞和非阻塞:正在執行的進程,由于期待某些事情的發送,而無法繼續工作的時候,自動執行系統阻塞原語,使自己處于阻塞狀態。進程進入阻塞狀態是不占用CPU資源。阻塞和非阻塞是針對當數據沒有準備好的時候【步驟1】,進程采取的策略。

同步和異步:同步是指進程進行IO 操作的時候會阻塞(這里的阻塞特指當數據準備好的情況下,進程一定會等數據拷貝完成后再進行后續執行流。這里的IO操作特指將數據從內核拷貝到用戶進程);異步是指當進程發起IO操作后,就直接返回了,直到kernel發送信號告訴進程IO完成了,這種模式,進程在整個過程中完全沒有被阻塞。同步和異步是針對當數據從內核拷貝的用戶空間這段時間內【步驟2】,進程采取的策略。

正因為網絡IO操作需要經歷兩個階段,linux系統區分了下面五種網絡模型。

阻塞IO

阻塞IO的操作流程如下圖:

阻塞模式的特點是:直到數據準備好,阻塞步驟1; 直到數據拷貝完成,阻塞步驟2;

非阻塞IO

非阻塞IO的操作流程如下圖:

非阻塞模式的特點是:如果數據沒有準備好則返回,不阻塞步驟1; 直到數據拷貝完成,阻塞步驟2;(由于不阻塞步驟1,因此需要用戶進程不斷主動詢問kernel數據是否準備好了)

IO多路復用

IO多路復用的操作流程如下圖:

IO多路復用的特點是:直到數據準備好(多路中,只要有一路準備好就算是有數據),阻塞步驟1;直到數據拷貝完成,阻塞步驟2;和阻塞IO不同地地方在于:1、IO多路復用步驟1在代理系統調用處阻塞(select,epoll等)而不是read系統調用處阻塞 2、IO多路復用同時監控多路,只要有一路數據準備完畢,其代理系統調用就返回。

信號驅動IO

信號驅動IO的操作流程如下:

信號驅動IO的主要特點是: 預先告知內核當某個socket有數據的時候通知進程,不阻塞步驟1;用戶進程讀取數據,阻塞步驟2.

異步IO

異步IO的操作流程如下:

異步操作的特點是: 調用后馬上返回,不阻塞步驟1,不阻塞步驟2; 內核完成步驟1和步驟2后給用戶進程發送signal,告訴用戶進程read操作完成了。

所以,阻塞、非阻塞、IO多路復用模式、信號驅動IO都是同步模式; 只有異步IO模式是異步。判斷阻塞、非阻塞看步驟1是否會被阻塞;判斷同步和異步,看步驟2是否會被阻塞。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容