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

[同步和异步]

通俗的讲:
同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。 
异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。
同步:提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事
异步: 请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完毕

概念从现实中来:
同步:打电话,你拨通电话后必须等在那里,直到对方有人接了,你们才能通信或者说你才能继续打下一个电话。
异步:发短信,你可以发短信,只要你发出去,你就可以继续发给下一个人,而不需要等到第一个人回你,你才可以继续。

同步服务器
异步服务器
所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。按照这个定义,其实绝大多数函数都是同步调用(例如sin, isdigit等)。
但是一般而言,我们在说同步、异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务。最常见的例子就是 SendMessage。
该函数发送一个消息给某个窗口,在对方处理完消息之前,这个函数不返回。当对方处理完毕以后,该函数才把消息处理函数所返回的 LRESULT值返回给调用者。

异步
异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。
以CAsycSocket类为例(注意,CSocket从CAsyncSocket派生,但是起功能已经由异步转化为同步),当一个客户端通过调用 Connect函数发出一个连接请求后,
调用者线程立刻可以朝下运行。当连接真正建立起来以后,socket底层会发送一个消息通知该对象。这里提到执行部件和调用者通过三种途径返回结果:
状态、通知和回调。可以使用哪一种依赖于执行部件的实现,除非执行部件提供多种选择,否则不受调用者控制。
如果执行部件用状态来通知,那么调用者就需要每隔一定时间检查一次,效率就很低
(有些初学多线程编程的人,总喜欢用一个循环去检查某个变量的值,这其实是一种很严重的错误)。
如果是使用通知的方式,效率则很高,因为执行部件几乎不需要做额外的操作。至于回调函数,其实和通知没太多区别。

[阻塞和非阻塞]

阻塞
阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。
有人也许会把阻塞调用和同步调用等同起来,实际上他是不同的。
对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。
例如,我们在CSocket中调用Receive函数,如果缓冲区中没有数据,这个函数就会一直等待,直到有数据才返回。
而此时,当前线程还会继续处理各种各样的消息。如果主窗口和调用函数在同一个线程中,除非你在特殊的界面操作函数中调用,其实主界面还是应该可以刷新。
socket接收数据的另外一个函数recv则是一个阻塞调用的例子。当socket工作在阻塞模式的时候,如果没有数据的情况下调用该函数,则当前线程就会被挂起,直到有数据为止。

非阻塞
非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。

通俗地说,你拿着饭碗在排队等饭是阻塞的,你不能跑出去干其他事情;你拿着一张取饭的号码等饭是非阻塞的,你可以出去抽根烟在回来。

比如在epoll模型wait之后,将新连接设置成一个非阻塞的连接(见epoll模型)
 setnonblocking(client); // 将新连接置于非阻塞模式
这样客户端在得到结果之前,立刻返回,而不是出于等待中。

在网络通信与服务器编程过程中,我们必须首先了解这两组蛋疼的概念!但是,当你模糊时候,请想到
“打电话和发短信”,“拿饭碗等和拿号码等饭”,那么你就清楚了!

时间: 2024-10-25 01:55:06

异步/同步、阻塞/非阻塞的理解的相关文章

理解同步异步与阻塞非阻塞

本篇文章我准本从三个大方面来解释下同步异步.阻塞非阻塞的知识,第一个方面主要是说下,到底什么是同步异步.阻塞非阻塞:第二个方面主要是解释下在I/O场景下,同步异步阻塞非阻塞又是怎么定义的,第三个方面介绍下在unix下同步异步又有哪些阻塞非阻塞IO. 1.同步异步与阻塞非阻塞 首先从大的方面来说,"阻塞"与"非阻塞"与"同步"与"异步"不能简单的从字面理解,提供一个从分布式系统角度的回答. 1).同步与异步 同步和异步关注的是消

深入理解同步/异步与阻塞/非阻塞区别 (转)

转载自:http://chuansong.me/n/2124760 几年前曾写过一篇描写同步/异步以及阻塞/非阻塞的文章,最近再回头看,还存在一些理解和认知误区,于是重新整理一下相关的概念,希望对网络编程的同行能有所启发. 同步与异步 首先来解释同步和异步的概念,这两个概念与消息的通知机制有关. 举个例子,比如一个用户去银行办理业务,他可以自己去排队办理,也可以叫人代办,办完之后再告知用户结果.对于要办理这个银行业务的人而言,自己去办理是同步方式,而别人代办完毕再告知则是异步方式. 两者的区别在

