非阻塞IO可以等同异步IO嘛?

Posted wccfsdn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了非阻塞IO可以等同异步IO嘛?相关的知识,希望对你有一定的参考价值。

脑壳短路的一瞬间,黑人问号?

在这个问题之前,我们先了解下IO的过程,下图是异步IO,做个参照(图片随便找的,侵权联系小弟删除)

技术图片

 

简单叙述下windows同步IO的流程(图片描述的是异步IO)

  1、调用Read()方法时,线程从托管代码转换为本机/用户模式代码,Read内部调用Win32 ReadFile函数。

  2、ReadFile分配一个小的数据结果,就是我们常说的I/O请求包(IRP 初始化后包含文件句柄、文件偏移量等信息)

  3、ReadFile将线程从本机/用户模式代码变成本机/内核模式代码,向内核传递IRP数据,从而调用Windows内核

  4、根据IRP中的设备句柄,windows内核将IRP传递给恰当的设备驱动程序的IRP队列(每个设备都维护着自己的IRP队列)

  5、此刻硬件设备才开始执行请求的I/O操作。

在归类简述,IO分为两步:第一步是数据准备,第二步是数据复制阶段,所谓数据复制阶段就是将数据从内核空间复制到用户空间(对用户模式和内核模式不懂得,百度去)

 

上面铺垫那么多,其实结果大部分小伙伴都知道的:标题的问题是不成立的。非阻塞IO的非阻塞主要体现在IO的数据准备阶段,非阻塞IO会定时检查服务端的数据准备情况,这个阶段是非阻塞的。但是数据准备阶段一旦完成,线程就会阻塞进行的IO的第二步,即数据复制,所以非阻塞IO还是属于同步IO。

写到这里我的脑子突然冒出个问题:怎么定义非阻塞?怎么定义阻塞?跑远了......其实越想越觉得上面写的有问题,在想想......

 

以上是关于非阻塞IO可以等同异步IO嘛?的主要内容,如果未能解决你的问题,请参考以下文章

IO模型介绍 以及同步异步阻塞非阻塞的区别

IO-同步,异步,阻塞,非阻塞

IO模型--阻塞IO,非阻塞IO,IO多路复用,异步IO

深入理解非阻塞同步IO和非阻塞异步IO

IO阻塞非阻塞同步异步同步阻塞同步非阻塞异步阻塞异步非阻塞

Python37 协程阻塞IO非阻塞IO同步IO异步IO