Java面试题总结(BIO,NIO,AIO )

BIO:blocking I/O 同步阻塞IO模式,数据的读取写入必须阻塞在一个线程内等待其完成

问题:由于是同步阻塞的,因此新需求来时只能通过新建线程的方式来接受请求,导致线程堆栈溢出等问题

伪异步IO:可以通过使用线程池来优化,不过在并发量增加时会导致线程量急剧膨胀,

NIO: non-blocking IO 同步非阻塞IO,IO面向流,而NIO面向缓冲区,任何时候访问NIO的数据,都是面向缓冲区的,最常用的缓冲区是ByteBuffer

channel(通道):NIO通过通道进行读写,通道是双向的,可读也可写

selector(选择器)NIO有通道和选择器,IO没有,选择器用于使用单线程处理多个通道

一个单线程中Selector维护3个Channel的示意图

缺点:编程复杂,底层由epoll实现,该实现存在空轮询bug,会导致cpu飙升100%,项目庞大后,维护成本很高,Netty的出现改善了JDK原生NIO所存在的一些问题

AIO 即NIO2,异步非阻塞IO模型,基于事件和回调机制实现

Reactor模型

Reactor模型包含两个组件:

1. Reactor:负责查询、响应IO事件,当检测到IO事件时,分发给Handlers处理。

2. Handler:与IO事件绑定,负责IO事件的处理。

它包含⼏种实现⽅式:

单线程Reactor

这个模式reactor和handler在⼀个线程中,如果某个handler阻塞的话,会导致其他所有的handler⽆法执⾏,⽽且⽆法充分利⽤多核的性能。

单Reactor多线程

由于decode、compute、encode的操作并⾮IO的操作,多线程Reactor的思路就是充分发挥多核的特性,同时把⾮IO的操作剥离开。

但是,单个Reactor承担了所有的事件监听、响应⼯作,如果连接过多,还是可能存在性能问题。

多Reactor多线程

为了解决单Reactor的性能问题,就产⽣了多Reactor的模式。其中mainReactor建⽴连接,多个subReactor则负责数据读写。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值