同步/异步与阻塞/非阻塞的区别
- 博客分类:
- 技术杂绘
同步/异步与阻塞/非阻塞的区别
2010年07月26日
先举个从其他博客(http://www.blogjava.net/andyelvis/archive/2009/05/ 16/271012.html)上摘抄的例子,比如我去银行办理业务,可能选择排队等候,也可能取一个小纸条上面有我的号码,等到排到我这一号时由柜台的人通知我轮到我去办理业务了.前者(排队等候)就是同步等待消息,而后者(等待别人通知)就是异步等待消息.在异步消息处理中,等待消息者(在这个例子中就是等待办理业务的人)往往注册一个回调机制,在所等待的事件被触发时由触发机制(在这里是柜台的人)通过某种机制(在这里是写在小纸条上的号码)找到等待该事件的人.
而在实际的程序中,同步消息处理就好比简单的read/write操作,它们需要等待这操作成功才能返回;而异步处理机制就是类似于select/poll(有多个文件描述符在列表中排队)之类的多路复用IO操作,当所关注的消息被触发时,由消息触发机制通知触发对消息的处理.
如果在这个等待的过程中,等待者除了等待消息之外不能做其它的事情,那么该机制就是阻塞的,表现在程序中,也就是该程序一直阻塞在该函数调用处不能继续往下执行.相反,有的人喜欢在银行办理这些业务的时候一边打打电话发发短信一边等待,这样的状态就是非阻塞的,因为他(等待者)没有阻塞在这个消息通知上,而是一边做自己的事情一边等待.但是需要注意了,第一种同步非阻塞形式实际上是效率低下的,想象一下你一边打着电话一边还需要抬头看到底队伍排到你了没有,如果把打电话和观察排队的位置看成是程序的两个操作的话,这个程序需要在这两种不同的行为之间来回的切换,效率可想而知是低下的;而后者,异步非阻塞形式却没有这样的问题,因为打电话是你(等待者)的事情,而通知你则是柜台(消息触发机制)的事情,程序没有在两种不同的操作中来回切换. 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。按照这个定义,其实绝大多数函数都是同步调用(例如sin, isdigit等)。但是一般而言,我们在说同步、异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务。 阻塞调用是指调用结果返回之前,当前进程会被挂起。函数只有在得到结果之后才会返回。
有人也许会把阻塞调用和同步调用等同起来,实际上他是不同的。对于同步调用来说,很多时候当前进程还是激活的,只是从逻辑上当前函数没有返回而已。例如,我们在socket中调用receive函数,如果缓冲区中没有数据,这个函数就会一直等待,直到有数据才返回。而此时,当前进程还会继续处理各种各样的消息。如果主窗口和调用函数在同一个线程中,除非你在特殊的界面操作函数中调用,其实主界面还是应该可以刷新,就好比在银行等待例子中的等待者,虽然要排队(同步),但在排队过程中额可以打打电话,看看报纸。socket接收数据的另外一个函数recv则是一个阻塞调用的例子。当socket工作在阻塞模式的时候,如果没有数据的情况下调用该函数,则当前进程程就会被挂起,直到有数据为止,就好比在银行等待例子中的等待者,既要排队(同步),在排队时又不能做其他事情(阻塞)。
异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。以CAsycSocket类为例(注意,CSocket从CAsyncSocket派生,但是起功能已经由异步转化为同步),当一个客户端通过调用Connect函数发出一个连接请求后,调用者线程立刻可以朝下运行。当连接真正建立起来以后,socket底层会发送一个消息通知该对象。
这里提到执行部件和调用者通过三种途径返回结果:状态、通知和回调。可以使用哪一种依赖于执行部件的实现,除非执行部件提供多种选择,否则不受调用者控制。如果执行部件用状态来通知,那么调用者就需要每隔一定时间检查一次,效率就很低(有些初学多线程编程的人,总喜欢用一个循环去检查某个变量的值,这其实是一种很严重的错误)。如果是使用通知的方式,效率则很高,因为执行部件几乎不需要做额外的操作。至于回调函数,其实和通知没太多区别。
发表评论
-
Android IPC进程间通讯机制
2012-01-20 10:28 590Android IPC进程间通讯机制 2011年06月17日 ... -
说说IO - IO的分层
2012-01-20 10:28 742说说IO - IO的分层 2011年 ... -
使用 libevent 和 libev 提高网络应用性能
2012-01-20 10:28 720使用 libevent 和 libev 提 ... -
Linux下进程通信
2012-01-20 10:28 821Linux下进程通信 2011年05 ... -
安卓模拟器手机上网,玩游戏
2012-01-19 15:30 1166安卓模拟器手机上网,玩 ... -
3.1 MFC概述
2012-01-19 15:30 6183.1 MFC概述 2009年12月01 ... -
Virtools:把Virtools文件封装到可执行文件中
2012-01-19 15:30 838Virtools:把Virtools文件封装到可执行文件中 ... -
Windows与Linux共存之重装Windows经历
2012-01-19 15:30 549Windows与Linux共存之重装W ... -
给不会打字的朋友推荐一种鼠标写字的输入法
2012-01-19 15:29 890给不会打字的朋友推荐一种鼠标写字的输入法 2011年05月2 ... -
即将成为过去的同事(二)
2012-01-17 05:15 581即将成为过去的同事(二) 7小时前 刘莉萍:作为白手起家 ... -
献给我想念的龙中0809班
2012-01-17 05:15 584献给我想念的龙中0809班 7小时前 可爱的龙中0809 ... -
我的日志
2012-01-17 05:15 636我的日志 7小时前 如果没有严格的纪律约束EL涛 ... -
夏暮雪只爱过一个人,他叫陆北岛。(小说完整版)
2012-01-17 05:14 936夏暮雪只爱过一个人,他叫陆北岛 ... -
嘿,你好吗。我很好。
2012-01-17 05:14 698嘿,你好吗。我很好。 7小时前 ... -
在Window下编译OpenH323(上)---------编译PWLib
2012-01-16 04:09 1460在Window下编译OpenH323(上)---------编 ... -
今天给自己做RIA扫盲
2012-01-16 04:09 931今天给自己做RIA扫盲 2009年10月14日 什么是R ... -
URL地址
2012-01-16 04:09 1170URL地址 2010年11月04日 http://pce ... -
flex 网络系统
2012-01-16 04:09 908flex 网络系统 2009年08月24日 Web OS ... -
基于PureMVC的一个Flex MP3播放器分析
2012-01-16 04:09 504基于PureMVC的一个Flex MP3 ...
相关推荐
本文主要讲了IO中同步、异步与阻塞、非阻塞的区别。希望对你的学习有所帮助。
同步异步阻塞非阻塞
讲述同步、异步、阻塞、非阻塞的区别,通俗易懂,是我见到的最口语话最清晰的材料,文中比喻恰当,深入浅出。
主要介绍了详解socket阻塞与非阻塞,同步与异步、I/O模型,socket网络编程中的同步,异步,阻塞式,非阻塞式,有何联系与区别,本文将详细讲诉。
异步、同步、阻塞、非阻塞的说明和解释,用于深入理解。
聊聊同步、异步、阻塞与非阻塞 聊聊同步、异步、阻塞与非阻塞 聊聊同步、异步、阻塞与非阻塞
tcp socket同步 异步 阻塞 非阻塞 的解释.zip 基本概念:同步、异步、阻塞和非阻塞的区别 同步异步与阻塞非阻塞的区别 C++ 同步异步与阻塞非阻塞的区别
常规的误区 ... ... 这个时候你问别人,刚刚代码发起的这个请求是不是一个同步请求,对方一定回答是。这是对的,它确实是。...对方一定是这样回答的,“因为发起... 不是因为代码卡住不动了才叫同步请求,而是因为它是同步
java 同步、异步、阻塞和非阻塞分析.docx
这篇文章里,简单而且形象的介绍了同步于异步——阻塞与非阻塞的知识。希望可以帮助大家
在进行网络编程时,我们常常见到同步、异步、阻塞和非阻塞四种调用方式。这些方式彼此概念并不好理解。下面是我对这些术语的理解。 同步 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。...
主要介绍了java 中同步、异步、阻塞和非阻塞区别详解的相关资料,需要的朋友可以参考下
用一个最简单的例子说明异步非阻塞Socket的基本原理和工作机制
同步异步,阻塞非阻塞,I/O学习总结的思维导图,需要结合Richard Stevens的书来学习
6-【高并发编程】再谈同步、异步、阻塞、非阻塞-1809261
https://blog.csdn.net/xxxxxx91116/article/details/12083613【Linux网络编程】同步,异步,阻塞,非阻
本文档,是我本人翻译的一篇介绍linux系统同步异步阻塞非阻塞的知识的,你在网上看到的百分之八十的知识,可能都以讹传讹,让你看的一知半解,因为网上很多该类博客,没有讲解清楚,举得例子:如老王烧水,小王银行...
在进行网络编程时,常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式 同步/异步主要针对C端: 同步:c端发出一个功能调用时,在没有得到结果之前,c端死等结果 例如:普通B/S模式(同步)...
主要介绍了JAVA同步、异步、阻塞和非阻塞之间的区别,文中讲解非常细致,帮助大家更好的理解和学习,感兴趣的朋友可以了解下