-----------------------------------------------------
BIO/NIO/AIO 中的 IO 指的是什么? 为什么网上一讲到 BIO/NIO/AIO 就是 Socket 编程, 网络编程 blabla 一堆? NIO 是不是就是 java nio 库?
其实这是笔者的一大疑问, 我们最常接触的 IO 不应该是文件 IO 么, 怎么一上来就是 Socket 编程, 网络编程 blabla 一大堆. 这大概要从 IO 的概念和发展历史来理解了 (以下观点包含大量个人理解):
广义上来讲, IO(Input/Output) 可以指任何系统 or 设备之间的数据输入输出操作, 我们这边讨论的是应用程序与其他应用程序 or IO 设备之间的数据传输, 而这个数据传输的过程抽象就叫 IO,BIO/NIO/AIO 只是 IO 过程的不同模型, 全称分别是 blocking-io 阻塞式的 IO,non-blocking-io 非阻塞式的 IO,asynchronized-io 异步式的 IO, 概念上来说 BIO/NIO/AIO 适用于文件 IO, 网络 IO 等所有的 IO, 具体看是否有相关的实现罢了. 至于网上为什么都是 Socket 编程, 网络编程, 主要是因为 NIO/AIO 的出现本身就是因为 BIO 模型的效率不足以适应高并发的网络环境, 为了提高网络 IO 并发处理效率而产生的, 在文件 IO 系统中应用好处并不是非常大, 所以慢慢地提到 NIO/AIO 默认视为网络 IO 了. 讲到这, 应该也能清楚 NIO≠java.nio,NIO 是一种 IO 模型, java.nio 只是一个实现库, 而且全称是 new io, 区别有原来的 io 库罢了, 里面不仅包含 NIO 的实现, 还包含 AIO 的实现.
BIO vs NIO,Blocking 到底指的啥? 为啥 NIO 能提高并发效率?
首先, 我们需要理解网络 IO 的整个过程, 网络 IO 主要分为两个部分 or 状态: 网卡可读, 应用程序可读 (真正可读). 这两个部分其实很好理解, 当一个网络请求过来时, 都是先经由网卡接收数据, 然后再把数据从网卡读入内存中, 这样才完成了整个 IO 操作. BlO 和 NIO 的区别在于在应用程序可读之前, BIO 会阻塞线程, NIO 则是会立即返回结果. 至于这样为什么会提高并发效率, 举个例子:
假设网卡读写时间为 2s, 应用程度读写时间为 1s
BIO 模型下每个连接的耗时为 3s, 处理能力为 20 个 / 分钟;
而 NIO 模型下, 应用程序无需等待那些处于网卡可读状态的连接, 所以每个连接耗时为 1s, 处理能力为 60 个 / 分钟!
除此之外, NIO 还支持同时监听多个 IO 渠道, 面向缓冲区支持双向操作, 这些也是其优点.
有了 NIO 还不够? AIO 又是干嘛的?
AIO 模型的定义是缓冲区与底层 IO 系统之间的数据读写操作都是由操作系统完成的, 上层应用程序都是通过回调函数的方式去操作缓冲区的数据, 对于上层应用程序来说只关心缓冲区数据读写好了的结果, 并不关心数据从哪里来到哪里去的过程. 至于为什么 AIO 会出现, 这个笔者也未完全理解, 主流的说法是 NIO Selector 检查通道是否可读 / 写时采用是轮询操作, 效率上仍存在改进的空间, 而 AIO 完全基于系统层面的事件通知, 不需要主动去轮询, 效率上来说更加高效.
来源: http://www.bubuko.com/infodetail-3164902.html