最传统的一种IO模式,即在读写的过程中发生阻塞,当用户发起IO请求后,内核会去查看数据是否就绪,如果没有就绪会等待线程就绪,而用户的请求线程就会进入阻塞状态,用户线程交出cpu控制权,当数据准备就绪,内核将会数据拷贝到用户线程,用户线程才会接触block状态。典型的IO模式例子就是data:socket.read()。

非阻塞IO则是在read的时候不需要等待,如果得到结果是false,则知道数据没有准备好,这时候则会继续发送read操作,一旦数据在buffe缓存里准备好了,这时候则可以获取到数据,然后返回。所以他的cpu控制权是不是释放的,会一直使用。

多路复用IO模式,是目前使用比较多的模式,上面说的非阻塞IO实际上就是多路复用IO,他的工作原理是:有一个线程不断的去轮询多个socket的状态,当socket真的发生了读写事件的时候,才会真正的调用read。这里是一个线程管理多个socket,而不是普通的NIO通过select()方法来read数据,当只有socket真的发生读写的时候,才会占用cpu资源去进行读操作。

另外为何多路复用比NIO效率更高,因为NIO是在不断的发送read查socket数据的,而多路复用,是把有数据的socket放在一个缓存区,轮询看哪个socket有数据,再去read()。不过多路复用IO是通过轮询的方式检测是否有事件大到达,并对事件逐一响应,当某个事件很大的时候,会影响后面事件的处理效率和事件轮播。

信号驱动IO,当用户发起一个IO请求的时候,会给对应的socket注册一个信号函数,然后用户线程会继续执行,当内核数据就绪时候会发送信号给用户线程,这时候用户线程会调用IO操作read读数据。

异步IO模式可以说是最理想的IO,当用户线程发起读操作的时候就可以去做其他事,完全不会发生阻塞,而内核的角度,java7提供的AsynchronousIO read之后,会立刻返回数据,说明数据已经返回,不会对用户线程block,然后内核数据准备完毕吧数据拷贝到用户线程,然后给用户线程发送一个信号,让他来读取数据,不需要用户线程发起IO操作,意思就是当数据准备完毕,用户线程读取数据之前,IO操作已经结束了。也就是说在异步中,IO的两个操作都不会阻塞,两个阶段都是由内核完成的。

JAVA NIO

Java的三大核心部分:Channel(通道),Buffer(缓存区),Selector。传统的IO基于字节和字符进行操作,而NIO则是通过Channel通道和buffer缓存来进行操作,数据总是通过通道发送到缓存,在从缓存读取到通道。Selector选择区用于监听多个通道事件(比如连接打开,数据到达),因此单个线程可以监听多个数据通道。(所以NIO是面向缓冲区的,IO是面向流的)

NIO的缓冲区是什么呢?java io面向的是流,意味着每次从流中读取一个或者多个字节,直到全部读取完,不会存在任何地方,此外他不能前后移动流中的数据,如果需要移动,则吧他们先存到缓冲区。NIO的缓冲和java 的io不同,数据先读取到缓冲区,可以在里面前后移动,这就增加了数据处理的灵活性,但是还需要检测缓冲区是否有您处理的数据,已经保证数据量过大的时候,不会覆盖缓冲区里的未处理数据。

NIO的非阻塞,io的各种流都是阻塞的,意味着当线程调用read后者write的时候,会进入阻塞状态,不能做任何其他事,直到数据完全查询或者写入。NIO的非阻塞模式使一个线程从通道发送请求数据,但他仅能得到目前缓存区已经有的数据,如果没有数据,则什么都没有获取到,也就不会阻塞影响线程做其他事。非阻塞写也是如此,当线程请求通道写入的时候,不需要等待写入完毕,则可以去做其他事。这就是为什么一个线程可以管理多个输入输出通道channel的原因。

Channel和io中的stream流差不多一个等级的。只不过stream是单向的,但是channel是双向的,可以读也可以写。主要实现有FileChannel、DatagramChannel、socketChannel、ServerSocketChannel。

Buffer缓冲区实际就是一个容器,一个连续的数组,channel提供从文件网络读取数据的渠道,但是读取和写入都必须经过buffer。    Buffer是一个抽象类,常用的有byteBuffer,intBffer等。他的流程就是数据读的时候先进入buffer然后到通道里,写数据的时候也是先从通道到buffer然后到server。

Selector是NIO的一个核心类,selector可以检测多个注册通道是否有事件发生,以便获取事件然后针对每个事件进行响应处理。这样一来只需要单个线程就能处理多个通道,当真的监听到读写时间,才会调用函数,减少了系统的开销,不必为每个连接都创建一个线程,不用维护线程,避免上下文切换。

