Linux系統的五種IO模型

概述

在Linux系統中,共有5種IO模型,它們分別是:阻塞IO模型,非阻塞IO模型,信號驅動IO模型,多路複用IO模型和異步IO模型
執行IO操作的過程分爲兩個步驟:數據準備和數據拷貝

阻塞IO模型

進程或線程等待某個條件,如果條件不滿足,一直等下去;如果條件滿足,進行下一步操作
應用進程通過系統調用recvfrom接收數據,由於內核還未準備好數據,應用進程會阻塞住,直到內核準備好數據,
recvfrom完成數據拷貝工作,應用進程才結束阻塞狀態

非阻塞IO模型

應用程序與內核交互如果條件不滿足,不再等待直接返回,不斷輪詢內核,若數據準備好,則進行下一步
應用進程通過recvfrom和內核交互,如果內核沒有準備好數據,會返回error,應用程序接受到error後,會先去執行其他任務,一段時間後在發起recvfrom

信號驅動IO模型

應用程序在讀取文件是通知內核,當發生某個socket事件時,內核發出信號通知應用程序,收到信號後,信號對應的處理函數會做後續處理,信號驅動模型在數據準備階段是異步的,在數據拷貝階段是同步的
應用程序預先向內核註冊一個信號處理函數,然後不阻塞,當數據準備條件滿足時,內核發出信號給應用程序,應用程序通過信號處理函數完成數據拷貝到用戶空間的任務

多路複用IO模型

多個進程的IO可以註冊到同一個管道上,這個管道會統一和內核交互,當管道中的某一個請求需要的數據準備好了,進程再把對應的數據拷貝到用戶空間
IO多路轉接是多了一個select函數,多個進程的IO可以註冊到同一個select上,當用戶進程調用該selectselect會監聽所有註冊好的IO,如果所有被監聽的IO需要的數據都沒有準備好時,select調用進程會阻塞。當任意一個IO所需的數據準備好之後,select調用就會返回,然後進程在通過recvfrom來進行數據拷貝。
這裏的IO複用模型,並沒有向內核註冊信號處理函數,所以,他並不是非阻塞的。進程在發出select後,要等到select監聽的所有IO操作中至少有一個需要的數據準備好,纔會有返回,並且也需要再次發送請求去進行文件的拷貝。

異步IO模型

應用進程把IO請求傳給內核後,完全由內核去操作文件拷貝。內核完成相關操作後,會發信號告訴應用進程本次IO已經完成
用戶進程發起aio_read操作之後,給內核傳遞描述符、緩衝區指針、緩衝區大小等,告訴內核當整個操作完成時,如何通知進程,然後就立刻去做其他事情了。當內核收到aio_read後,會立刻返回,然後內核開始等待數據準備,數據準備好以後,直接把數據拷貝到用戶控件,然後再通知進程本次IO已經完成

五種IO模型對比

在這裏插入圖片描述

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