Linux系統的五種IO模型

2021-09-25 20:17:04 字數 1429 閱讀 6845

在linux系統中,共有5種io模型,它們分別是:阻塞io模型,非阻塞io模型,訊號驅動io模型,多路復用io模型和非同步io模型

執行io操作的過程分為兩個步驟:資料準備和資料拷貝

程序或執行緒等待某個條件,如果條件不滿足,一直等下去;如果條件滿足,進行下一步操作

應用程序通過系統呼叫recvfrom接收資料,由於核心還未準備好資料,應用程序會阻塞住,直到核心準備好資料,

recvfrom完成資料拷貝工作,應用程序才結束阻塞狀態

應用程式與核心互動如果條件不滿足,不再等待直接返回,不斷輪詢核心,若資料準備好,則進行下一步

應用程序通過recvfrom和核心互動,如果核心沒有準備好資料,會返回error,應用程式接受到error後,會先去執行其他任務,一段時間後在發起recvfrom

應用程式在讀取檔案是通知核心,當發生某個socket事件時,核心發出訊號通知應用程式,收到訊號後,訊號對應的處理函式會做後續處理,訊號驅動模型在資料準備階段是非同步的,在資料拷貝階段是同步的

應用程式預先向核心註冊乙個訊號處理函式,然後不阻塞,當資料準備條件滿足時,核心發出訊號給應用程式,應用程式通過訊號處理函式完成資料拷貝到使用者空間的任務

多個程序的io可以註冊到同乙個管道上,這個管道會統一和核心互動,當管道中的某乙個請求需要的資料準備好了,程序再把對應的資料拷貝到使用者空間

io多路轉接是多了乙個select函式,多個程序的io可以註冊到同乙個select上,當使用者程序呼叫該selectselect會監聽所有註冊好的io,如果所有被監聽的io需要的資料都沒有準備好時,select呼叫程序會阻塞。當任意乙個io所需的資料準備好之後,select呼叫就會返回,然後程序在通過recvfrom來進行資料拷貝。

這裡的io復用模型,並沒有向核心註冊訊號處理函式,所以,他並不是非阻塞的。程序在發出select後,要等到select監聽的所有io操作中至少有乙個需要的資料準備好,才會有返回,並且也需要再次傳送請求去進行檔案的拷貝。

應用程序把io請求傳給核心後,完全由核心去操作檔案拷貝。核心完成相關操作後,會發訊號告訴應用程序本次io已經完成

使用者程序發起aio_read操作之後,給核心傳遞描述符、緩衝區指標、緩衝區大小等,告訴核心當整個操作完成時,如何通知程序,然後就立刻去做其他事情了。當核心收到aio_read後,會立刻返回,然後核心開始等待資料準備,資料準備好以後,直接把資料拷貝到使用者控制項,然後再通知程序本次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呢?拿一次磁碟檔案讀取為例,我們要讀取的檔案是...