1.关于NIO、BIO

  BIO blocking IO

  NIO non-blocking IO (因为是JDK1.4之后推出的也有称为 new IO,感觉前者更贴切吧)

  经过一段时间的学习才发现,原来NIO、BIO并不是由上层的处理模式决定的,只是一般来说,BIO的通信处理模式底层的IO是阻塞的(blocking),而NIO的通信处理模式是的底层IO是非阻塞的(NIO non-blocking),底层的IO的特性当然也会影响和决定上层的设计,所以之前习惯性的就认为NIO就是说的NIO的通信处理模式(可能多数刚了解的都会这样理解吧),说什么NIO就是用一个线程来处理多个请求,不再像BIO那样,针对每一个请求都单独创建一个线程,所以NIO效率比BIO高等等。当时的理解确实太过浅显,现在把自己当前的理解记录一下,当然也参考了不少网上的资料。

2.BIO和NIO的区别:

  BIO: 阻塞IO,底层使用的是阻塞IO模型,面向流,流意味着单向性,而且BIO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方。此外,它不能前后移动流中的数据。通过JDK的源码InputStream中的read方法的注释可以看到,读取数据的时候会发生阻塞 (见下方代码)直到:1.有数据可读2.数据读取完毕3.发生异常,同理可见OutputStream的write()方法的注释也是一样的,会一直阻塞直到:1所有字节发送完毕2.发生异常。这意味着当网络传输比较缓慢的时候,读取输入流的乙方的通信线程将被长时间阻塞,如果输入流的一方需要一分钟才能把1K的数据发送完,那么读取的一方的IO线程也会被阻塞一分钟。同理,如果读取一方的网络缓慢不能及时从TCP的缓冲区中读取数据,这将会导致发送方的的Window Size不断减小,直到为0,双方处于keep-Allive状态,消息发送方将不能再向TCP缓冲区写入数据,直到TCP缓冲区的Windw Size大于0或者发生IO异常。由于Socket IO会阻塞,可以为每一个Socket创建一个Thread,实现多并发,但是这样的系统开销和资源浪费都太大,不是合理选择,可以使用线程池进行缓解,但大量连接的情况下,也应该会比较慢。

read方法的注解

  NIO:非阻塞,底层使用的是IO复用模型(同步非阻塞),面向缓冲区,Java NIO的缓冲导向方法略有不同,数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动。这就增加了处理过程中的灵活性。但是,还需要检查是否该缓冲区中包含所有您需要处理的数据。而且,需确保当更多的数据读入缓冲区时,不要覆盖缓冲区里尚未处理的数据。

  NIO的主要三个核心模块:Selector(选择器),Channel(通道),Buffer(缓冲区)。Selector是选择器,Channel(Socket通信的通道)需要注册到选择器上,并且多个通道可以注册到一个选择器上面,这样可以使用一个线程就能管理多个通道,避免了BIO的问题,效率高出很多,而且减少了系统的开销。Selector可以轮询调用select(),这个方法会阻塞(但是也可以指定阻塞时间,到达时间后会立即返回)。当注册的某个通道准备好要进行IO操作时,这个便返回已选择键的个数,此时通过selectedKeys获得已选择的键(SelectionKey),通过SelectionKey可以关联到对应的Channel,然后就可以进行相关的IO操作了,另外,NIO的数据读和写使用的都是 Buffer,Channel从Buffer中读取数据或者将数据写入到Buffer中。

转载于:https://www.cnblogs.com/tuliang/p/6292871.html

