IO(Input/Output,輸入輸出) 在電腦中,輸入 / 輸出(即 IO)是指信息處理系統(比如電腦)和外部世界(可以是人或其他信息處理系統)的通信。輸入是指系統接收的信號或數據,輸出是指從系統發出的數據或信號。由於程式和運行時數據是在記憶體中駐留,由 CPU 這個超快的計算核心來執行,涉及 ...
IO(Input/Output,輸入輸出)
在電腦中,輸入 / 輸出(即 IO)是指信息處理系統(比如電腦)和外部世界(可以是人或其他信息處理系統)的通信。輸入是指系統接收的信號或數據,輸出是指從系統發出的數據或信號。由於程式和運行時數據是在記憶體中駐留,由 CPU 這個超快的計算核心來執行,涉及到數據交換的地方,通常是磁碟、網路等,就會有 IO 產生。
同步 - 非同步
同步和非同步是一種消息通信機制 (synchronous communication/asynchronous communication),關註點在於 被調用者返回
和 結果返回
之間的關係, 描述對象是被調用對象的行為。
# 同步(Synchronous):在發出一個同步調用時,在沒有得到結果之前,該調用就不返回,等待返回結果才繼續執行後續的操作。
# 非同步( Asynchronous):發出調用,直接返回,不關心是否返回結果。非同步可以通過狀態、回調、 通知調用者結果,可以先去執行其他操作,然後等待通知再回來執行剛纔沒執行完的操作。
阻塞 - 非阻塞
阻塞和非阻塞是一種業務流程處理方式。關註點在於調用發生時 調用者狀態
和 被調用者返回結果
之間的關係。 描述的是等待結果時候調用者的狀態此時結果可能是同步返回的,也能是非同步返回。
# 阻塞( Blocking ):在結果返回之前,當前線程被掛起,後續代碼只有在結果返回後才能執行。
# 非阻塞( Nonblocking):在不能立刻獲取結果前,該調用不會阻塞當前線程。
同步阻塞 - 同步非阻塞
實際編程中,通過線程實現進程的同步非阻塞,通過協程實現線程的同步非阻塞。
# 同步阻塞:打電話問老闆有沒有某書(調用),老闆說查一下,讓你別掛電話(同步),你一直等待老闆給你結果,什麼事也不做(阻塞)。
# 同步非阻塞:打電話問老闆有沒有某書(調用),老闆說查一下,讓你別掛電話(同步),等電話的過程中你還一邊嗑瓜子(非阻塞)。
非同步阻塞 - 非同步非阻塞
# 非同步阻塞:打電話問老闆有沒有某書(調用),老闆說你先掛電話,有了結果通知你(非同步),你掛了電話後(結束調用), 除了等老闆電話通知結果,什麼事情也不做(阻塞)。
# 非同步非阻塞:打電話問老闆有沒有某書(調用),老闆說你先掛電話,有了結果通知你(非同步),你掛電話後(結束調用),一遍等電話,一遍嗑瓜子。(非阻塞)
IO 模型
5 種 I/O 模型:
- 阻塞式 I/O
- 非阻塞式 I/O
- I/O 復用(select,poll,epoll…)
- 信號驅動式 I/O(SIGIO)
- 非同步 I/O(POSIX 的 aio_系列函數)
IO 模型的具體解釋可以參考 linux 五種 IO 模型
參考資源