非阻塞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。

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

猜你喜欢

转载自www.cnblogs.com/wccfsdn/p/11953534.html