阻塞非阻塞与异步同步问题

来源:互联网 发布:java软件开发培训机构 编辑:程序博客网 时间:2024/05/13 09:52

通常IO操作分为两个步骤:(1)IO请求   (2)实际的IO操作

阻塞和非阻塞的区别是发生在(1)过程中的,发生在内核中。同步异步的区别是发生在(2)过程中的。发生在应用程序与内核的交互中。

如下面的图所示阻塞非阻塞得区别发生在等待数据的那个阶段,而将数据从内核空间复制到用户空间的阶段是相同的。

阻塞:应用程序请求IO操作的时候,如果数据没有准备好,请求不即刻返回。可以看到在等待数据阶段没有立即返回。





非阻塞:应用程序请求IO操作时,如果数据没有准备好,请求立即返回。如图在等待数据阶段会立即返回。



同步:在实际IO操作中进程触发IO操作,并且等待或者轮询的去查看IO操作是否完成。如同异步的图,只是在将数据从内核复制到用户空间过程中进程要么等待,要不就轮询问内核IO操作是否完成。

异步:在实际IO操作中进程触发IO操作,进程直接返回做自己的事,IO交由内核处理,IO操作完成后内核通知进程IO完成。


 


自己理解的总结:

同步异步讨论的是消息如何通知的机制,同步情况下,由处理消息者自己去等待消息是否被触发完成,而异步是由触发机制通知给处理消息者。

阻塞非阻塞讨论的是等待消息时的状态。阻塞就是等待中不干别的事,非阻塞就是程序在此期间可以做别的事,所以阻塞非阻塞与同步异步无关,两者可以结合使用。

0 0
原创粉丝点击