同步IO和異步IO
參考答案:
IO操作主要分為兩個步驟,即發起IO請求和實際IO操作,同步IO與異步IO的區別就在於第二個步驟是否阻塞。
若實際IO操作阻塞請求進程,即請求進程需要等待或者輪詢查看IO操作是否就緒,則為同步IO。
若實際IO操作並不阻塞請求進程,而是由操作系統來進行實際IO操作並將結果返回,則為異步IO。
阻塞IO和非阻塞IO
參考答案:
IO操作主要分為兩個步驟,即發起IO請求和實際IO操作,阻塞IO與非阻塞IO的區別就在於第一個步驟是否阻塞。
若發起IO請求后請求線程一直等待實際IO操作完成,則為阻塞IO。
若發起IO請求后請求線程返回而不會一直等待,即為非阻塞IO。
- 同步,就是我調用一個功能,該功能沒有結束前,我死等結果。
- 異步,就是我調用一個功能,不需要知道該功能結果,該功能有結果后通知我(回調通知)。
- 阻塞,就是調用我(函數),我(函數)沒有接收完數據或者沒有得到結果之前,我不會返回。
- 非阻塞,就是調用我(函數),我(函數)立即返回,通過select通知調用者
BIO、NIO和AIO
參考答案:
BIO表示同步阻塞式IO,服務器實現模式為一個連接一個線程,即客戶端有連接請求時服務器端就需要啟動一個線程進行處理,如果這個連接不做任何事情會造成不必要的線程開銷,當然可以通過線程池機制改善。
NIO表示同步非阻塞IO,服務器實現模式為一個請求一個線程,即客戶端發送的連接請求都會注冊到多路復用器上,多路復用器輪詢到連接有I/O請求時才啟動一個線程進行處理。
AIO表示異步非阻塞IO,服務器實現模式為一個有效請求一個線程,客戶端的I/O請求都是由操作系統先完成IO操作后再通知服務器應用來啟動線程進行處理。
應用場景:
- BIO適用於連接數目比較小且固定的架構,該方式對服務器資源要求比較高,JDK 1.4以前的唯一選擇。
- NIO適用於連接數目多且連接比較短(輕操作)的架構,如聊天服務器,編程復雜,JDK 1.4開始支持,如在Netty框架中使用。
- AIO適用於連接數目多且連接比較長(重操作)的架構,如相冊服務器,充分調用操作系統參與並發操作,編程復雜,JDK 1.7開始支持。
備注:在大多數場景下,不建議直接使用JDK的NIO類庫(門檻很高),除非精通NIO編程或者有特殊的需求。在絕大多數的業務場景中,可以使用NIO框架Netty來進行NIO編程,其既可以作為客戶端也可以作為服務端,且支持UDP和異步文件傳輸,功能非常強大。