单线程,同步异步,阻塞非阻塞的理解

一.概念理解 1.同步异步: 同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)所谓同步,就是在发出一个*调用*时,在没有得到结果之前,该*调用*就不返回.但是一旦调用返回,就得到返回值了.换句话说,就是由*调用者*主动等待这个*调用*的结果. 而异步则是相反,*调用*在发出之后,这个调用就直接返回了,所以没有返回结果.换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果.而是在*调用*发出后,*被

关于[同步异步]和[阻塞非阻塞]的个人理解

同步 异步 阻塞 非阻塞 如上两个概念比较容易混淆, 而且实际情况来看二者有时效果相似, 最主要的相似点就是不需要等别人, 下面简单总结下自己的认识 同步和异步 同步和异步是指发起一个服务调用时,是否需要等待调用对象的执行结果.  服务调用分为 [发送命令,调用执行,读取结果 ] 如果需要等待调用对象执行完毕后把结果返回给调用者, 这样就是同步的模式 如果A调用一个服务B, A不需要等B的结果返回就直接返回做其他事情, A只需要发送命令,  等B调用执行完毕后通知A进行 读取结果, 这样是异步的

理解同步,异步,阻塞,非阻塞,多路复用,事件驱动IO

以下是IO的一个基本过程 先理解一下用户空间和内核空间,系统为了保护内核数据,会将寻址空间分为用户空间和内核空间,32位机器为例,高1G字节作为内核空间,低3G字节作为用户空间.当用户程序读取数据的时候,会经历两个过程:磁盘到内核空间(这块消耗性能,下面简称内核数据准备),内核空间拷贝到用户空间(下面简称用户空间拷贝). 基于这个前提,同步异步IO,阻塞非阻塞IO 这几个概念其实非常类似的,区分的关键点在于被调用者的返回方式. 当我们进行IO操作的时候,如果被调用者将任务全部执行完返回,称为同步

超鸡容易理解的---同步异步,阻塞非阻塞

快来看超鸡容易理解的同步异步,阻塞非阻塞,再也不担心理解晦涩的语言了. 阻塞和非阻塞指的是执行一个操作是等操作结束再返回,还是马上返回. 比如餐馆的服务员为用户点菜,当有用户点完菜后,服务员将菜单给后台厨师,此时有两种方式: 第一种:就在出菜窗口等待,直到厨师炒完菜后将菜送到窗口,然后服务员再将菜送到用户手中: 第二种:等一会再到窗口来问厨师,某个菜好了没?如果没有先处理其他事情,等会再去问一次: 第一种就是阻塞方式,第二种则是非阻塞的. 同步和异步又是另外一个概念,它是事件本身的一个属性.还拿

[转]理解阻塞非阻塞与同步异步

from:http://www.zhihu.com/question/19732473 1.同步与异步同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)所谓同步,就是在发出一个*调用*时,在没有得到结果之前,该*调用*就不返回.但是一旦调用返回,就得到返回值了.换句话说,就是由*调用者*主动等待这个*调用*的结果. 而异步则是相反,*调用*在发出之后,这个调用就直接返回了,所以没有返回结果.换句话说,当一

同步&异步+阻塞&非阻塞(理解)

0 - 同步&异步 同步和异步关注的是消息通信机制. 0.1 - 同步 由"调用者"主动等待这个"调用"结果.即是,发出一个"调用"时,在没有得到结果之前,该"调用"不返回,一旦调用返回,则得到返回值. 0.2 - 异步 "调用者"不主动等待"调用"结果,而是"调用"结束之后主动通知"调用者"(通过状态.通知或者回调函数等各种形式). 0.

同步/异步与阻塞/非阻塞

一.同步与异步同步/异步, 它们是消息的通知机制 1. 概念解释A. 同步所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回. 按照这个定义,其实绝大多数函数都是同步调用(例如sin isdigit等).但是一般而言,我们在说同步.异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务.最常见的例子就是 SendMessage.该函数发送一个消息给某个窗口,在对方处理完消息之前,这个函数不返回.当对方处理完毕以后,该函数才把消息处理函数所返回的值返回给调用者. B.