先上几个图
BIO:线程发起IO请求,不管内核是否准备好IO操作,从发起请求起,线程一直阻塞,直到操作完成。如下图:
NIO(reactor模型):线程发起IO请求,立即返回;内核在做好IO操作的准备之后,通过调用注册的回调函数通知线程做IO操作,线程开始阻塞,直到操作完成。如下图:
AIO(proactor模型):线程发起IO请求,立即返回;内存做好IO操作的准备之后,做IO操作,直到操作完成或者失败,通过调用注册的回调函数通知线程做IO操作完成或者失败。如下图:
然后很多人说:
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