Linux的5種IO模型

2021-09-22 13:03:26 字數 1464 閱讀 9417

這是最簡單的 i/o 模型,一般表現為程序或執行緒等待某個條件,如果條件不滿足,則一直等下去。

直到核心完成資料報複製,應用程序才會退出阻塞狀態。

這種模型耗費時間,適合低併發,時效要求不高的情況。

我們在等待的時候,完全可以做點別的事情,並通過輪詢的方式,時不時問一下核心資料準備好沒。

如果某一次輪詢得知資料已經準備好了,那就把資料拷貝到使用者空間中。

如果說,核心可以自動地,在複製完資料報後通知咱的應用呢?

這就是訊號驅動io。

應用程序向核心指定訊號處理函式,收到訊號sigio後,處理函式自動執行。

那麼,如何才能多處理幾個io呢?我們可以通過下一種模型,監視多個描述符。

通過io復用,可以監視多個描述符,一旦某個描述符就緒(一般是讀就緒或者寫就緒),能夠通知程式進行相應的讀寫操作。

select()會監聽所有註冊好的io

int

select

(int maxfd,

fd_set *rdset,

fd_set *wrest,

fd_set *exset,

struct timeval *timeout)

;

注意,io復用模型並不是非阻塞的,因為沒有向核心註冊訊號處理函式。

前面的4種模型,都是同步的,因為資料拷貝都是同步進行的,都通過recvfrom操作進行資料拷貝。

對於訊號驅動模型,可以認為資料準備階段是非同步的,資料拷貝操作是同步的。

要想非同步進行,就必須給核心指定更多工。

使用者程序發起aio_read()操作之後,給核心傳遞描述符、緩衝區指標、緩衝區大小等;核心收到aio_read後,會立刻返回,然後核心開始等待資料準備。

資料準備好以後,直接把資料拷貝到使用者空間,省去recvfrom(),然後再通知程序本次io已經完成。

非同步模型顯然是最省事的,啥都不用管了。

IO概念 5種IO模型

io叫做輸入輸出,我們可以將io理解為兩步 等待io事件就緒 資料就緒後進行真正意義上的io 真正的資料搬遷 所以,io的過程一是等,然後才是輸入輸出。進而,我們可以得到評價io是否高效的標準 在io過程中 等 的比重越小的效能越好,越大的效能越低。io中有兩個重要的函式 read write 他們...

網路I O模型 5種常見的網路I O模型

阻塞與非阻塞 阻塞就是卡在那兒什麼也不做,雙方之間也沒有資訊溝通。非阻塞就是即使對方不能馬上完成請求,雙方之間也有資訊的溝通。同步與非同步 同步就是一件事件只由乙個過程處理完成,不論阻塞與非阻塞,最後完成這個事情的都是同乙個過程 非同步就是一件事由兩個過程完成,前面乙個過程通知,後面乙個過程接受返回...

Unix下5種I O模型

unix下的5中i o模型 阻塞式i o 非阻塞式i o i o復用 select poll 訊號驅動式i o sigio 非同步i o posix的aio 系列函式 乙個輸入操作通常包括兩個不同階段 1 等待資料準備好 2 從核心向程序複製資料 對於套接字上的輸入操作,第一步等待資料從網路中到達,...