五種I/O模型

一、一個輸入操作的兩個階段:

階段1:等待數據準備好;

階段2:將數據從內核空間複製到用戶進程空間。

對於一個socket上的輸入操作,階段一通常就是等待數據從網絡中到達(數據到達後會被複制到內核中的某個緩衝區),階段二是把數據從內核緩衝區複製到用戶進程緩衝區。

recvfrom爲系統調用,可以將操作在用戶進程空間運行切換到在內核空間運行。

用戶空間與內核空間:

我們知道現在操作系統都是採用虛擬存儲器,那麼對32位操作系統而言,它的尋址空間(虛擬存儲空間)爲4G(2的32次方)。操心繫統的核心是內核,獨立於普通的應用程序,可以訪問受保護的內存空間,也有訪問底層硬件設備的所有權限。爲了保證用戶進程不能直接操作內核,保證內核的安全,操心繫統將虛擬空間劃分爲兩部分,一部分爲內核空間,一部分爲用戶空間。針對linux操作系統而言,將最高的1G字節(從虛擬地址0xC0000000到0xFFFFFFFF),供內核使用,稱爲內核空間,而將較低的3G字節(從虛擬地址0x00000000到0xBFFFFFFF),供各個進程使用,稱爲用戶空間。每個進程可以通過系統調用進入內核,因此,Linux內核由系統內的所有進程共享。

 

 

二、阻塞式I/O:

其調用過程是直到數據包到達且被複制到應用進程的緩衝區中或者發生錯誤才返回,即從調用recvfrom開始到返回的整段時間內是阻塞的,recvfrom成功返回後,應用進程纔開始處理數據報

三、非阻塞式I/O:

進程把一個套接字設置成非阻塞是在通知內核:當所請求的I/O操作非得把本進程投入睡眠才能完成時,不要把本進程投入睡眠,而是返回一個錯誤

前三次調用recvfrom時沒有數據可返回,因此內核轉而立即返回一個EWOULDBLICK錯誤,第四次調用recvfrom時已有一個數據報準備好,它被複制到應用進程緩存區,於是recvfrom成功返回,應用進程接着處理數據

當一個應用進程像這樣對一個非阻塞描述符循環調用recvfrom時,稱爲輪詢,持續輪詢查看某個操作是否就緒,會耗費大量的CPU時間

四、I/O複用(select和epoll):

通過select或epoll,可以把阻塞的點轉移到兩個系統調用中的某一個之上,而不是阻塞在真正的I/O系統調用上

阻塞於select調用,等待數據報套接字變爲可讀,當select返回套接字可讀條件時,調用recvfrom把所讀數據報復制到應用進程緩衝區

但是I/O複用相比於阻塞I/O並不顯得有什麼優勢,因爲select需要使用系統調度爲2個而不是單個,不過其優勢在於可以等待多個描述符就緒

五、信號式驅動I/O(SIGIO):

通過使用信號的方式,讓內核在描述符就緒時發送SIGIO信號通知應用進程,這種爲信號驅動式I/O

首先開啓套接字的信號驅動式I/O功能,並通過sigaction系統調用安裝一個信號處理函數,該系統調用將立即返回,應用進程繼續工作,沒被阻塞;當數據報準備好讀取時,內核爲應用進程產生一個SIGIO信號,應用進程即可以在信號處理函數中調用recvfrom讀取數據報並通知主循環數據已準備好待處理,也可以立即通知主循環,讓它讀取數據報

六、異步I/O:

異步I/O的工作機制是,告知內核啓動某個操作,並讓內核在整個操作(包括將數據從內核緩衝區複製到應用進程緩衝區)完成後通知我們,這種模型與信號驅動式I/O的主要區別在於:信號驅動式I/O是由內核通知我們何時可以啓動一個I/O操作,而異步I/O是由內涵通知我們I/O操作何時完成

調用aio_read函數,給內核傳遞描述符、緩衝區指針、緩衝區大小、文件偏移量,並告訴內核當整個操作完成時如何通知我們,該系統調用立即返回,而且在等待I/O完成期間,我們的進程不會被阻塞,該信號知道數據已經複製到應用進程緩衝區才產生,這點不同於信號驅動式I/O

七、各種I/O模型的比較:

阻塞式I/O、非阻塞式I/O、I/O複用(select和epoll)、信號驅動式I/O(SIGIO)這4種模型的主要區別在於第一階段,因爲第二階段都是一樣的:在數據從內核複製到應用進程的緩存區期間,進程阻塞於recvfrom調用;相反的,異步I/O在這2個階段都要處理

同步I/O與異步I/O的對比:

同步I/O操作:導致請求進程阻塞,知道I/O操作完成

異步I/O操作:不導致請求進程阻塞

因此,阻塞式I/O、非阻塞式I/O、I/O複用(select和epoll)、信號驅動式I/O(SIGIO)這4種模型都是同步I/O模型,因爲其中真正的I/O操作(recvfrom)將阻塞進程,只有異步I/O模型是完全處理“等待數據+將數據從內核空間複製到應用進程空間”這兩個階段的操作

圖來自《netty權威指南》

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