IO
IO的核心就是數據傳輸,也就是程序與外部設備之間進行傳輸,通過IO的核心可以分為,
文件IO和網絡IO
文件IO交互的對象就是本地存儲設備,比方說讀寫本地文件。
網絡IO交互的對象就是網絡設備,核心的應用場景就是網絡通信。
按照操作方式來進行劃分:同步IO和異步IO
同步IO核心邏輯是指調用者發起IO請求之后必須等待IO操作完全完成,才能繼續執行,缺點就是效率低,應用場景大部分簡單業務。
異步IO調用者發起IO請求后,無需等待,直接返回,IO完成后內核通知告知調用者和。缺點就是邏輯復雜,需要進行通知處理,應用在高并發場景。
按照內核是否拷貝數據分:阻塞IO和非阻塞IO。
阻塞IO核心邏輯是發起請求之后內核若數據未準備好,會讓調用者阻塞,直到數據準備好并完成拷貝,才會叫醒調用者。
非阻塞IO:核心邏輯是調用者發起請求后,內核數據未準備好,會立即返回未就緒狀態,調用者需要通過輪詢進行反復的查找,確認數據是否準備好
經典IO模型
1. BIO - Blocking I/O (阻塞 I/O)
為什么叫“BIO”?
因為它代表?Blocking I/O。在 Java 1.4 之前,只有一套原始的 I/O API(java.io
?包,如?InputStream
,?OutputStream
,?ServerSocket
,?Socket
)。這套 API 的核心特征就是?阻塞。“阻塞”體現在哪里?
當線程調用?read()
?或?accept()
?等方法時,線程會被掛起,直到數據準備好或連接建立成功。在此期間,這個線程什么也干不了,就像被“阻塞”住了一樣。設計模式:
通常采用?“一個連接一個線程”?的模型。當并發連接數很高時,需要創建大量線程,而線程上下文切換的開銷巨大,會耗盡系統資源。
結論:BIO 是以其最核心的特征——Blocking(阻塞)——來命名的。
2. NIO - New I/O / Non-blocking I/O (新的 I/O / 非阻塞 I/O)
為什么叫“NIO”?
這個名字有雙重含義:字面意思:New I/O。因為在 Java 1.4 中,它是一套全新的?I/O API(
java.nio
?包),旨在解決 BIO 的性能瓶頸。核心特性:Non-blocking I/O。這是這套新 API 最引人注目的特性之一。它提供了非阻塞的工作模式。
“非阻塞”體現在哪里?
線程可以向通道(Channel)發起一個讀請求,如果當時沒有數據可用,線程不會被掛起,而是立刻得到一個返回結果(比如返回 0),然后這個線程可以馬上去處理其他通道的請求。核心機制:
它的非阻塞能力是建立在?I/O 多路復用?機制之上的(通過?Selector
?實現)。一個線程可以輪詢多個通道(Channel),看哪些已經就緒,然后只對那些就緒的通道進行實際的 I/O 操作。這才是它能夠用少量線程處理大量連接的關鍵。
結論:NIO 的名字既代表了它是“新”的 API,也強調了其“非阻塞”的核心特性。
3. AIO - Asynchronous I/O (異步 I/O)
為什么叫“AIO”?
因為它代表?Asynchronous I/O。這是在 Java 7 中引入的,更加強大和徹底的異步 I/O 模型。“異步”體現在哪里?
它與“非阻塞”有本質區別:NIO (Non-blocking): 是?同步的。你需要不斷地主動去問(輪詢)數據好了沒有,然后自己去拷貝數據。
AIO (Asynchronous): 是?真正異步的。你只需要發起一個 I/O 操作(如?
read
),并提供一個回調函數。當內核完成所有工作(包括數據準備和從內核空間拷貝到用戶空間)后,會主動通知你,并調用你提供的回調函數。
整個過程,應用程序線程完全不需要參與,可以繼續執行其他邏輯。
實現:
在 Java 中,AIO 的相關類在?java.nio.channels
?包下,主要以?AsynchronousSocketChannel
,?AsynchronousServerSocketChannel
?和?CompletionHandler
?為核心。
結論:AIO 的名字準確地描述了其“異步”的本質特征,即“你叫我,我來做,做好了回調告訴你”。
縮寫 | 全稱 | 中文 | 核心特征 | 模型 | 比喻 |
---|---|---|---|---|---|
BIO | Blocking I/O | 阻塞式 I/O | 調用會阻塞線程 | 同步阻塞 | 同步排隊:在餐廳點餐后,必須站在柜臺前傻等,直到餐做好。 |
NIO | New I/O Non-blocking I/O | 新的 I/O 非阻塞 I/O | 調用不會阻塞線程 | 同步非阻塞 (I/O多路復用) | 異步排隊:點餐后拿個號,你可以去玩手機,但需要不時抬頭看屏幕是否叫到你的號,然后自己去取。 |
AIO | Asynchronous I/O | 異步 I/O | 由系統完成后回調 | 異步非阻塞 | 外賣:手機下單后就不用管了,外賣小哥會直接送到你手上,并通知你。 |
“BIO 和 NIO 的命名主要源于 Java API 的演進。BIO 代表 Blocking I/O,強調了其阻塞的特性。NIO 既是 New I/O(一套新的 API),也代表了 Non-blocking I/O(其核心特性之一)。而 AIO 則明確代表了 Asynchronous I/O,即異步 I/O 模型,這是從它們最根本的行為特征來命名的。”