【Netty專欄】二、Linux網絡I/O模型簡介

       Linux的內核將所有外部設備都看作一個文件來操作,對一個文件的讀寫會調用內核提供的系統命令,返回一個file descriptor(fd,即文件描述符)。而對於一個socket的讀寫也會有相應的描述符,稱爲socketfd(即socket描述符),描述符就是一個數字,它指向內核中的一個結構體(文件路徑,數據區等一些屬性)。

 

       一、根據UNIX網絡編程對I/O模型的分類,UNIX提供了5種I/O模型。

       1、阻塞I/O模型:默認情況下,所有文件操作都是阻塞的。如下圖:在進程空間中調用recvfrom,其系統調用直到數據包到達且被複制到應用進程的緩存區或者發生錯誤時才返回,在此期間一直會等待,進程從調用recvfrom開始到它返回的整段時間內都是阻塞的,因此被稱爲阻塞I/O模型。

阻塞I/O模型

   2、 非阻塞I/O模型:recvfrom從應用層到內核的時候,如果該緩衝區沒有數據的話,就直接返回一個EWOULDBLOCK錯誤,一般都對非阻塞I/O模型進行輪詢檢查這個狀態,看內核是否有數據到來。

非阻塞I/O模型

3、I/O複用模型:Linux提供select/poll,進程通過將一個或多個fd傳遞給select或poll系統調用,阻塞在select操作上,這樣select或poll就可以幫我們檢查多個fd是否處於就緒狀態。select或poll順序掃描fd是否就緒,而且支持的fd數量有限,因此它的使用受到了一些制約。Linux還提供了一個epoll系統調用,epoll使用基於事件驅動的方式 代替順序掃描,因此性能更高。當有fd就緒時,立即回調函數rollback。

I/O複用模型

4、信號驅動I/O模型:首先開啓套接字信號驅動I/O功能,並通過系統調用sigaction執行一個信號處理函數(此係統調用後立即返回,進程繼續工作,它是非阻塞的)。當數據準備就緒時,就爲該進程生成一個SIGIO信號,通過信號回調通知應用程序調用recvfrom來讀取數據,並通知主循環函數處理數據。

信號驅動I/O模型

5、異步I/O:告知內核啓動某個動作,並讓內核在整個操作完成之後(包括將數據從內核複製到用戶緩衝區)通知我們。其與信號驅動模型的主要區別是:信號驅動I/O由內核通知我們什麼時候開始一個I/O操作;異步I/O模型由內核通知我們I/O操作何時完成。

異步I/O模型

 

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