AIO、NIO、BIO
AIO:异步非阻塞
NIO:同步非阻塞
BIO:同步阻塞
(1)同步 指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪
(2)异步 指用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到IO完成的通知
(3)阻塞 指当试图对该文件描述符进行读写时, 如果当时没有东西可读,或者暂时不可写, 程序就进入等待状态, 直到有东西可读或者可写为止
(4)非阻塞 指如果没有东西可读, 或者不可写, 读写函数马上返回, 而不会等待
同步/异步新理解:
是否持续等待解决并查看结果状态的为 同步/异步 关系
阻塞/非阻塞新理解:
是否短时间内可以处理完客户端事件,并快速切换到下一个客户端进行事件处理(处理速度足够快、客户端事件合理的情况下,计算机里没有绝对的非阻塞)
长时间占用服务端,不能跳转到下一个客户端的,就是阻塞
BIO、NIO、AIO适用场景分析:
BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。
NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。
AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持
Reactor模式和Proactor模式
首先来看看Reactor模式,Reactor模式应用于同步I/O的场景。我们分别以读操作和写操作为例来看看Reactor中的具体步骤:
读取操作:
1. 应用程序注册读就绪事件和相关联的事件处理器
2. 事件分离器等待事件的发生
3. 当发生读就绪事件的时候,事件分离器调用第一步注册的事件处理器
4. 事件处理器首先执行实际的读取操作,然后根据读取到的内容进行进一步的处理
写入操作类似于读取操作,只不过第一步注册的是写就绪事件。
Reactor模型:
当前NIO使用的模型,TCP建立链接后,需要使用TCP/IP的select()函数进行一个或多个链接状态的判断(通过select轮询每一个链接的状态)
Reactor中,有一个线程一直不停的轮询着链接状态,并对链接状态进行处理,是有一个线程来做这件事(这也就是轮询,导致资源的一定浪费)
TCP链接状态有四种:
(1)等待链接(accept)
(2)可读()
(3)可写()
这里进行链接轮询的时候,Reactor模型就会同步等待select()函数轮询链接状态,但,如果没有数据,立即返回
Proactor模式中读取操作和写入操作的过程
读取操作:
1. 应用程序初始化一个异步读取操作,然后注册相应的事件处理器,此时事件处理器不关注读取就绪事件,而是关注读取完成事件,这是区别于Reactor的关键。
2. 事件分离器等待读取操作完成事件
3. 在事件分离器等待读取操作完成的时候,操作系统调用内核线程完成读取操作(异步IO都是操作系统负责将数据读写到应用传递进来的缓冲区供应用程序操作,操作系统扮演了重要角色),并将读取的内容放入用户传递过来的缓存区中。这也是区别于Reactor的一点,Proactor中,应用程序需要传递缓存区。
4. 事件分离器捕获到读取完成事件后,激活应用程序注册的事件处理器,事件处理器直接从缓存区读取数据,而不需要进行实际的读取操作。
总结:
Reactor和Proactor模式的主要区别就是真正的读取和写入操作是有谁来完成的,Reactor中需要应用程序自己读取或者写入数据,而Proactor模式中,应用程序不需要进行实际的读写过程,它只需要从缓存区读取或者写入即可,操作系统会读取缓存区或者写入缓存区到真正的IO设备.
同步和异步是相对于应用和内核的交互方式而言的,同步 需要主动去询问,而异步的时候内核在IO事件发生的时候通知应用程序,而阻塞和非阻塞仅仅是系统在调用系统调用的时候函数的实现方式而已。
可以参考其它文档:http://ifeve.com/netty-reactor-4/
转载于:https://www.cnblogs.com/rainy-shurun/p/5694719.html
AIO、NIO、BIO相关推荐
- 内核aio_Java面试题BIO、NIO、AIO有什么区别?
点击上方"千锋Java学院",选择"置顶公众号" 每天一道面试模拟真题及解析 课前导读 ●回复"每日一练"获取以前的题目,持续更新! ●我希 ...
- 面试被问BIO、NIO、AIO的区别,怎么破?
来源:juejin.cn/post/6844903985158045703 很多文章在谈论到BIO.NIO.AIO的时候仅仅是抛出一堆定义,以及一些生动的例子.看似很好理解.但是并没有将最基础的本质原 ...
- 阻塞、非阻塞、多路复用、同步、异步、BIO、NIO、AIO 一锅端
承接上文的操作系统,关于IO会涉及到阻塞.非阻塞.多路复用.同步.异步.BIO.NIO.AIO等几个知识点.知识点虽然不难但平常经常容易搞混,特此Mark下,与君共勉. 1 阻塞跟非阻塞 1.1 阻塞 ...
- 常见的 IO 模型有哪些?Java 中 BIO、NIO、AIO 的区别?
IO 模型这块确实挺难理解的,需要太多计算机底层知识.写这篇文章用了挺久,就非常希望能把我所知道的讲出来吧!希望朋友们能有收货!为了写这篇文章,还翻看了一下<UNIX 网络编程>这本书,太 ...
- bio linux 创建_不断升级,Java之BIO、NIO、AIO的演变
一.前言 一句话概括BIO NIO AIO: 第一阶段,服务端采用同步阻塞的BIO: 第二阶段,服务端采用同步阻塞的线程池的BIO: 第三阶段,JDK4之后服务端采用同步非阻塞的NIO: 第四阶段,J ...
- java基础IO BIO、NIO、AIO的区别
Java IO(Java数据流)主要就是Java用来读取和输出数据流.它有对应的一系列API.主要是java.io.*,和java.nio.*. Java中IO主要有两类 |-->字节流 ...
- 谈谈java的bio、nio、aio模型
目录 socket IO(BIO)和NIO的区别 同步和异步 bio:同步阻塞式IO NIO:同步非阻塞IO(工作中用的很少) Buffer使用 NIO代码 AIO socket Socket又称&q ...
- Java BIO、NIO、AIO 学习
2019独角兽企业重金招聘Python工程师标准>>> 先来个例子理解一下概念,以银行取款为例: 同步 : 自己亲自出马持银行卡到银行取钱(使用同步IO时,Java自己处理IO读写) ...
- bio nio aio区别_8分钟深入浅出搞懂BIO、NIO、AIO
在高性能的IO体系设计中,BIO.NIO.AIO的概念,常常会让我们感到困惑不解.在Java面试中,我们也经常会被问到这个问题.譬如: BIO.NIO.AIO 的概念 同步/异步.阻塞/非阻塞的区别 ...
- Java BIO、NIO、AIO的区别
一.基础概念 同步:是指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪. 异步:是指用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到IO完成的通知(异步的特 ...
最新文章
- 趣味编程:从字符串中提取信息(参考答案 - 下)
- sqlserver查看跟某个表相关的所有存储过程
- C 语言 int 型乘法溢出问题
- CPU上下文切换(系统调用、进程上下文、线程上下文、中断上下文)
- 计算机控制与网络,网络与通信技术在计算机控制的作用
- python gmm em算法 2维数据_AI大语音(六)——混合高斯模型(GMM)(深度解析)...
- Windows解除网速限制,Windows性能提升,性能优化
- list集合根据jsonobjectvalue排序_Java之List集合两种排序的性能比较
- python 漏洞扫描器_自动扫描全网漏洞的扫描器
- html图片随圆点下标轮播,基于JavaScript实现轮播图代码
- 怎么把手机字体改成繁体_如何把手机字体变成繁体 繁体字转换器
- CSS3之box-shadow(阴影)和border属性
- 【债券量化策略研究系列】债券风险测度指标:久期(Duration)与凸度(Convexity)
- Django笔记十一之外键查询优化select_related和prefetch_related
- Java层Binder框架通信原理(转自Cloud Chou's Tech Blog)
- h5打开麦克风权限录音_和平精英麦克风权限怎么开 麦克风怎么是设置
- [抄袭]年薪五万程序员的生活及他的理财梦
- 杨亮词汇5500-课程导学
- ps更换证件照底色(视频版)
- 8个LED灯分别以不同频率闪烁