目錄
一、同步與非同步
二、阻塞與非阻塞
三、BIO(Blocking I/O,阻塞I/O)
四、NIO(Non-blocking I/O,非阻塞I/O)
五、AIO(Asynchronous I/O,異步I/O)
同步阻塞:燒水一直站旁邊等到水開
同步非阻塞:燒上水后去做其他事,時不時去看一看水開沒開
異步非阻塞:燒上水后去做其他事,直到聽見水開的聲音
一、同步與非同步
- 同步:同步就是發起一個調用后,被調用者未處理完請求之前,調用不返回。
- 異步:異步就是發起一個調用后,立刻得到被調用者的回應表示已接收到請求,但是被調用者并沒有返回結果,此時我們可以處理其他的請求,被調用者通常依靠事件,回調等機制來通知調用者其返回結果。
二、阻塞與非阻塞
- 阻塞:阻塞就是發起一個請求,調用者一直等待請求結果返回,也就是當前線程會被掛起,無法從事其他任務,只有當條件就緒才能繼續。
- 非阻塞:非阻塞就是發起一個請求,調用者不用一直等著結果返回,可以先去干其他事情。
三、BIO(Blocking I/O,阻塞I/O)
傳統的 I/O 模型,所有操作都是阻塞的。當一個線程執行 I/O 操作(如讀取數據)時,會一直阻塞直到數據準備完成或操作結束,期間無法進行其他任務。
通常采用一連接一線程的模式,即每個客戶端連接都需要一個獨立的線程來處理。
- 優點:實現簡單,易于理解和編碼。
- 缺點:資源消耗大,當并發量高時,會創建大量線程,導致系統開銷劇增, scalability(可擴展性)差。
- 適用場景:并發量小、連接數少且固定的場景,如簡單的本地文件操作或低并發的網絡應用。
四、NIO(Non-blocking I/O,非阻塞I/O)
基于緩沖區(Buffer)、通道(Channel)和選擇器(Selector)實現,操作是非阻塞的。線程在進行 I/O 操作時,如果數據未準備好,不會一直等待,而是可以去處理其他任務,稍后再檢查操作是否完成。
采用多路復用模式,一個選擇器可以監控多個通道的 I/O 事件(如連接請求、數據可讀等),一個線程可以處理多個客戶端連接。
- 優點:減少了線程數量,降低了系統資源消耗,提高了并發處理能力。
- 缺點:編程復雜度較高,需要處理緩沖區、通道和選擇器之間的交互。
- 適用場景:高并發、I/O 密集型的場景,如服務器端的網絡通信(如 Nginx 部分采用了類似 NIO 的思想)。
五、AIO(Asynchronous I/O,異步I/O)
完全異步的 I/O 模型,操作發起后,線程無需等待操作完成,而是繼續執行其他任務,當 I/O 操作完成后,系統會通知線程(通過回調函數等方式)處理結果。
基于回調機制,當應用程序發起 I/O 操作后,內核會在操作完成后主動通知應用程序。
- 優點:進一步提升了系統的并發處理能力,線程利用率更高,無需像 NIO 那樣主動輪詢檢查操作狀態。
- 缺點:實現和理解難度較大,在一些場景下可能存在回調嵌套過深的問題。
- 適用場景:對響應時間要求高、并發量極大的場景,如高性能的服務器端應用、大數據處理等。