快取 i/o 又被稱作標準 i/o,大多數檔案系統的預設 i/o 操作都是快取 i/o。在 linux 的快取 i/o 機制中,作業系統會將 i/o 的資料快取在檔案系統的頁快取( page cache )中,也就是說,資料會先被拷貝到作業系統核心的緩衝區中,然後才會從作業系統核心的緩衝區拷貝到應用程式的位址空間。
等待資料準備(等待資料進入核心快取)
將資料從核心快取拷貝到程序記憶體中
正在執行的程序,由於期待的某些事件未發生,如請求系統資源失敗、等待某種操作的完成、新資料尚未到達或無新工作做等,則由系統自動執行阻塞原語(block),使自己由執行狀態變為阻塞狀態。可見,程序的阻塞是程序自身的一種主動行為,也因此只有處於執行態的程序(獲得cpu),才可能將其轉為阻塞狀態。當程序進入阻塞狀態,是不占用cpu資源的。
比較簡單就不介紹了,有看過我之前的深入理解nio系列就會懂
簡單說就是使用者程序需要不斷的主動詢問kernel資料好了沒有。
我們的select、poll和epoll都屬於io多路復用的模型
這裡提一下,它們都屬於同步非阻塞io,為什麼同步我們後面會解釋。
首先我們允許socket進行訊號驅動io,並安裝乙個訊號處理函式,程序繼續執行並不阻塞。當資料準備好時,程序會收到乙個sigio訊號,可以在訊號處理函式中呼叫i/o操作函式處理資料。
使用者程序發起read操作之後,立刻就可以開始去做其它的事。而另一方面,從kernel的角度,當它受到乙個asynchronous read之後,首先它會立刻返回,所以不會對使用者程序產生任何block。然後,kernel會等待資料準備完成,然後將資料拷貝到使用者記憶體,當這一切都完成之後,kernel會給使用者程序傳送乙個signal,告訴它read操作完成了。
這就是我們本節的重點,我們心心念念的aio了。雖然在第三節才講有點晚,但是鋪墊了這麼多,我想要說的,就是aio它到底非同步在**?或者說什麼是非同步?
在說明synchronous io和asynchronous io的區別之前,需要先給出兩者的定義。posix的定義是這樣子的:
兩者的區別就在於synchronous io做」io operation」的時候會將process阻塞。按照這個定義,之前所述的blocking io,non-blocking io,io multiplexing都屬於同步io。
有人會說,non-blocking io並沒有被block啊。這裡有個非常「狡猾」的地方,定義中所指的」io operation」是指真實的io操作,就是例子中的recvfrom這個system call。non-blocking io在執行recvfrom這個system call的時候,如果kernel的資料沒有準備好,這時候不會block程序。但是,當kernel中資料準備好的時候,recvfrom會將資料從kernel拷貝到使用者記憶體中,這個時候程序是被block了。
而asynchronous io則不一樣,當程序發起io 操作之後,就直接返回再也不理睬了,直到kernel傳送乙個訊號,告訴程序說io完成。在這整個過程中,程序完全沒有被block。
通過上面的,可以發現non-blocking io和asynchronous io的區別還是很明顯的。在non-blocking io中,雖然程序大部分時間都不會被block,但是它仍然要求程序去主動的check,並且當資料準備完成以後,也需要程序主動的再次呼叫recvfrom來將資料拷貝到使用者記憶體。而asynchronous io則完全不同。它就像是使用者程序將整個io操作交給了他人(kernel)完成,然後他人做完後發訊號通知。在此期間,使用者程序不需要去檢查io操作的狀態,也不需要主動的去拷貝資料。
Linux五種IO模型
五種io模型的理解 阻塞io 收銀台等待 在核心將資料準備好之前,系統調 會 直等待.所有的套接字,預設都是阻塞 式.阻塞io 座位等待 往往需要程式設計師迴圈的方式反覆嘗試讀寫檔案描述符,這個過程稱為輪詢.訊號驅動io 等服務員叫 核心將資料準備好的時候,使 sigio訊號通知應用程式進行io操作...
Linux 五種I O模型
首先,我們來看一下,有哪五種i o模型 小結 非阻塞i o,記錄鎖,系統v流機制,i o多路轉接 也叫i o多路復用 readv和writev函式以及儲存對映i o mmap 這些統稱為高階i o。首先,我們來看乙個介面 int fcntl int fd,int cmd,arg 功能 針對描述符提供...
Linux的五種IO模型
在linux unix 作業系統中,共有五種io模型,分別是 阻塞io模型 非阻塞io模型 io復用模型 訊號驅動io模型以及非同步io模型。我們常說的io,指的是檔案的輸入和輸出,但是在作業系統層面是如何定義io的呢?到底什麼樣的過程可以叫做是一次io呢?拿一次磁碟檔案讀取為例,我們要讀取的檔案是...