整理操作系統IO模型


一、操作系統的IO交互模型

現代的操作系統對於存儲空間都有一套訪問限制控制,所以將存儲空間分成了用戶空間和內核空間。用戶空間負責給應用程序使用,應用程序可以訪問用戶空間內的數據,但是不可以訪問內核空間中的數據;而內核程序可以訪問計算機的所有存儲空間,包括用戶空間、內核空間以及硬件設備上的數據。所以當應用程序需要訪問硬件設備上的數據或者是內核空間的數據時,就必須要通過內核空間的程序來實現。所以內核空間對外也提供了很多的函數,提供給了應用程序使用,讓應用程序可以通過內核程序來訪問想要的數據。

整體的IO交互模型如下圖示:

 

 

下面就以應用程序需要從網卡中讀取數據為例,整體IO交互流程主要分成如下幾個步驟:

1、應用程序調用內核提供的函數發起請求數據(請求內核函數)

2、內核訪問網卡存儲空間獲取數據(內核獲取數據)

3、內核將獲取的到數據復制到用戶空間(內核復制數據)

4、應用程序從用戶空間中獲取需要的數據(應用程序獲取數據)

二、操作系統的IO模型

介紹操作系統的IO模型之前,可以先了解下和IO模型的分類,主要有同步IO、異步IO、阻塞IO、非阻塞IO

2.1、IO的類型

2.1.1、同步IO

應用程序調用內核函數到最終應用程序從用戶空間中獲取數據的整個流程是需要用戶線程一次性完成的那么就是同步IO

2.1.2、異步IO

應用程序調用內核函數請求獲取數據和最終從用戶空間中拿到數據不是一次性完成的,而是先請求數據,等數據全部准備好了之后再獲取的就是異步IO

2.1.3、阻塞IO

應用程序調用內核函數請求數據,如果此時還沒有數據,那么應用程序就一直等待着,直到成功拿到數據為止,此時應用程序線程是一直處於等待狀態的,那么就是阻塞IO

2.1.4、非阻塞IO

應用程序調用內核函數請求數據,如果此時還沒有數據,那么應用程序就不等待先去處理其他事情,過一會再重新嘗試請求,直到成功拿到數據為止,此時應用程序不會一直處於等待狀態,那么就是非阻塞IO

2.2、操作系統IO模型

操作系統的IO模型也主要分成同步IO和異步IO兩大類,而同步IO又分成了阻塞和非阻塞等類,異步IO不會出現阻塞IO情況,所以異步IO肯定是非阻塞的IO,操作系統IO模型主要分成如下幾種類型

tips:操作系統給應用程序提供了recv函數,該函數用於從socket套接字中接收數據,默認情況下會等到網絡數據接收完成並復制到用戶空間之后才返回結果或者失敗之后返回結果,可以通過flags參數設置如果沒有數據的話立即返回結果

2.2.1、同步阻塞IO

應用程序調用操作系統的recv函數,recv函數默認會等待數據接收完成並復制到用戶空間之后返回結果,而如果數據沒有准備好的話,那么應用程序就一直處於等待狀態,直到有數據返回,此時應用程序的線程處於阻塞狀態,無法執行其他操作

2.2.2、同步非阻塞IO

應用程序調用操作系統的recv函數,recv函數設置flags值為立即返回,那么如果內核發現沒有數據時就立即返回,應用程序得到結果之后不再等待,而是先處理其他業務,然后輪訓不斷嘗試獲取數據,直到數據成功返回,此時應用程序不處於阻塞狀態,可以先處理其他操作

2.2.3、同步多路復用IO

應用程序先調用操作系統的select函數或者poll函數或者epoll函數,這幾個函數的作用是監聽網絡套接字上的數據狀態,如果有數據可讀,那么就通知應用程序,此時應用程序再調用recv函數來讀取數據,此時肯定是可以讀取到數據的。可以發現多路復用IO的特點是不需要嘗試獲取數據,而是先開啟另外一個線程來監控數據的狀態,等到有數據的時候再同步獲取數據,而在沒數據的時候也是不需要等待的。多路復用IO調用select函數之后也會阻塞進程,但是不會真正的IO操作線程沒有被阻塞,所以實質上是同步非阻塞IO

2.2.4、同步信號驅動IO

通過調用sigaction函數注冊信號函數,等內核數據准備好了之后會執行信號函數通知應用程序,應用程序此時再調用recv函數同步的獲取數據。信號驅動IO和異步IO有點類似,都是異步通知,不同的是信號驅動IO的真正讀取數據的操作還是同步操作的。

2.2.5、異步非阻塞IO

通過調用aio_read函數,那么內核會先將數據讀取好,並且復制到用戶空間之后,再執行回調函數通知應用程序,此時應用程序就可以直接從用戶空間中讀取數據,而不需要再從內核中讀取數據了。

總結:

IO操作主要可以分成兩個階段:1、數據准備階段;2、數據從內核空間復制到用戶空間階段

而阻塞IO、非阻塞IO、多路復用IO和信號驅動IO只是在第一個階段不同,而第二個階段是相同的,都是需要阻塞當前線程等待數據復制完成,雖然阻塞的時間足夠短,所以只要需要執行第二階段的都是屬於同步IO;

而異步IO模型的第一階段和第二階段都是內核主動完成,再兩個階段都不會阻塞當前線程去處理其他事情。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM