談談 IO模型 同步 非同步 阻塞 非阻塞

2021-09-11 11:34:46 字數 1317 閱讀 3702

linux os中,有幾種常見的io模型:

程式進行io讀/寫操作通常包括幾個階段:

資料準備

資料更新

阻塞式io:

程式發起read io請求,核心接受到系統呼叫並開始對磁碟進行讀取資料到核心緩衝區,這一過程程式所在的執行緒是阻塞狀態的。資料準備好,核心需要將資料複製到使用者程序空間,複製過程也是阻塞狀態。拷貝完畢後kernel返回結果,程序/執行緒切換到執行狀態。

程式發起write io請求,核心接收到系統呼叫並開始從使用者程序空間複製資料到核心緩衝區,這一過程執行緒是阻塞狀態。資料準備好,核心需要將資料寫入到磁碟中,寫入過程也是阻塞狀態。

非阻塞io:

程式發起read io請求,資料若沒有準備好,核心會立即返回-1,並開始讀取磁碟資料,而執行緒不會阻塞,可以繼續傳送read請求,直到資料準備好。資料準備好,核心需要將資料複製到使用者程序空間,複製過程是阻塞狀態。拷貝完畢後kernel返回結果,程序/執行緒切換到執行狀態。

程式發起write io請求,核心接收到系統呼叫並開始從使用者程序空間複製資料到核心緩衝區,並立即返回-1,這一過程執行緒不會阻塞,可以繼續傳送write請求直到資料準備好。資料準備好,核心需要將資料寫入到磁碟中,寫入過程也是阻塞狀態。

io復用:

select/poll/epoll都是io多路復用機制,可以同時監控多個描述符,當某個描述符就緒(讀或寫就緒),則立刻通知相應程式進行讀或寫操作。

當使用者程序呼叫了select,整個程序就會被阻塞。同時核心會輪詢檢視所有select負責的檔案描述符,當任何乙個檔案描述符中的資料準備好了,select就會返回。這個時候使用者程序再發起io請求,將資料從kernel拷貝到使用者程序空間。

非同步io:

使用者程序發起io請求之後,執行緒繼續往下執行。從核心的角度,當它收到乙個aio_read之後,它會立刻返回,所以不會對使用者程序產生阻塞。核心會等待資料準備完成,然後將資料拷貝到使用者記憶體,拷貝完成後,kernel會給使用者程序傳送乙個signal,告訴它read操作完成了。或者將資料複製到核心緩衝區,並寫入到磁碟中。

以上,阻塞io、非阻塞io、io復用是同步io。

I O模型 阻塞 非阻塞 I O復用 同步 非同步

第一手教育 2016 10 14 11 25 i o模型不論在實際使用還是準備筆試面試中都是重要的內容,參考unix網路程式設計進行總結如下。尤其注意紅色標註處 1.明確i o考察的物件和流程 參考unix網路程式設計,乙個輸入操作通常包括兩個不同的階段 1 等待資料準備好 2 從核心向程序複製資料...

網路IO模型(同步非同步,阻塞非阻塞)

摘錄自 網路應用需要處理的無非兩大類問題 網路i o,資料計算 網路io的模型大致有如下幾種 同步模型 阻塞非阻塞 多路復用 訊號驅動式 非同步io 網路io的本質是socket的讀取,socket在linux系統被抽象為流,io可以理解為對流的操作。這個操作分為2個階段 1 等待流資料準備 2 從...

阻塞 非阻塞 同步 非同步以及IO模型

什麼是同步和非同步?什麼是阻塞和非阻塞?同步就意味著阻塞嗎?非同步就一定是非阻塞嗎?另外io模型一共5種,這裡面也涉及到同步非同步,阻塞非阻塞不同的組合,如果直接理解起來是比較費勁的,所以可以先把同步非同步,阻塞非阻塞理解清楚,那麼理解io模型將會好很多。從簡單的開始,我們以經典的讀取檔案的模型舉例...