♻️同步和异步;并行和并发;阻塞和非阻塞

概念辨析

同步(Synchronous)和异步(Asynchronous)

同步和异步关注的是任务完成的顺序和时间:

  • 同步操作意味着在执行某个任务时,必须等待这个任务完成后才能继续执行下一个任务。这通常会导致执行线程在等待任务完成时处于阻塞状态。

  • 异步操作允许执行线程在发起一个任务后,不需要等待它完成就可以继续执行后续任务。异步操作通常通过回调、事件、信号等机制来通知调用者任务已完成。

    • 状态:即监听被调用者的状态(轮询),调用者需要每隔一定时间检查一次,效率会很低。
    • 通知:当被调用者执行完成后,发出通知告知调用者,无需消耗太多性能。
    • 回调:与通知类似,当被调用者执行完成后,会调用调用者提供的回调函数。

并行(Parallel)和并发(Concurrent)

并行和并发关注的是任务如何在处理器上执行:

  • 并行指的是多个任务在多个处理器上同时执行。在并行执行中,任务之间是完全独立的,可以同时进行,从而提高效率。
  • 并发指的是多个任务在一个或多个处理器上交替执行。在单个处理器系统中,虽然任务看起来是同时执行的,但实际上处理器在不同任务间快速切换,给人一种同时执行的错觉。

阻塞(Blocking)和非阻塞(Non-blocking)

阻塞和非阻塞关注的是在等待任务完成时,线程的状态和行为:

  • 阻塞操作是指在等待操作完成时,当前线程会被挂起。例如,一个阻塞的I/O调用会导致请求它的线程停止执行,直到I/O操作完成。
  • 非阻塞操作是指即使操作尚未完成,当前线程也不会被挂起。非阻塞操作允许线程继续执行并定期检查操作是否完成。

阻塞非阻塞与同步异步的区别

同步/异步关注的是消息通知的机制,而阻塞/非阻塞关注的是程序(线程)等待消息通知时的状态。

以小明下载文件打个比方,从这两个关注点来再次说明这两组概念,希望能够更好的促进大家的理解。

同步阻塞:小明一直盯着下载进度条,到 100% 的时候就完成。

  • 同步体现在:等待下载完成通知;
  • 阻塞体现在:等待下载完成通知过程中,不能做其他任务处理;

同步非阻塞:小明提交下载任务后就去干别的,每过一段时间就去瞄一眼进度条,看到 100% 就完成。

  • 同步体现在:等待下载完成通知,但是要在;
  • 非阻塞体现在:等待下载完成通知过程中,去干别的任务了,只是时不时会瞄一眼进度条;【小明必须要在两个任务间切换,关注下载进度】

异步阻塞:小明换了个有下载完成通知功能的软件,下载完成就“叮”一声。不过小明仍然一直等待“叮”的声音(看起来很傻,不是吗)。

  • 异步体现在:下载完成“叮”一声通知;

阻塞体现在:等待下载完成“叮”一声通知过程中,不能做其他任务处理;

异步非阻塞:仍然是那个会“叮”一声的下载软件,小明提交下载任务后就去干别的,听到“叮”的一声就知道完成了。

  • 异步体现在:下载完成“叮”一声通知;
  • 非阻塞体现在:等待下载完成“叮”一声通知过程中,去干别的任务了,只需要接收“叮”声通知即可;【软件处理下载任务,小明处理其他任务,不需关注进度,只需接收软件“叮”声通知,即可】

也就是说,同步/异步是“下载完成消息”通知的方式(机制),而阻塞/非阻塞则是在等待“下载完成消息”通知过程中的状态(能不能干其他任务),在不同的场景下,同步/异步、阻塞/非阻塞的四种组合都有应用。

所以,综上所述,同步和异步仅仅是关注的消息如何通知的机制,而阻塞与非阻塞关注的是等待消息通知时的状态。也就是说,同步的情况下,是由处理消息者自己去等待消息是否被触发,而异步的情况下是由触发机制来通知处理消息者,所以在异步机制中,处理消息者和触发机制之间就需要一个连接的桥梁:

在小明的例子中,这个桥梁就是软件“叮”的声音。

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

1 同步阻塞形式

效率是最低的,

拿上面的例子来说,就是你专心等待下载完成,什么别的事都不做。

实际程序中:就是未对fd 设置O_NONBLOCK标志位的read/write 操作;

2 异步阻塞形式

异步操作是可以被阻塞住的,只不过它不是在处理消息时阻塞,而是在等待消息通知时被阻塞。

比如select 函数,假如传入的最后一个timeout参数为NULL,那么如果所关注的事件没有一个被触发,程序就会一直阻塞在这个select 调用处。

3 同步非阻塞形式

实际上是效率低下的,

想象一下你一边干别的事情一边还需要抬头看下载完成没有,如果把干别的事情和观察下载完成情况的位置看成是程序的两个操作的话,这个程序需要在这两种不同的行为之间来回的切换,效率可想而知是低下的。

很多人会写阻塞的read/write 操作,但是别忘了可以对fd设置O_NONBLOCK 标志位,这样就可以将同步操作变成非阻塞的了。

4 异步非阻塞形式

效率更高,

因为等待下载完成是你(等待者)的事情,而通知你则是电脑(消息触发机制)的事情,程序没有在两种不同的操作中来回切换。

至此,关于进程线程、同步异步、阻塞非阻塞、并发并行已经讲的差不多了,有讲的不好的地方请大佬指出。同时也谢谢网上大佬的文章帮助我理解了这些概念。

参考来源

https://cloud.tencent.com/developer/article/1592939

posted @ 2024-06-09 17:53  banon  阅读(2)  评论(0编辑  收藏  举报