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

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

阻塞与非阻塞AND同步与异步  

2011-10-13 16:21:36|  分类: 网络服务编程技术 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

阻塞与非阻塞AND同步与异步

这几个月来一直拜读各位大神的网络方面的书籍,虽然不敢说学到什么真知灼见,但水平却也有所增长,正所谓开卷有益,古人诚不我欺。
原来自己有过总结,认为两组二者不过是不同环境下的不同叫法,但发现在网络上有些小小的不同,总结一下,
在多线程开发和SOCKET或设备读写中,我们经常遇到这样的说法,线程被阻塞住了,SOCKET是同步的,异步读取IO等等,但到底什么是阻塞,什么是非阻塞,什么是同步,什么是异步呢。
举例子大家都明白,阻塞,就是程序在运行时,收不到反应(包括消息、返回值等)就一直在那等待,这就叫阻塞,比如大家非常清楚的SOCKET套接字的recv这个函数,如果没有数据来,当前的接收线程就会阻塞在那儿,啥也不干。而非阻塞是什么呢,很简单,非阻塞就是不在那儿等待,直接返回,那返回值可能是正确的,也可能是错误的,这个就看具体的编程控制了,这个大家写过非阻塞的SOCKET应该明白,我们判断返回值不对,并不代表SOCKET有错。
那什么是同步,什么是异步呢,举个最常用的,那就是线程,多个线程访问一个共同的变量,如果这个变量严格要求一个完成,另外一个才能完成,那么我们控制的手段就是同步。说白了就你一下,我一下,不能说大家乱来,我看看,你看看,或者你看一回,我看两回,这个不成。异步就好说了,各干各的。互不理睬。这个谈不上哪个好哪个坏,看你具体的应用环境。
可是如果具体到SOCKET上,就产生了一个问题,同步和阻塞有啥区别,异步和非阻塞有啥区别?
同步和异步主要是应用到IO操作上,其实就是你发送了读写操作IO的命令后,看你怎么处理,如果是等待IO回复,就是同步,如果不是,而是IO返回后通知你再进行动作,这就叫作异步。
这样来看实际的应用不外乎以下几种:
1、同步阻塞与同步非阻塞
这样看来,如果一个线程访问多个IO,如果阻塞,不管你后面是啥,都不再动作了。而如果是同步,则可以看看这个IO有反应没,没有继续等待,但可以接着看下一个IO,直到看到可以同步工作的IO,当然如果一直没有,那就RP差的在那儿转圈儿呗。
这种是最典型的网络开发应用:线程+SOCKET
而同步非阻塞可以适当的提高网络通信的性能,这个不细说,大家去翻书或网上查资料。
这个最典型的是SELECT
2、异步非阻塞(目前认为阻塞和非阻塞只对同步操作有意义,因为异步本身就意味着操作进程不会进入休眠。)
这个典型是,WINDOWS下面有IOCP,LINUX有EPOLL。包括消息和事件都认为可以归到这里。

总结:这里有一些东西,说得可能不太清楚,有异议者可提出,非常欢迎,真理不辩不明,学习要互相帮助,取长补短。另外从网上查资料,维基上把这两种东东归为一个玩意儿。

这里出现了一个问题,那就是select是同步还是异步方式,如果按书上讲,包括UXNIX网络编程(还有王艳平的WINDOWS网络与通信程序设计)等收都将其归为同步,但一些BLOG和书籍上将其认定为异步,而在最近的面试中,有人回答说是异步,本人对其进行了否定的回答,也可以说主要是按书上讲的,但经过认真查阅资料发现这两种说法都可以说是对的,对此,

对面试时的同学受到本人的不公正待遇,道歉。

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

历史上的今天

评论

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

页脚

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