oohcode

$\bigodot\bigodot^H \rightarrow CODE$

同步与异步,阻塞与非阻塞

同步异步及阻塞与非阻塞是在开发过程中经常遇到的名词,但是却经常容易混淆的名称,这里根据自己的理解对他们进行简要的介绍,以便自己能够清晰的记住他们之间的区别和联系

说道同步与异步,阻塞与非阻塞这两个概念,我一直都很混淆,相信很多人也和我一样对它们之间的单个记起来很容易,但是放到一起的时候就晕了,这其实是对它们了解不清楚导致的。这里我根据自己的理解说下他们的本质区别:
阻塞与非阻塞的区别就是一个进程在等待一个事情处理的时候能不能干其他的事情。
举个例子:假设一个进程为P,任务分为T1,T2,T3等。

  • 阻塞模式下
    P从T1开始执行,如果T1没有执行完返回则P一直在挂起状态,只有T1执行完了才重新唤醒P,执行T2任务。注意重点是:这期间P只能等待,不能干其他的事情。
  • 非阻塞模式下
    P从T1开始执行,这是不管T1有没有执行完毕都会返回一个结果,则P会继续执行其他任务,比如说T2,再执行T3等,也就是P不用关心所执行的任务是否执行完毕,只需要任务及时给出相应即可,这时如果T1执行完毕则会主动通知P,告诉P任务执行完了。可以看出P一直出去激活状态,不管是执行的一个任务还是多个任务,它不会因为一个任务没有执行完就等待。

异步与同步的区别就是进程在干多个事情的时候,这些事情是不是存在顺序关系。
举个例子:还是假设一个进程为P,任务分为T1,T2,T3等,每个任务又分为多个步骤,例如T1分为T1.1, T1.2, T1.3等步骤。

  • 同步模式下
    在同步模式下,任务的执行是有先后顺序之分的。比如T1,必须T1.1完了才能进行T1.2步骤,T1.2步骤完了才能进行T1.3步骤。所以当P执行T1的时候必须等T1.1执行完了才能执行T1.2,T1.3等任务。
  • 异步模式下
    异步模式是没有顺序之分的,P可以执行T1的步骤安装任何的顺序,因为这些步骤之间不存在依赖关系。

如果按照以上的理解(我得理解,如果有问题,恳请指出~),我觉得其实他们之间的关系就可以分得很清楚了~ 下面再来看看他们的混合情况:

  • 同步阻塞: 这个其实可以根据他们各自的定义来看,还以上面的为例。P执行T1三个阶段的任务以及T2,T3等任务,先执行T1.1,由于是同步所以,必须等T1.1执行完了才能继续往下进行,有由于是阻塞过程,所以在等待T1.1执行的过程中P是挂起的,T2,T3等任务必须处于等待状态。
  • 同步非阻塞: 这个过程还是同步的。前面和同步阻塞一样,必须等T1.1执行完了才能执行T1.2和T1.3,但是T2和T3和T1并没有顺序关系,所以当等待T1.1执行的过程中,P可以继续执行T2和T3,这就是非阻塞。
  • 异步阻塞:这个组合其实是不存在的。首先因为是异步的,也就是说P可以任意顺序执行T1,T2,T3,执行的过程中他们并不会相互等待,进程更不会挂起,所以没有这个组合。也有的说这个状态是存在的,因为执行T的过程虽然可以同时进行,但是等待消息的过程是可以是阻塞的,也就是任务同时发出,等待任务结果的这段时间进程是处于挂起状态的,我觉得这其实跟你执行的任务多少以及任务的执行时间是密切关联的,如果同时发出很多任务,而任务需要执行很长时间,那么应该有一段时间进程是挂起的,但是纵观整个过程来看,这样说并不合适,所以我认为不存在这种状态。
  • 异步非阻塞: 异步非阻塞是执行效率最高的模式,一个进程可以同时发出很多任务,比如说T1,T2,T3等,而它们之间并无顺序关系,那个任务先执行完就可以先进行回调,执行其它任务。这样P的利用率就可以达到最大。