IO的基本常识

1.同步

用户进程触发IO操作并等待或者轮询的去查看IO操作是否完成

2.异步

用户触发IO操作以后,可以干别的事,IO操作完成以后再通知当前线程继续处理

3.阻塞

当一个线程调用 read() 或 write()时,该线程被阻塞,直到有一些数据被读取或写入,该线程在此期间不能执行其他任务

4.非阻塞

当线程从某通道进行读写数据时,若没有数据可用时,该线程可以进行其他任务。线程通常将非阻塞 IO 的空闲时间用于在其他通道上执行 IO 操作,所以单独的线程可以管理多个输入和输出通道。

IO事件驱动模式

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

Reactor模型:

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

Proactor模型:

 - 应用程序在事件分离器注册 读完成事件 和 读完成事件处理器,并向操作系统发出异步读请求 - 事件分离器等待操作系统完成读取 - 在分离器等待过程中,操作系统利用并行的内核线程执行实际的读操作,并将结果数据存入用户自定义缓冲区,最后通知事件分离器读操作完成 - 事件分离器监听到 读完成事件 后,激活 读完成事件的处理器 - 读完成事件处理器 处理用户自定义缓冲区中的数据给应用程序使用

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

同步阻塞IO(BIO)

我们熟知的Socket就是BIO,每一个socket套接字需要使用一个线程来处理。建立连接、进行读写操作的时候都可能阻塞。在服务器端如果要支持并发的连接时,需要更多的线程。连接不做任何事情的时候会造成不必要的线程开销,可通过线程池来改善。

同步非阻塞IO(NIO)

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

NIO主要有三大核心部分:Channel(通道),Buffer(缓冲区), Selector。传统IO基于字节流和字符流进行操作,而NIO基于Channel和Buffer(缓冲区)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。Selector(选择区)用于监听多个通道的事件(比如:连接打开,数据到达)。因此,单个线程可以监听多个数据通道。

NIO基于Channel和Buffer(缓冲区)进行操作

Selector(选择区)用于监听多个通道的事件

异步阻塞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操作。

总结

BIO,NIO,AIO可以简述如下:

BIO是同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。

NIO是同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。

AIO是异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理。

BIO、NIO、AIO适用场景分析:

BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高

NIO方式适用于连接数目多且连接比较短的架构,可充分利用服务器资源

AIO方式使用于连接数目多且连接比较长的架构,充分调用OS参与并发操作

转载于:https://www.cnblogs.com/binghuaZhang/p/11042835.html

【转】深入分析JAVA IO(BIO、NIO、AIO)相关推荐

  1. JAVA IO : BIO NIO AIO

    JAVA IO : BIO NIO AIO 同步异步.阻塞非阻塞概念 同步与异步 阻塞与非阻塞 IO VS NIO VS AIO 面向流与面向缓冲 阻塞与非阻塞IO BIO.NIO.AIO的JAVA实 ...

  2. Java IO(BIO, NIO, AIO) 总结

    文章转载自:JavaGuide 目录 BIO,NIO,AIO 总结 同步与异步 阻塞和非阻塞 1. BIO (Blocking I/O) 1.1 传统 BIO 1.2 伪异步 IO 1.3 代码示例 ...

  3. java io bio nio aio 详解

    BIO.NIO.AIO的区别: BIO就是基于Thread per Request的传统server/client实现模式, NIO通常采用Reactor模式, AIO通常采用Proactor模式, ...

  4. Java之IO,BIO,NIO,AIO知多少?

    开心一笑 [一女人:"我真不放心丈夫,他准备到湖中心水最深的地方把猫扔掉."邻居:"那有什么不放心的?"女人:"猫已回家一钟头了!"] 提出 ...

  5. Java IO BIO NIO

    Java IO BIO NIO 一.Java I/O概述 1.1 什么是流 1.2 流的分类 1.3 字符流 1.3.1 Reader 1.3.2 Writer 1.4 字节流 1.4.1 Input ...

  6. IO之 java中BIO NIO AIO原理、区别以及应用

    在本篇文章中,我们主要介绍一下java中的BIO NIO AIO,重点是NIO 先说一下同步.异步.阻塞和非阻塞. 简单来讲,同步和异步是针对内核和应用程序之间的交互而言的:阻塞和非阻塞其实是针对进程 ...

  7. IO: BIO ? NIO ? AIO?

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

  8. Java之IO,BIO,NIO,AIO

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

  9. java io bio nio面试题_漫画:一文学会面试中常问的 IO 问题!

    原标题:漫画:一文学会面试中常问的 IO 问题! 作者 | 漫话编程 责编 | 伍杏玲 本文经授权转载自漫话编程(ID:mhcoding) 周末午后,在家里面进行电话面试,我问了面试者几个关于IO的问 ...

  10. JAVA 中BIO,NIO,AIO的理解

    [转自]http://qindongliang.iteye.com/blog/2018539 在高性能的IO体系设计中,有几个名词概念常常会使我们感到迷惑不解.具体如下: 序号 问题 1 什么是同步? ...

最新文章

  1. Linux下使用dmidecode查看服务器的详细的硬件配置
  2. oracle中substr() instr() 用法
  3. 【完结】12篇文章带你逛遍主流分割网络
  4. QT mingw 编译Crypto++ 5.6.4
  5. tensorflow随笔-新的计算图
  6. JAVA——一次性读取或者写入文本文件所有内容
  7. python中sort和sorted区别_Python中的 sort 和 sorted的用法与区别
  8. MVC 特性使用总结
  9. python基础之字符串定义常见操作、列表定义进阶操作
  10. 得益于数据中心芯片业务提升,AMD公司财务表现令投资者欣喜
  11. 系统学习机器学习之总结(三)--多标签分类问题
  12. 复制class文件到as中出现非法字符,须要class,interface货enum
  13. 网络营销之百度营销技巧(一) 百度知道推广日常手册
  14. 锂离子电池性能测试软件,锂离子电池有什么性能测试设备?
  15. 运放的增益带宽积、单位增益带宽
  16. 客户关系管理系统(Customer Relationship Management)
  17. 【教程】使用腾讯云轻量应用服务器搭建 Guacamole 远程桌面代理服务器,让境外小鸡远程不再卡顿!!
  18. Qt5.12+VS2017环境下编译QtAV视频库
  19. Latex 希腊字母大写
  20. oracle 11g失败,求助,oracle 11g 启动失败,求大神帮忙看看,谢谢

热门文章

  1. Solving environment: failed with initial frozen solve.Retrying with flexible solve
  2. 0基础学Python,要报班吗?
  3. CVPR系列(二)—— 双图层实例分割,大幅提升遮挡处理性能
  4. CVPR2020 | 跨模态行人重识别:共享与特异特征变换算法cm-SSFT
  5. OpenCV的dnn模块调用TesorFlow训练的MoblieNet模型
  6. windows下安装TensorFlow(CPU版)
  7. 村庄规划中核心技术(村土地利用规划方面)
  8. python 柱形图_Python 写入 Excel III 详解图形生成-柱形图
  9. sentinel 端口_Spring Cloud Alibba教程:Sentinel的使用
  10. 3d饼图 vue_怎么实现一个3d翻书效果