BIO NIO AIO核心原理分析

1.BIO问题:传统的socket通信带肋的问题:

1.会有两次阻塞,第一次建立连接的时候回发生阻塞

2. 发送消息的时候发生阻塞

如果这样的话,那么只能一个主程序处理一个请求,不能并行处理第二个程序

程序升级做法:将处理程序开线程池去处理,那么就可以并行处理多个请求

同时有带来了新的问题:比如:需要开很多线程,10000个请求需要开10000个线程,

cpu使用率太高,压力太大出现C10K问题

还有:如果只连接不对数据进行读写操作,浪费线程资源

2.NIO诞生

基于上述的两个问题,诞生了NIO,思想:同步非阻塞,一个线程可以处理多个请求,客户端发送的请求多会注册到多路复用器select上,jdk1.4引入多路复用器,将两个阻塞的地方设置为非阻塞,这样如果没有请求进来就会一直死循环空转,如果有请求进来,则把该请求放入list中,遍历list,判断是否有消息发送进来,如果有则处理,没有的话不处理,最后移除该连接,

带来的问题是:如果连接数太多会进行大量无效的遍历,10w个连接只有1w非发送数据,那么9w个在空转,效率低

3.NIO的问题诞生了netty

由于空转的问题,那么出现了基于时间的驱动方式来处理,也就是一个请求包括:连接,读数据,写数据,断开等,基于这些时间,如果没有请求进来那么会阻塞,如果有请求进来则会放行,判断事件,根据事件类型注册到channel,channel来处理事件,这个过程也是非阻塞的。这样就完美的解决了同步阻塞,空转等问题。

4.linux底层通过3个函数来进行这些核心的操作

1.epoll_create:创建epoll实例

2.epoll_ctl:通过文件描述符对事件进行操作

3.epoll_wait:等待文件描述符上的事件

4.AIO(NIO2.0):异步非阻塞

AIO使用场景:连接数多且操作比较多

连接和读取数据都是异步的,会开启额外的线程来处理

5.为什么netty不适用aio而是使用nio?

aio的api函数不成熟,非常难使用,netty是异步非阻塞框架,netty在nio上做了很多异步封装

,说到底还是aio的操作复杂。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值