JAVA的IO/NIO?相关推荐

  1. java中io.nio.aio_Java中网络IO的实现方式-BIO、NIO、AIO

    在网络编程中,接触到最多的就是利用Socket进行网络通信开发.在Java中主要是以下三种实现方式BIO.NIO.AIO. 关于这三个概念的辨析以前一直都是好像懂,但是表达的不是很清楚,下面做个总结完 ...

  2. JAVA的 IO/NIO 从生瓜蛋子到大头兵

    1.常见的IO模型: 阻塞 IO 模型 最传统的一种 IO 模型,即在读写数据过程中会发生阻塞现象.当用户线程发出 IO 请求之后,内 核会去查看数据是否就绪,如果没有就绪就会等待数据就绪,而用户线程 ...

  3. java io nio socket_通过socket编程掌握IO流 —— NIO

    一.本次目标 改造server,采用NIO读取client信息: 改造client,亦采用NIO发送消息,与之前不同的BIO形成对比: 二.编码 1.新建byte数组拼接公共类 主要用作在channe ...

  4. Java之IO,BIO,NIO,AIO

    2019独角兽企业重金招聘Python工程师标准>>> 参考文献一 IO基础知识回顾 java的核心库java.io提供了全面的IO接口.包括:文件读写.标准设备输出等.Java中I ...

  5. Java 网络IO编程总结(BIO、NIO、AIO均含完整实例代码)

    本文会从传统的BIO到NIO再到AIO自浅至深介绍,并附上完整的代码讲解. 下面代码中会使用这样一个例子:客户端发送一段算式的字符串到服务器,服务器计算后返回结果到客户端. 代码的所有说明,都直接作为 ...

  6. java基础IO BIO、NIO、AIO的区别

        Java IO(Java数据流)主要就是Java用来读取和输出数据流.它有对应的一系列API.主要是java.io.*,和java.nio.*. Java中IO主要有两类 |-->字节流 ...

  7. Java的IO:BIO | NIO | AIO

    原文: http://my.oschina.net/bluesky0leon/blog/132361 BIO | NIO | AIO,本身的描述都是在Java语言的基础上的.而描述IO,我们需要从两个 ...

  8. java 修改最大nio连接数_关于java流的几个概念:IO、BIO、NIO、AIO,有几个人全知道?...

    关于同步.阻塞的知识我之前的文章有介绍,所以关于流用到这些概念与之前多线程用的概念一样. 下面具体来看看java中的几种流 IO/BIO BIO就是指IO,即传统的Blocking IO,即同步并阻塞 ...

  9. java中的NIO和IO到底是什么区别?20个问题告诉你答案

    摘要:NIO即New IO,这个库是在JDK1.4中才引入的.NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多. 本文分享自华为云社区<jav ...

最新文章

  1. 一键控制全屋设备,AI交互时代来临
  2. 互联网金融真能救汽车电商的梦吗?
  3. 编码和解码、调制与解调
  4. 【火爆】9张图让你知道大佬们的互联网思维
  5. 13寸笔记本电脑尺寸_2020笔记本电脑推荐(华为篇)
  6. C语言 数据结构 链表的增删查改
  7. 浙江省高等学校计算机等级考试有什么用,06秋年秋浙江省高等学校计算机等级考试试卷(三级数据库技术及应用)...
  8. git分支建立删除,打tag
  9. dom4j 中文api
  10. python能做什么excel-python处理excel总结
  11. 四则运算2之设计思路篇
  12. linux下如何部署php,linux如何部署php
  13. 不要放弃你的自由——答一些网友的评论
  14. JAVA程序设计基础(第六版)第六章习题 6.13
  15. GC算法精解(分代搜集算法)
  16. pdf.js 跨域 php,JavaScript_js跨域资源共享 基础篇,本文详细介绍了javascript跨域资 - phpStudy...
  17. 2021Web前端人事面试题总结精选
  18. android系统中wifi省电模式下的四个基本概念:TIM、DTIM、Beacon-Interval、Listen-Interval
  19. window下isa防火墙详细安装
  20. [报错解决]CondaSSLError: OpenSSL appears to be unavailable on this machine. OpenSSL is required to downl

热门文章

  1. 【农历】计算方法--- (阳历转阴历)
  2. 工业通讯领域的总线、协议、规范、接口、数据采集与控制系统
  3. 美的智能家电搭载华为鸿蒙系统产品将大批量上市;蔡天乐将出任麦德龙中国总裁 | 美通企业日报...
  4. 激光测距仪全国产化电子元件推荐方案
  5. 秋季,高级灰这样搭配,怪不得这么潮!
  6. jndi weblogic mysql_WebLogic配置JNDI数据源及在项目的使用方法
  7. 远景能源面试+高管终面
  8. 淘宝/天猫API,获得淘宝商品评论返回值说明(数据解析)
  9. CDN工作原理及淘宝双十一图片访问实战
  10. SaaS 前世今生:老树开新花