一:事件分离器

在IO读写时,把 IO请求 与 读写操作 分离调配进行,需要用到事件分离器。根据处理机制的不同,事件分离器又分为:同步的Reactor和异步的Proactor。

Reactor模型:

    - 应用程序在事件分离器注册 读就绪事件 和 读就绪事件处理器- 事件分离器等待读就绪事件发生- 读就绪事件发生,激活事件分离器,分离器调用 读就绪事件处理器(即:可以进行读操作了,开始读)- 读事件处理器开始进行读操作,把读到的数据提供给程序使用

Proactor模型:

- 应用程序在事件分离器注册 读完成事件 和 读完成事件处理器,并向操作系统发出异步读请求

   - 事件分离器等待操作系统完成读取

   - 在分离器等待过程中,操作系统利用并行的内核线程执行实际的读操作,并将结果数据存入用户自定义缓冲区,最后通知事件分离器读操作完成

   - 事件分离器监听到 读完成事件 后,激活 读完成事件的处理器

   - 读完成事件处理器 处理用户自定义缓冲区中的数据给应用程序使用

同步和异步的区别就在于 读 操作由谁完成:同步的Reactor是指程序发出读请求后,由分离器监听到可以进行读操作时(需要获得读操作条件)通知事件处理器进行读操作,异步的Proactor是指程序发出读请求后,操作系统立刻异步地进行读操作了,读完之后在通知分离器,分离器激活处理器直接取用已读到的数据。

二:同步阻塞IO(BIO)

我们熟知的Socket编程就是BIO,一个socket连接一个处理线程(这个线程负责这个Socket连接的一系列数据传输操作)。阻塞的原因在于:操作系统允许的线程数量是有限的,多个socket申请与服务端建立连接时,服务端不能提供相应数量的处理线程,没有分配到处理线程的连接就会阻塞等待或被拒绝。

三:同步非阻塞IO(NIO)

New IO是对BIO的改进,基于Reactor模型。我们知道,一个socket连接只有在特点时候才会发生数据传输IO操作,大部分时间这个“数据通道”是空闲的,但还是占用着线程。NIO作出的改进就是“一个请求一个线程”,在连接到服务端的众多socket中,只有需要进行IO操作的才能获取服务端的处理线程进行IO。这样就不会因为线程不够用而限制了socket的接入。客户端的socket连接到服务端时,就会在事件分离器注册一个 IO请求事件 和 IO 事件处理器。在该连接发生IO请求时,IO事件处理器就会启动一个线程来处理这个IO请求,不断尝试获取系统的IO的使用权限,一旦成功(即:可以进行IO),则通知这个socket进行IO数据传输。

NIO还提供了两个新概念:Buffer和Channel

Buffer:
–        是一块连续的内存块。
–        是 NIO 数据读或写的中转地。
Channel:
–        数据的源头或者数据的目的地
–        用于向 buffer 提供数据或者读取 buffer 数据 ,buffer 对象的唯一接口。
–         异步 I/O 支持      Buffer作为IO流中数据的缓冲区,而Channel则作为socket的IO流与Buffer的传输通道。客户端socket与服务端socket之间的IO传输不直接把数据交给CPU使用,而是先经过Channel通道把数据保存到Buffer,然后CPU直接从Buffer区读写数据,一次可以读写更多的内容。      使用Buffer提高IO效率的原因(这里与IO流里面的BufferedXXStream、BufferedReader、BufferedWriter提高性能的原理一样):IO的耗时主要花在数据传输的路上,普通的IO是一个字节一个字节地传输,而采用了Buffer的话,通过Buffer封装的方法(比如一次读一行,则以行为单位传输而不是一个字节一次进行传输)就可以实现“一大块字节”的传输。比如:IO就是送快递,普通IO是一个快递跑一趟,采用了Buffer的IO就是一车跑一趟。很明显,buffer效率更高,花在传输路上的时间大大缩短。

四:异步阻塞IO(AIO)

NIO是同步的IO,是因为程序需要IO操作时,必须获得了IO权限后亲自进行IO操作才能进行下一步操作。AIO是对NIO的改进(所以AIO又叫NIO.2),它是基于Proactor模型的。每个socket连接在事件分离器注册 IO完成事件 和 IO完成事件处理器。程序需要进行IO时,向分离器发出IO请求并把所用的Buffer区域告知分离器,分离器通知操作系统进行IO操作,操作系统自己不断尝试获取IO权限并进行IO操作(数据保存在Buffer区),操作完成后通知分离器;分离器检测到 IO完成事件,则激活 IO完成事件处理器,处理器会通知程序说“IO已完成”,程序知道后就直接从Buffer区进行数据的读写。

也就是说:AIO是发出IO请求后,由操作系统自己去获取IO权限并进行IO操作;NIO则是发出IO请求后,由线程不断尝试获取IO权限,获取到后通知应用程序自己进行IO操作。

