因对于并发、并行、串行、同步、异步概念上的划分,以及它们之间的关系有些模糊,故记录下这篇文章,方便以后查阅。本文还涉及到这些内容在编程上的延伸。
1 并发和并行、串行
1.1 并发
1.1.1 概念
并发表示多个任务在同一时间段内处理,微观上不是同时发生,而宏观上是同时发生。
那么宏观上的同时发生,是如何实现的?
1.1.2 并发实现
在单核下,可以利用时间片轮转来模拟并发(不是真正意义上同时执行多项任务),cpu给不同的任务分配时间片,cpu在时间片内的时间里处理任务,结束后再处理下一个任务,如下图所示。
因为时间片小,cpu会在多个任务间来回切换处理,所以在宏观上是同时发生的。
1.2 并行
1.2.1 概念
并行表示多个任务在同一时间点上处理,在微观和宏观上都是同时发生,它关注的是执行效率和性能。
1.2.2 并行的实现
并行的实现一定需要硬件层面的支持,只有多核才能实现并行,如下图所示。
1.3 串行
串行表示任务按线性顺序执行,上一任务完成才能执行下一个。
1.4 并发、并行、串行之间的关系
这三者都是任务执行相关的概念。
并行和并发都涉及到多个任务的处理,不同点是并行在微观宏观上都是同时处理,并发微观上不同时宏观上同时。个人认为,并发是更一般的概念,并行是并发的特殊情况。
并行和串行区别于同一时间点上的任务数量,同一时间点上并行可以有多个任务,而串行只有一个,所以串行可以看做并行的一个特殊情况。
并发和串行描述的侧重不同,并发侧重于多任务处理,串行侧重于执行顺序。个人认为,他们在概念上有一定交叉,并发处理按时间片交替执行任务,这种形式也可以看做是串行。
1.5 其它内容:单核和多核cpu任务分发方式的不同
1.3.1 单核
单核cpu中,任务分发一般是通过时间片轮转的方式进行。时间片轮转是一种调度算法,上文也提到单核cpu通过时间片轮转实现并发。
1.3.2 多核
多核cpu中任务分发的方式更灵活,有以下三种:
静态分发 任务在启动时静态地分配给特定的核心,适用于任务间不存在动态负载变化或依赖关系的情况。
动态负载均衡 任务根据当前系统负载情况动态分发给可用核心,以实现负载均衡和最大化资源利用。
工作窃取 用于多核cpu存在任务队列的情况,核心完成自己的任务后,会从其他核心的任务队列窃取任务来执行,以实现负载均衡和任务的动态平衡。
2 同步和异步
2.1 同步
2.1.1 概念
同步要求任务调用后必须等待调用返回后,才能继续执行之后的内容。
2.1.1 实现方式
同步机制可以通过锁、条件变量、信号量等来实现,以限制对共享资源的访问和确保任务的顺序性。
2.2 异步
2.2.1 概念
异步的概念与同步相对,异步可以不用等待调用返回,直接执行之后的内容
2.2.1 实现方式
在不同的语言中有不同的方式,js中可以用promise、事件监听实现异步,java中可以用thread,golang可以用goroutine
3 并发并行,与同步异步的区别
并发并行是任务执行的描述,关注任务整体上的处理和资源利用;同步异步是编程模型,关注任务调度的方式、任务之间的交互。个人认为,并发并行是更广泛的概念,涵盖了同步异步,我们也常看到有文章讲述如何用同步异步解决并发编程中的问题。
以上均为个人理解,如有错误欢迎在评论区提出