• 新版网站前后台即将上线,2019年将致力于提高文章质量,加大原创力度,打造一个更加舒适的阅读体验!
  • 极客文库小编@勤劳的小蚂蚁,为您推荐每日资讯,欢迎关注!
  • 新版网站前后台即将上线,2019年将致力于提高文章质量,加大原创力度,打造一个更加舒适的阅读体验!
  • 如果有任何体验不佳的地方,欢迎向客服反馈!

BIO、NIO与AIO

Java 中的 IO 部分比较复杂,具体可参看书籍《Java NIO》和《Netty 权威指南》。在此,仅对 BIO、NIO和 AIO进行概述性梳理,未涉及到具体实现细节,后续有空将深入展开。

同步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。

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 和异步文件传输,功能非常强大。

扩展面试题

问:谈一谈对同步 IO 和与异步 IO 的理解?
  • 同步是指用户进程触发 IO 操作并等待或轮询查看 IO 操作是否就绪。
  • 异步是指用户进程触发 IO 操作后便开始做其他事情,当 IO 操作完成时用户进程会得到相应的通知
问:谈一谈对阻塞与非阻塞的理解(针对 IO 操作)?
  • 在阻塞状态下,如果没有东西可读或不可写,读写函数将进入等待状态,直到有东西可读或可写再返回。
  • 非阻塞状态下,如果没有东西可读或不可写,读写函数马上返回,而并不会等待。
特殊说明:
以上两个题的参考答案仅供大家参考,与「BIO、NIO 和 AIO」部分的参考答案类似,只是个人觉得后者更有助于理解。另外,IO 操作部分涉及的内容真的很多,此次仅为概述性总结,后续有机会重点展开。

丨极客文库, 版权所有丨如未注明 , 均为原创丨
本网站采用知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议进行授权
转载请注明原文链接:BIO、NIO 与 AIO
喜欢 (0)
[247507792@qq.com]
分享 (0)
勤劳的小蚂蚁
关于作者:
温馨提示:本文来源于网络,转载文章皆标明了出处,如果您发现侵权文章,请及时向站长反馈删除。

欢迎 注册账号 登录 发表评论!

  • 精品技术教程
  • 编程资源分享
  • 问答交流社区
  • 极客文库知识库

客服QQ


QQ:2248886839


工作时间:09:00-23:00