注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

亮丽

一直想安静的过着安静的日子,安静的爱着爱我的人

 
 
 

日志

 
 
 
 

同步、异步、阻塞、非阻塞的理解  

2011-05-26 16:21:20|  分类: 编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
        阻塞和非阻塞的区别:

指当前进程访问的数据如果尚未就绪,进程是否需要等待。简单来说,就是未就绪时是直接返回还是等待就绪。

同步和异步的区别:

同步和异步指访问数据的机制,同步一般指主动请求并等待I/O操作完毕的方式,当数据就绪后在读写的时候必须阻塞(区别就绪与读写两个阶段,同步的读写必须阻塞);异步则指主动请求数据后,便可以继续处理其他任务,随后等待I/O操作完毕的通知,这可以使进程在数据读写时也不阻塞。(等待“通知”)

同步阻塞和同步非阻塞的区别:

同步阻塞:进程烧水,就不能煮粥;

同步非阻塞:类似于用一个进程烧水、主粥。好处就是一个进程处理多个I/O请求,劣势就是需要不停的轮询。

两者的区别在于:是否等待数据就绪。

在同步阻塞I/O中,进程实际上等待的时间可能包括两个部分:一个是等待数据的就绪;另一个是等待数据的复制。对于网络I/O来讲,前者的时间可能会更长一些。与此不同的是,同步非阻塞I/O的调用不会等待数据的就绪,如果数据不存在,不可读或者不可写,它会立即返回告诉进程。

比如:我们使用非阻塞recv()接收网络数据的时候,如果网卡缓冲区中没有可接收的数据,函数就及时返回,告诉进程没有数据可读了。相比于阻塞I/O,这种非阻塞I/O结合反复的轮询来尝试数据是否就绪,防止进程被阻塞,最大的好处便在于可以在一个进程里同时处理多个I/O操作。但正是由于需要进程执行多次的轮询来查看数据是否就绪,这花费了大量的CPU时间,使得进程处于忙碌等待状态。

基于这样的理解,如果是阻塞的话,当前阻塞的线程肯定会被挂起;同步和异步只是针对其他线程而言的,如果其他线程一直等待该线程,那么就是同步阻塞;如果其他线程一直等待该线呈,而本线程开始执行其他操作,比如多个I/O操作,那么就是同步非阻塞;如果其它线程不等该线程或者开始执行,而本线程被阻塞,不能做其他事情,那么就是异步阻塞。如果其他线程不等该线程或者开始执行,并且本线程没有被挂起,开始执行其它操作,比如,多个I/O操作,那么就是异步非阻塞。

下面通过一个简单明了的例子-买面条的故事,说明这四者的理解:

我(进程)在一家店买面条(数据),另外一家店买包子(数据),还有一家店买糕点(数据)。这些东西都需要时间来等待制作。

我先去面条店,等待面条的制作,制作好后取走;接着,再开始去第二家买包子,包子买好后,最后去买糕点,糕点制作好后,取走。这三家店不能同时去,也不能交叉着去。必须一家接着一家。这种情况为同步阻塞

我去这三家店,告诉三位老板我要买的东西,并不在任何一家店等待东西的制作。然后,轮流不停的去各个小吃店询问进度,痛苦不堪。现在引入多路I/O就绪通知后,小吃城管理处给大厅安装了一块电子屏幕,以后所有小吃店的食物做好后,都会显示在屏幕上,这可真是个好消息,只需要间隔性的看看大屏幕就可以了。在这个线程没有结束之前,其他线程不能执行。这种情况未同步非阻塞(不停地轮询)

这时有一个看逛街的线程,我去看逛街,不去询问这三种东西的制作进度,等任何一种制作好的时候,会发给信号给我。而第一个线程,只有等面条做好以后,才能进行下一个任务操作,比如,在同一家面条店制作一个批萨,只有当面条制作好后,才能开始制作批萨。这就是异步阻塞

我去逛街,而面条店的其中一个师傅在给我做面条的同时,另外一个师傅在做皮萨,而我继续逛街,面条或者皮萨做好的时候通知我一声,面条店(一个函数)同时可以做两件事情,第一个线程并没有被阻塞,这叫做异步非阻塞

  评论这张
 
阅读(227)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017