同步與異步IO、阻塞與非阻塞IO
PS. 我理解這里的意思是,read請求是非阻塞的,但是這里沒有異步通知機制,而需要應用程序主動查詢,所以是同步的。(多次試探)
異步阻塞 I/O
另外一個阻塞解決方案是帶有阻塞通知的非阻塞 I/O。在這種模型中,配置的是非阻塞 I/O,然后使用阻塞 select 系統(tǒng)調用來確定一個 I/O 描述符何時有操作。使 select 調用非常有趣的是它可以用來為多個描述符提供通知,而不僅僅為一個描述符提供通知。對于每個提示符來說,我們可以請求這個描述符可以寫數據、有讀數據可用以及是否發(fā)生錯誤的通知。
圖 4. 異步阻塞 I/O 模型的典型流程 (select)
select 調用的主要問題是它的效率不是非常高。盡管這是異步通知使用的一種方便模型,但是對于高性能的 I/O 操作來說不建議使用。
PS. 我理解這里的意思是,read請求實際上是非阻塞的,但是在異步通知方式上,采用了阻塞的slect系統(tǒng)調用,導致應用程序被阻塞,所以雖然異步,但任然阻 塞。(等待通知,自己完成)
異步非阻塞 I/O(AIO)
最后,異步非阻塞 I/O 模型是一種處理與 I/O 重疊進行的模型。讀請求會立即返回,說明 read 請求已經成功發(fā)起了。在后臺完成讀操作時,應用程序然后會執(zhí)行其他處理操作。當 read 的響應到達時,就會產生一個信號或執(zhí) 行一個基于線程的回調函數來完成這次 I/O 處理過程。
圖 5. 異步非阻塞 I/O 模型的典型流程
在一個進程中為了執(zhí)行多個 I/O 請求而對計算操作和 I/O 處理進行重疊處理的能力利用了處理速度與 I/O 速度之間的差異。當一個或多個 I/O 請求掛起時,CPU 可以執(zhí)行其他任務;或者更為常見的是,在發(fā)起其他 I/O 的同時對已經完成的 I/O 進行操作。
PS. 我理解這里的意思是,read請求實際上是非阻塞的,但是在異步通知方式上,采用了回調函數,無需應用程序再去處理。(委托完成)
異步I/O的動機
從前面 I/O 模型的分類中,我們可以看出 AIO 的動機。阻塞模型要求在 I/O 操作開始時阻塞應用程序,這意味著不可能同時重疊進行處理和 I/O 操作。同步非阻塞模型允許處理和 I/O 操作重疊進行,但是這需要應用程序根據重現的規(guī)則來檢查 I/O 操作的狀態(tài)。這樣就剩下異步非阻塞 I/O 了,它允許處理和 I/O 操作重疊進行,包括 I/O 操作完成的通知。
這里我要特別強調一下異步IO和非阻塞IO的區(qū)別,異步IO就是把IO提交給系統(tǒng),讓系統(tǒng)替你做,做完了再用某種方式通知你;非阻塞IO就是你要通過某種方式不定時地向系統(tǒng)詢問你是否可以開始做某個IO,當可以開始后,還是要自己來完成IO
關鍵詞:
同步異步IO阻塞非阻塞I
評論