這是最簡單的 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 從核心向程序複製資料 對於套接字上的輸入操作,第一步等待資料從網路中到達,...