1. 程式人生 > >同步I/O、異步I/O與阻塞I/O、非阻塞I/O的區別

同步I/O、異步I/O與阻塞I/O、非阻塞I/O的區別

img bubuko 當前 NPU 進程空間 寫入 tro 通過 接收

一、I/O

技術分享圖片  I/O (Input/Output,輸入/輸出)即數據的讀取(接收)或寫入(發送)操作。

  通常用戶進程中的一個完整I/O分為兩階段:用戶進程空間<-->內核空間、內核空間<-->設備空間(磁盤、網絡等)。

  I/O有內存I/O、網絡I/O和磁盤I/O三種,通常我們說的IO指的是後兩者。

二、同步I/O與異步I/O

  同步和異步關註的是消息通信機制 (synchronous communication/ asynchronous communication)

  所謂同步,就是在發出一個調用時,在沒有得到結果之前,該調用就不返回。但是一旦調用返回,就得到返回值了。

  換句話說,就是由調用者主動等待這個調用的結果。

  而異步則是相反,調用在發出之後,這個調用就直接返回了,所以沒有返回結果。

  換句話說,當一個異步過程調用發出後,調用者不會立刻得到結果。而是在調用發出後,被調用者通過狀態、通知來通知調用者,或通過回調函數處理這個調用。

  舉個通俗的例子:

  你打電話問書店老板有沒有《分布式系統》這本書,如果是同步通信機制,書店老板會說,你稍等,”我查一下",然後開始查啊查,等查好了(可能是5秒,也可能是一天)告訴你結果(返回結果)。

  而異步通信機制,書店老板直接告訴你我查一下啊,查好了打電話給你,然後直接掛電話了(不返回結果)。然後查好了,他會主動打電話給你。在這裏老板通過“回電”這種方式來回調。

三、阻塞I/O、非阻塞I/O

  阻塞和非阻塞關註的是程序在等待調用結果(消息,返回值)時的狀態

  阻塞調用是指調用結果返回之前,當前線程會被掛起。調用線程只有在得到結果之後才會返回。

  非阻塞調用指在不能立刻得到結果之前,該調用不會阻塞當前線程。

  舉個通俗的例子:

  你打電話問書店老板有沒有《分布式系統》這本書,你如果是阻塞式調用,你會一直把自己“掛起”,直到得到這本書有沒有的結果。

  如果是非阻塞式調用,你不管老板有沒有告訴你,你自己先一邊去玩了, 當然你也要偶爾過幾分鐘check一下老板有沒有返回結果。

  在這裏阻塞與非阻塞與是否同步異步無關。跟老板通過什麽方式回答你結果無關。

同步I/O、異步I/O與阻塞I/O、非阻塞I/O的區別