什麼是同步和非同步?什麼是阻塞和非阻塞?同步就意味著阻塞嗎?非同步就一定是非阻塞嗎?
另外io模型一共5種,這裡面也涉及到同步非同步,阻塞非阻塞不同的組合,如果直接理解起來是比較費勁的,所以可以先把同步非同步,阻塞非阻塞理解清楚,那麼理解io模型將會好很多。
從簡單的開始,我們以經典的讀取檔案的模型舉例。(對作業系統而言,所有的輸入輸出裝置都被抽象成檔案。)
在發起讀取檔案的請求時,應用層會呼叫系統核心的 i/o 介面。
如果應用層呼叫的是阻塞型 i/o,那麼在呼叫之後,應用層即刻被掛起,一直出於等待資料返回的狀態,直到系統核心從磁碟讀取完資料並返回給應用層,應用層才用獲得的資料進行接下來的其他操作。
如果應用層呼叫的是非阻塞 i/o,那麼呼叫後,系統核心會立即返回(雖然還沒有檔案內容的資料),應用層並不會被掛起,它可以做其他任意它想做的操作。(至於檔案內容資料如何返回給應用層,這已經超出了阻塞和非阻塞的辨別範疇。)
這便是(脫離同步和非同步來說之後)阻塞和非阻塞的區別。總結來說,是否是阻塞還是非阻塞,關注的是介面呼叫(發出請求)後等待資料返回時的狀態。被掛起無法執行其他操作的則是阻塞型的,可以被立即「抽離」去完成其他「任務」的則是非阻塞型的。
阻塞和非阻塞解決了應用層等待資料返回時的狀態問題,那系統核心獲取到的資料到底如何返回給應用層呢?這裡不同型別的操作便體現的是同步和非同步的區別。
對於同步型的呼叫,應用層需要自己去向系統核心問詢,如果資料還未讀取完畢,那此時讀取檔案的任務還未完成,應用層根據其阻塞和非阻塞的劃分,或掛起或去做其他事情(所以同步和非同步並不決定其等待資料返回時的狀態);如果資料已經讀取完畢,那此時系統核心將資料返回給應用層,應用層即可以用取得的資料做其他相關的事情。
而對於非同步型的呼叫,應用層無需主動向系統核心問詢,在系統核心讀取完檔案資料之後,會主動通知應用層資料已經讀取完畢,此時應用層即可以接收系統核心返回過來的資料,再做其他事情。
這便是(脫離阻塞和非阻塞來說之後)同步和非同步的區別。也就是說,是否是同步還是非同步,關注的是任務完成時訊息通知的方式。由呼叫方盲目主動問詢的方式是同步呼叫,由被呼叫方主動通知呼叫方任務已完成的方式是非同步呼叫。
最後,再來舉乙個我們日常的例子來加深對這幾個概念的理解。
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模型 同步 非同步 阻塞 非阻塞
linux os中,有幾種常見的io模型 程式進行io讀 寫操作通常包括幾個階段 資料準備 資料更新 阻塞式io 程式發起read io請求,核心接受到系統呼叫並開始對磁碟進行讀取資料到核心緩衝區,這一過程程式所在的執行緒是阻塞狀態的。資料準備好,核心需要將資料複製到使用者程序空間,複製過程也是阻塞...