当前位置:网站首页>Interviewer: Tell me the difference between NIO and BIO
Interviewer: Tell me the difference between NIO and BIO
2022-08-04 13:02:00 【51CTO】

介绍
- BIO,面向流,只能读或者只能写,阻塞IO
- NIO,面向缓冲区,可以同时进行读写,非阻塞IO

整个BIO的继承关系如上图,每种流只能写或者读,整个BIO流的设计用了装饰者模式,如果你不清楚的话,可以看《面试官:说一下装饰者模式的作用,以及哪些地方用到了装饰者模式吧》,本文不再介绍

NIO涉及到的api主要为Buffer Channel Selector.Buffer可以用来存储和读取数据,Channel是网络通道,Selector主要用来监听事件的发生.后续的内容会简单介绍一下三者是如何协同工作的.
用例子类别一下
BIO:排队打饭
NIO:点餐等待被叫
api的使用我就不演示了,分析一下他们背后的开发模式
开发模式
类别 | 开发模式 |
BIO | Thread-Per-Connection |
NIO | Reactor |
AIO | Proactor |
Thread-Per-Connection

Thread-Per-Connection这种开发模式应该很多人都比较清楚,见名知意,一个请求创建一个线程,支持不了高并发,当然你可以用线程池避免线程的重复创建
Reactor
Reactor的核心流程为
- 注册感兴趣的事件
- 扫描是否有感兴趣的事件发生
- 事件发生后作出相应的处理
Reactor模式的演进过程如下
单Reactor单线程

执行流程
- Reactor对象通过select监控客户端请求事件,收到事件后通过dispatch分发
- 如果是建立连接事件,则交给Acceptor通过accept处理连接请求,然后创建一个handler对象处理连接完成后的的后续业务处理
- 如果是读写事件,则调用对应的handler来处理请求.handler会完成 read->业务处理->send整个完整的业务流程
优点
模型简单,整个过程都在一个线程中完成
缺点
- 性能问题,只有一个线程,无法发挥多核CPU的性能.并且当handler在处理请求时,无法处理连接请求,容易导致性能瓶颈
- 可靠性问题,线程意外终止或者死循环,系统不能接收和处理外部消息,造成节点故障
单Reactor多线程

执行流程
- Reactor对象通过select监控客户端请求事件,收到事件后通过dispatch分发
- 如果是建立连接事件,则交给Acceptor通过accept处理连接请求,然后创建一个handler对象处理连接完成后的的后续业务处理
- 如果是读写事件,则调用对应的handler来处理请求
- handler只负责读取和响应事件,不做具体的业务处理,读取到数据后,会分发给Worker线程池中的某个线程处理业务,处理完毕后将结果返回给handler
- handler收到响应后返回给client
优点
充分利用多核cpu的处理能力
缺点
Reactor单线程运行,处理所有事件的监听和响应,在高并发场景容易出现性能瓶颈
主从Reactor多线程

Reactor在高并发下容易出现瓶颈,所以将Reactor分为2部分,MainReactor只处理连接事件,
SubReactor只处理读写事件
如果是连接事件MainReactor直接交给Acceptor来处理,如果是读写事件MainReactor交给SubReactor来处理
当我们在写Netty程序时,会创建2个EventLoopGroup,一个是bossGroup,一个是workerGroup.bossGroup 就用来处理连接请求的,而 workerGroup 是用来处理读写请求的
EventLoop对应Reactor模式中的Reactor,EventLoopGroup就是EventLoop组成的集合
MainReactor有一个,在单线程中运行.SubReactor有多个,在多个线程中运行
推荐你看一下Doug Lea大佬对Reactor模式解释的文章(你用的并发包就是他写的),保证你能有一个更深的印象
http://gee.cs.oswego.edu/dl/cpjslides/nio.pdf
现在我们常用的NIO框架是Netty,在Netty中切换这三种模式就非常方便了,代码如下
当然Netty做了一定的改进.即单Reactor多线程和主从Reactor多线程中Reactor线程可以是多个
参考博客
边栏推荐
- “蔚来杯“2022牛客暑期多校训练营4 N
- COMSOL空气反应 模型框架
- 内存定位利器-ASAN使用小结
- LeetCode 1403 非递增顺序的最小子序列[贪心] HERODING的LeetCode之路
- odoo13笔记点
- 【UML】信息系统分析与设计知识点总结
- “蔚来杯“2022牛客暑期多校训练营2 G、J、K
- 新消费、出海、大健康......电子烟寻找“避风港”
- 【Game Of AutoTest】1、再度启程,重识游戏自动化测试
- "Lonely Walking on the Moon" is a powerful medicine, it can't cure the internal friction of happy twist
猜你喜欢

Why is Luo Zhenyu's A-share dream so difficult to fulfill?

A comprehensive understanding of MOS tubes, an article is enough

Small program on how to play in the construction of e-government service platform value

倒计时 3 天|一起看云原生 Meetup 的六大议题

Arduino框架下I2S控制ADC采样以及PWM输出示例解析

1314元的七夕礼盒,收割了多少直男?

【UML】信息系统分析与设计知识点总结

RobotFramework二次开发(一)

做项目管理有且有必要了解并学习的重要知识--PMP项目管理

MySQL-数据类型
随机推荐
他是“中台”之父,凭一个概念为阿里狂赚百亿
Cool and efficient data visualization big screen, it's really not that difficult to do!丨Geek Planet
【自动微分实现】反向OO实现自动微分(Pytroch核心机制)
面试官:连 INSERT INTO SET 都不知道怎么用,你这3年都干些什么了?
座舱人机交互「暗潮汹涌」,语音「下」,多模态「上」
密码设置十准则
Matlab记录
“蔚来杯“2022牛客暑期多校训练营5 B、C、F、G、H、K
【黑马早报】尚乘数科上市13天,市值超阿里;北大终止陈春花聘用合同;新东方花近200亿退学费和遣散费;张小泉75%产品贴牌代工...
[UML] Summary of Information System Analysis and Design Knowledge Points
d不要直接用转串
oracle sql中根据条件判断是否插入数据
js正则表达式提取内容
一分钟认识 IndexedDB 数据库,太强大了!
RobotFramework二次开发(一)
Chinese valentine's day of young people crazy to make money, earn 140000 a week
"Lonely Walking on the Moon" is a powerful medicine, it can't cure the internal friction of happy twist
为什么密码云服务平台是云时代的必然之选?
论文翻译:2022_Time-Frequency Attention for Monaural Speech Enhancement
到底什么是真正的HTAP?