阻塞 IO为什么叫BIO,非阻塞IO为什么叫NIO,异步IO为什么叫AIO
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 模型,这是从它们最根本的行为特征来命名的。”