https://www.cnblogs.com/ygj0930/p/6543960.html

BIO、NIO和AIO的区别简述相关推荐

  1. nio和bio的原理_Java的BIO,NIO和AIO的区别于演进

    前言 Java里面的IO模型种类较多,主要包括BIO,NIO和AIO,每个IO模型都有不一样的地方,那么这些IO模型是如何演变呢,底层的原理又是怎样的呢? 本文我们就来聊聊. BIO BIO全称是Bl ...

  2. BIO,NIO和AIO的区别

    BIO也就是同步阻塞的I/O,由JAVA程序自己处理I/O流操作;一个线程启用I/O请求后,必须等I/O处理完毕才能进行下一步; NIO是同步非阻塞的I/O,还是由JAVA处理应用操作,不过单独开启一 ...

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

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

  4. BIO与NIO、AIO的区别

    BIO与NIO.AIO的区别(这个容易理解) IO的方式通常分为几种,同步阻塞的BIO.同步非阻塞的NIO.异步非阻塞的AIO. 一.BIO 在JDK1.4出来之前,我们建立网络连接的时候采用BIO模 ...

  5. BIO、NIO、AIO的区别

    很多文章在谈论到BIO.NIO.AIO的时候仅仅是抛出一堆定义,以及一些生动的例子.看似很好理解.但是并没有将最基础的本质原理显现出来,如果没有从IO的原理出发的话是很难理解这三者之间的区别的.本文你 ...

  6. java nio 李林峰_浅谈Java中BIO、NIO和AIO的区别和应用场景

    最近一直在准备面试,为了使自己的Java水平更上一个档次,拜读了李林峰老师的<Netty权威指南>,了解了Java关于IO的发展和最新的技术,真是受益匪浅,现在把我总结的关于BIO.NIO ...

  7. 面试被问BIO、NIO、AIO的区别,怎么破?

    来源:juejin.cn/post/6844903985158045703 很多文章在谈论到BIO.NIO.AIO的时候仅仅是抛出一堆定义,以及一些生动的例子.看似很好理解.但是并没有将最基础的本质原 ...

  8. BIO与NIO、AIO的区别(这个容易理解)

    IO的方式通常分为几种,同步阻塞的BIO.同步非阻塞的NIO.异步非阻塞的AIO. 一.BIO 在 JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSoc ...

  9. 以Java的视角来聊聊BIO、NIO与AIO的区别

    说一说I/O 首先来说一下什么是I/O? 在计算机系统中I/O就是输入(Input)和输出(Output)的意思,针对不同的操作对象,可以划分为磁盘I/O模型,网络I/O模型,内存映射I/O, Dir ...

  10. JAVA BIO与NIO、AIO的区别

    引用:https://blog.csdn.net/ty497122758/article/details/78979302 IO的方式通常分为几种,同步阻塞的BIO.同步非阻塞的NIO.异步非阻塞的A ...

最新文章

  1. NAPTR和SRV记录
  2. 当我们不为了拿奖,而在做事情的时候
  3. Java输入输出入门 A+B
  4. Django中遇到的错误集合(持续更新)
  5. 处理增删改_这10个批量处理的PPT技巧,让你的效率提升100倍!
  6. 异步IO\数据库\队列\缓存
  7. geotif 添加坐标_python – 如何获取geotif中单元格的坐标?
  8. java 转换url中文参数
  9. [转载] python基于内置的SimpleHTTPServer来搭建简易的FTP服务器实现局域网内文件共享
  10. 剑指offer——面试题17:合并两个排序的链表
  11. 2022新版Git教程 从入门到实战(二)Git本地仓库的使用
  12. 阅读《Android 从入门到精通》(10)——单项选择
  13. elementUI 相同元素合并行
  14. 池化层(pooling layer) 感受野(Receptive Field) 神经网络的基本组成
  15. SDL2音视频渲染入门
  16. 实现电容触摸按键控制LED(基于STM32F103ZET6)
  17. bugku 贝斯家族 (base91参照表)
  18. js时间搓转时间,日期横杠转斜杠,时间转时间搓,年月日补个零,星期几,获取当前时间
  19. 对自己未来职业的规划
  20. 1117. 单词接龙

热门文章

  1. iPhone应用程序的启动过程
  2. 在 lamp(centos)下配置二级 域名 、虚拟主机
  3. 领域驱动设计的个人理解
  4. 拓端tecdat|R语言在地图上绘制散点饼图可视化
  5. 拓端tecdat|R语言机器学习实战之多项式回归
  6. 拓端tecdat|R语言用多重插补法估算相对风险
  7. linux脚本批量解压,Shell中使用tar命令批量解压缩的实现方法
  8. manjaro Linux下使用腾讯会议
  9. js基础知识汇总09
  10. java sdk设计原则_java 设计模式遵循的六大原则