BIO,NIO,AIO和异步阻塞

本文详细解析了同步、异步、阻塞和非阻塞的概念,以及它们之间的区别。介绍了BIO同步阻塞模型,NIO同步非阻塞模型,重点阐述了AIO(异步非阻塞)的工作原理,包括基于Proactor模型的读写操作流程。此外,还探讨了AIO如何优化数据复制阶段的阻塞问题,以提高系统效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.同步、异步、阻塞、非阻塞

1.同步:调用者发送一个请求,调用者需要等待返回结果才可以发送下一个请求。就是线程自己去获取结果(一个线程)
2.异步:调用者不需要等待返回结果即可发送请求。就是线程自己不去获取结果,而是由其它线程送结果(至少两个线程)
3.阻塞:调用者在等待返回结果之前,不能做其他事情,处于线程挂起状态
4.非阻塞:调用者在等待返回结果之前,可以去干其他事情

区别:同步和异步仅仅是关注的消息如何通知的机制,一般通过状态、通知和回调来通知调用者。而阻塞与非阻塞关注的是等待消息通知时的状态

二.BIO

BIO同步阻塞:客户揣发送请求给服务揣,服务端没有响应前,客户端会一直等待服务端的响应,客户端也不能做其他任何事。
在这里插入图片描述
服务端会为每个客户端创建一个线程,用于管理该客户端,该线程会一直等客户端发送请求。
在这里插入图片描述

三.NIO

NIO同步非阻塞:客户端发送请求给服务端,服务端没有响应前,客户端会一直等待响应,但是客户端可以处理其他的任务。基于反应器模式,有个回调函数注册信息,当有io操作会触发,进行阻塞的io操作。
在这里插入图片描述
1.客户端与selector建立连接
2.selector会为该客户端创建一个Channel进行数据读写
3.selector多路复用器会不断轮询注册的Channel,如果某个Channel发生了读写事件,selector会通过SelectionKey将Channel获取出来
4.selector会创建一个工作线程处理事件,处理完销毁
在这里插入图片描述

优化:
1.用Cached线程池给出一个工作线程处理事件
2.使用buffer,工作线程将channel的数据写到buffer去,然后工作线程从buffer中去读取。工作线程将数据写入到buffer中,让channel去buffer读。
在这里插入图片描述
客户端从Channel中读数据是同步的

四.异步阻塞

异步阻塞(没这产品):客户揣发送请求给服务端,服务端处理任务需要很久,客户端不会等待服务器响应,客户端可以做其他的任务,如果服务器处理完毕把结果响应给客户端,客户端得到回调通知后处理服务端的响应,回调期间不能执行其他任务。类似于ajax异步请求。
在这里插入图片描述

五.AIO

AIO异步非阻塞:AIO 用来解决数据复制阶段的阻塞问题,意味着,在进行读写操作时,线程不必等待结果,而是将来由操作系统来通过回调方式由另外的线程来获得结果
在这里插入图片描述
AIO基于Proactor模型:

1.每个链接发送过来的请求,都会绑定一个buffer,然后通知操作系统去异步完成读,此时你的程序可以去干别的事情,等待操作系统完成数据读取操作后,会回调你的接口,给你的操作系统异步读完的数据。
2.然后你对这个数据处理一下,接着将结果往回写。
3.工作线程写的时候,你给操作系统一个有数据的buffer,让操作系统自己获取数据去完成写操作。写完后通知你,你的数据写回客户端去了。
4.工作线程读数据的时候,你提供一个空的buffer给操作系统,然后你可以去干别的事情。操作系统将读好的数据放入buffer中后,回调你的接口,将buffer交给你。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

愛沢かりん

感谢您对我的支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值