转载--阻塞、非阻塞,同步、异步

转自:http://blog.csdn.net/hguisu/article/details/7453390html

1. 概念理解 ajax

     在进行网络编程时,咱们经常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:
同步:
      
所谓同步,就是在发出一个功能调用时,在没有获得结果以前,该调用就不返回。也就是必须一件一件事作,等前一件作完了才能作下一件事。编程

 例如普通B/S模式(同步):提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事浏览器

异步:
      
异步的概念和同步相对。当一个异步过程调用发出后,调用者不能马上获得结果。实际处理这个调用的部件在完成后,经过状态、通知和回调来通知调用者。服务器

     例如 ajax请求(异步)请求经过事件触发->服务器处理(这是浏览器仍然能够做其余事情)->处理完毕网络

阻塞
     
阻塞调用是指调用结果返回以前,当前线程会被挂起(线程进入非可执行状态,在这个状态下,cpu不会给线程分配时间片,即线程暂停运行)。函数只有在获得结果以后才会返回。异步

     有人也许会把阻塞调用和同步调用等同起来,实际上他是不一样的。对于同步调用来讲,不少时候当前线程仍是激活的,只是从逻辑上当前函数没有返回而已 例如,咱们在socket中调用recv函数,若是缓冲区中没有数据,这个函数就会一直等待,直到有数据才返回。而此时,当前线程还会继续处理各类各样的消息。函数

非阻塞
      
非阻塞和阻塞的概念相对应,指在不能马上获得结果以前,该函数不会阻塞当前线程,而会马上返回。
对象的阻塞模式和阻塞函数调用
对象是否处于阻塞模式和函数是否是阻塞调用有很强的相关性,可是并非一一对应的。阻塞对象上能够有非阻塞的调用方式,咱们能够经过必定的API去轮询状态,在适当的时候调用阻塞函数,就能够避免阻塞。而对于非阻塞对象,调用特殊的函数也能够进入阻塞调用。post

函数select就是这样的一个例子。 ui

1. 同步,就是我调用一个功能,该功能没有结束前,我死等结果。
2. 异步,就是我调用一个功能,不须要知道该功能结果,该功能有结果后通知我(回调通知)
3. 阻塞, 就是调用我(函数),我(函数)没有接收完数据或者没有获得结果以前,我不会返回。
4. 非阻塞,就是调用我(函数),我(函数)当即返回,经过select通知调用者
 

同步IO和异步IO的区别就在于:数据拷贝的时候进程是否阻塞!

阻塞IO和非阻塞IO的区别就在于:应用程序的调用是否当即返回!

对于举个简单c/s 模式: 

同步:提交请求->等待服务器处理->处理完毕返回这个期间客户端浏览器不能干任何事
异步:请求经过事件触发->服务器处理(这是浏览器仍然能够做其余事情)->处理完毕
同步和异步都只针对于本机SOCKET而言的。

同步和异步,阻塞和非阻塞,有些混用,其实它们彻底不是一回事,并且它们修饰的对象也不相同。
阻塞和非阻塞是指当进程访问的数据若是还没有就绪,进程是否须要等待,简单说这至关于函数内部的实现区别,也就是未就绪时是直接返回仍是等待就绪;

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

 

转自:http://www.cppblog.com/converse/archive/2009/05/13/82879.html

我喜欢用本身的语言经过联系现实生活中的一些现象解释一些概念,当我能作到这一点时,说明我已经理解了这个概念.今天要解释的概念是:同步/异步与阻塞/非阻塞的区别.

这两组概念经常让人迷惑,由于它们都是涉及到IO处理,同时又有着一些相相似的地方.

首先来解释同步和异步的概念,这两个概念与 消息的通知机制有关.

举个例子,好比我去银行办理业务,可能选择排队等候,也可能取一个小纸条上面有个人号码,等到排到我这一号时由柜台的人通知我轮到我去办理业务了.
前者(排队等候)就是同步等待消息,然后者(等待别人通知)就是异步等待消息.在异步消息处理中,等待消息者(在这个例子中就是等待办理业务的人)每每注册一个回调机制,在所等待的事件被触发时由触发机制(在这里是柜台的人)经过某种机制(在这里是写在小纸条上的号码)找到等待该事件的人.
而在实际的程序中,同步消息处理就比如简单的read/write操做,它们须要等待这两个操做成功才能返回;而异步处理机制就是相似于select/poll之类的多路复用IO操做,当所关注的消息被触发时,由消息触发机制通知触发对消息的处理.
其次再来解释一下阻塞和非阻塞,这两个概念与 程序等待消息(无所谓同步或者异步)时的状态有关.
继续上面的那个例子,不管是排队仍是使用号码等待通知,若是在这个等待的过程当中,等待者除了等待消息以外不能作其它的事情,那么该机制就是阻塞的,表如今程序中,也就是该程序一直阻塞在该函数调用处不能继续往下执行.相反,有的人喜欢在银行办理这些业务的时候一边打打电话发发短信一边等待,这样的状态就是非阻塞的,由于他(等待者)没有阻塞在这个消息通知上,而是一边作本身的事情一边等待.可是须要注意了,第一种同步非阻塞形式其实是效率低下的,想象一下你一边打着电话一边还须要抬头看到底队伍排到你了没有,若是把打电话和观察排队的位置当作是程序的两个操做的话,这个程序须要在这两种不一样的行为之间来回的切换,效率可想而知是低下的;然后者,异步非阻塞形式却没有这样的问题,由于打电话是你(等待者)的事情,而通知你则是柜台(消息触发机制)的事情,程序没有在两种不一样的操做中来回切换.

不少人会把同步和阻塞混淆,我想是由于不少时候同步操做会以阻塞的形式表现出来,好比不少人会写阻塞的read/write操做,可是别忘了能够对fd设置O_NONBLOCK标志位,这样就能够将同步操做变成非阻塞的了;一样的,不少人也会把异步和非阻塞混淆,由于异步操做通常都不会在真正的IO操做处被阻塞,好比若是用select函数,当select返回可读时再去read通常都不会被阻塞,就比如当你的号码排到时通常都是在你以前已经没有人了,因此你再去柜台办理业务就不会被阻塞.
 
 
同步/异步是功能,阻塞/非阻塞是具体的函数;同步线程是激活状态,阻塞线程被挂起。
相关文章
相关标签/搜索