bio,nio,aio的理解

先上几个图

BIO:线程发起IO请求,不管内核是否准备好IO操作,从发起请求起,线程一直阻塞,直到操作完成。如下图:

 

Paste_Image.png

Paste_Image.png

 

NIO(reactor模型):线程发起IO请求,立即返回;内核在做好IO操作的准备之后,通过调用注册的回调函数通知线程做IO操作,线程开始阻塞,直到操作完成。如下图:

 

 

Paste_Image.png

AIO(proactor模型):线程发起IO请求,立即返回;内存做好IO操作的准备之后,做IO操作,直到操作完成或者失败,通过调用注册的回调函数通知线程做IO操作完成或者失败。如下图:

NIO å®ç°åç

 

然后很多人说:

io一般分为:同步阻塞,同步非阻塞,异步阻塞,异步非阻塞

bio就是同步阻塞,nio就是同步非阻塞,aio就是异步非阻塞

 

划重点

什么是同步什么是异步?

同步是这事情要我自己干。

异步是这事情我可以喊别人帮我干,然后后面它通知我返回结果,或者我不需要知道任何结果。

什么是阻塞和非阻塞?

阻塞:我去银行取钱,一直在排队,这就是阻塞,因为一直没轮到我取钱。

非阻塞:我去银行,能直接去到钱,没有人挡着我。

io是要干什么?

1.等待io,2读写io。

一个请求从过来,首先是io准备,io读写。

请求先到操作系统,然后再到我们编写的应用程序,好了现在主体有2个,操作系统和应用程序。

为什么说bio是同步阻塞的?

答:一个请求过来,直接就在应用程序开了一个线程,然后等io准备好,这就是阻塞。然后读写io也是自己干,所以就是同步。

为什么nio是同步非阻塞吗?

答:nio不等待io准备,让操作系统等待,好了再来通知,但是nio自己来io读写,(自己干)所以是同步。

为什么aio是异步非阻塞?

答:aio不等待io那就没有阻塞说法,然后io读完之后,再来通知成功或者失败,那么io也是操作系统读写的,io读写这事情也是别人干的。所以就是异步。

看到这里发现了吗?

这里两个主体,操作系统和应用程序,因为应用程序是自己,操作系统是别人,所以等待io,如果是操作系统干了,那就没有阻塞自己,如果io读写操作系统也帮忙干了,自己也不需要干,那就是异步。

同步异步大家发现概念很多,但是大家没搞清楚主体是什么?我(应用程序)自己干,就是同步。别人(操作系统)干相对于应用程序,那就是异步。参照物是自己。

阻塞和非阻塞。参照物同样我(应用程序)。如果我要等待,那就是我被阻塞了。如果我不需要等待,那就是非阻塞。

同步异步指的是sever服务器的执行方式。阻塞,非阻塞是线程的状态。

 

关于以下:

NIO 和 AIO 性能上对比

AIO在性能上相对于NIO没有本质的提升。 
AIO只是帮助你从内核中将数据复制到用户空间中,并调用你传入的回调方法。 
NIO 是需要程序自己从内核中将数据复制到用户空间中,并需要程序自己调用相应的处理逻辑。

 

为什么会出现这样的解释?

因为一台机子操作程序和应用程序相对计算机是不是同在一条船上,也是同一个cpu在跑。如果应用程序不干的事情,操作系统干,所以实际上好的操作系统会比较重要。比如服务器选用linux的确会比windows还要强,毕竟少个界面的程序的维护和渲染。

 

参考文章:

https://blog.csdn.net/z15732621582/article/details/78939122?foxhandler=RssReadRenderProcessHandler

https://blog.csdn.net/jijianshuai/article/details/77450746

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值