当前位置:网站首页>面试官:说一下NIO和BIO的区别
面试官:说一下NIO和BIO的区别
2022-08-04 12:54: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线程可以是多个
参考博客
边栏推荐
猜你喜欢
随机推荐
接到“网站动态换主题”的需求,我是如何踩坑的
项目里的各种配置,你都了解吗?
《独行月球》猛药,治不了开心麻花内耗
从零开始配置 vim(6)——缩写
内存定位利器-ASAN使用小结
21天学习挑战赛--第二天打卡(setSystemUiVisibility、导航栏、状态栏)
HDU1580 输出先手能取的方案数
03 多线程与高并发 - ReentrantLock 源码解析
Hit the interview!The latest interview booklet of Ali Jin, nine silver and ten is stable!
Cool and efficient data visualization big screen, it's really not that difficult to do!丨Geek Planet
LeetCode_424_替换后的最长重复字符
Motion Regulations (18) - and check the basic questions - gang
“蔚来杯“2022牛客暑期多校训练营5 B、C、F、G、H、K
Programmer Qixi Gift - How to quickly build an exclusive chat room for your girlfriend in 30 minutes
Focus!2022 interview must brush 461 interview questions summary + interview + resume template
"Lonely Walking on the Moon" is a powerful medicine, it can't cure the internal friction of happy twist
ReentrantLock 原理
LeetCode_643_子数组的最大平均数Ⅰ
Chinese valentine's day of young people crazy to make money, earn 140000 a week
LeetCode Daily Question (858. Mirror Reflection)