【原】NIO通信模型和BIO通信模型相关推荐

  1. 架构设计:系统间通信(4)——IO通信模型和JAVA实践 中篇

    接上篇<架构设计:系统间通信(3)--IO通信模型和JAVA实践 上篇> 4.多路复用IO模型 在"上篇"文章中,我们已经提到了使用多线程解决高并发场景的问题所在,这篇 ...

  2. 架构设计:系统间通信(5)——IO通信模型和JAVA实践 下篇

    接上篇:<架构设计:系统间通信(4)--IO通信模型和JAVA实践 中篇>,我们继续讲解 异步IO 7.异步IO 上面两篇文章中,我们分别讲解了阻塞式同步IO.非阻塞式同步IO.多路复用I ...

  3. Java NIO 通信框架在电信领域的实践

    点击上方↑↑↑"微服务蜂巢"关注我们 1. 华为电信软件技术架构演进 1.1. 电信软件 从广义上看电信软件的范围非常广,细分实际可以分为两大类:系统软件和业务应用软件. 系统软件 ...

  4. Java NIO通信框架在电信领域的实践

    1. 华为电信软件技术架构演进 1.1. 电信软件 从广义上看电信软件的范围非常广,细分实际可以分为两大类:系统软件和业务应用软件. 系统软件包括路由器底层的信令机软件.手机操作系统等,业务应用软件主 ...

  5. Reactor模型和Proactor模型:同步IO与异步IO

    Table of Contents 服务端的线程模型 2种fd 3种事件 Reactor模型-同步I/O 1.单Reactor单线程模型 2.单Reactor多线程模型 3.主从Reactor多线程模 ...

  6. 彻底搞懂Reactor模型和Proactor模型

    在高性能的I/O设计中,有两个著名的模型:Reactor模型和Proactor模型,其中Reactor模型用于同步I/O,而Proactor模型运用于异步I/O操作. 服务端的线程模型 无论是Reac ...

  7. TCP/IP四层模型和OSI七层模型

    TCP/IP四层模型和OSI七层模型对应表.我们把OSI七层网络模型和Linux TCP/IP四层概念模型对应,然后将各种网络协议归类.     表1-1  TCP/IP四层模型和OSI七层模型对应表 ...

  8. 【Netty】Netty线程模型和EventLoop

    Netty线程模型和EventLoop 由于线程模型确定了代码执行的方式,它可能带来一些副作用以及不确定因素, 可以说这是并发编程中最大的难点,因此,我们需要了解Netty所采用的线程模型,这样 在遇 ...

  9. 基于JVM原理、JMM模型和CPU缓存模型深入理解Java并发编程

    许多以Java多线程开发为主题的技术书籍,都会把对Java虚拟机和Java内存模型的讲解,作为讲授Java并发编程开发的主要内容,有的还深入到计算机系统的内存.CPU.缓存等予以说明.实际上,在实际的 ...

最新文章

  1. 给博客增加了一个主题Nautica02Liquid
  2. poj2154Color polya定理+欧拉函数优化
  3. jzoj1768,P2704,POJ1185-[NOI2001]炮兵阵地【状态压缩dp】
  4. 谈谈我国电子商务中的安全问题
  5. 个性化推荐与知识图谱在剧本杀行业的应用与实践
  6. UML图---基本概念
  7. linux查找启动程序的路径
  8. Tomcat的三种会话保持
  9. bzoj1061 志愿者招募
  10. 御剑仙侠服务器维护,修仙无双御剑仙侠
  11. 基于SNMP网络管理系统的实现
  12. 【辅助开发】游戏辅助开发全流程-golang
  13. 用C/C++自己写一个宋词生成器,气质一下子就上来了呀
  14. ImageMagick中的convert命令转JEPG图像到PNG
  15. java官网教程(服务器篇)—— 并发
  16. 各项异性扩散滤波 -- OpenCV实现
  17. 计算机里删除的文件可以在哪里进行恢复,电脑上删除的文件怎么恢复?方法在这里...
  18. Tomcat的安装使用,修改默认8080端口号,查询端口号命令
  19. 大学计算机实验六文件管理与磁盘恢复,虚拟实验:文件管理与磁盘恢复.pdf
  20. 高考录取系统的模拟(1)——成绩的模拟生成程序

热门文章

  1. file-max与ulimit的设置,nginx 500错误的原因
  2. KVM的安装和配置命令详解
  3. WebService中运用自定义类的处理要领(转)
  4. 2010-03-23 杂七杂八
  5. oracle正则表达式
  6. 数据绑定--Repeater, DataList, or GridView?
  7. vue2自定义分页组件,可设置每页显示数量,指定跳转具体页面
  8. 蓝桥杯 ALGO-91 算法训练 Anagrams问题
  9. 通过MBean server监控weblogic应用
  10. linux下安装tuxedo