13五種I/O模型

阻塞I/O

在這裏插入圖片描述

說明1:當上層應用app1調用recv系統調用時,如果對等方沒有發送數據(緩衝區沒有數據),上層應用app1將阻塞(默認行爲,被linux內核阻塞);
說明2:當對等方發送了數據,linux內核recv端緩衝區,有數據後,內核會把數據copy給用戶空間。然後上層應用app1解除阻塞,執行下一步操作。

非阻塞IO

在這裏插入圖片描述

說明1:
上層應用程序app2將套接字設置成非阻塞模式。
說明2:
上層應用程序app2輪詢調用recv函數,接受數據。若緩衝區沒有數 據,上層程序app2不會阻塞,recv返回值爲-1,錯誤碼是EWOULDBLOCK。
說明3:
上層應用程序不斷輪詢有沒有數據到來。會造成上層應用忙等待。大量消耗CPU。很少直接用。應用範圍小,一般和selectIO複用配合使用

I/O複用

在這裏插入圖片描述

說明1:
上層應用程序app3調用select機制(該機制有linux內核支持,避免了app3忙等待。),進行輪詢文件描述符的狀態變化。
說明2:
當select管理的文件描述符沒有數據(或者狀態沒有變化時),上層應用程序app3也會阻塞。
說明3:
好處select機制可以管理多個文件描述符
說明4:
select可以看成一個管理者,用select來管理多個IO。
一旦檢測到的一個I/O或者多個IO,有我們感興事件,發生,select函數將返回,返回值爲檢測到的事件個數。進而可以利用select相關api函數,操作具體事件。
說明5:
select函數可以設置等待時間,避免了上層應用程序app3,長期僵死。
說明6: 和阻塞IO模型相比,selectI/O複用模型相當於提前阻塞了。等到有數據到來時,再調用recv就不會發生阻塞。

信號驅動I/O

在這裏插入圖片描述

說明1:
上層應用程序app4建立SIGIO信號處理程序。當緩衝區有數據到來,內核會發送信號告訴上層應用程序app4。
說明2:
上層應用程序app4接收到信號後,調用recv函數,因緩衝區有數據,recv函數一般不會阻塞。
說明3:
這種用於模型用的比較少,屬於典型的“拉模式”。即:上層應用app4,需要調用recv函數把數據拉進來。

異步I/O

在這裏插入圖片描述

說明1:
上層應用程序app5調用aio_read函數,同時提交一個應用層的緩衝區buf;調用完畢後,不會阻塞。上層應用程序app5可以繼續其他任務。
說明2:
當tcpip協議緩衝區有數據時,linux主動的把內核數據copy到用戶空間。然後再給上層應用app5發送信號;告訴app5數據有了,趕快處理吧!
說明3:
典型的“推模式”
說明4:
效率最高的一種形式,上層應用程序app5有異步處理的能力(在linux內核的支持下,言外之意:處理其他任務的同時,也可支持IO通訊)。異步I/O指的是什麼?
上層應用程序app5,在也可以幹別的活的時,可以接收數據(接受異步通信事件。===)異步命令來源)。與信號驅動IO模型,上層應用程序app5不需要調用recv函數。

結論:IO複用和異步IO是重點。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章