并发、并行、串行、同步、异步的概念和关系

因对于并发、并行、串行、同步、异步概念上的划分,以及它们之间的关系有些模糊,故记录下这篇文章,方便以后查阅。本文还涉及到这些内容在编程上的延伸。

1 并发和并行、串行

1.1 并发

1.1.1 概念

并发表示多个任务在同一时间段内处理,微观上不是同时发生,而宏观上是同时发生。

那么宏观上的同时发生,是如何实现的?

1.1.2 并发实现

在单核下,可以利用时间片轮转来模拟并发(不是真正意义上同时执行多项任务),cpu给不同的任务分配时间片,cpu在时间片内的时间里处理任务,结束后再处理下一个任务,如下图所示。
image.png
因为时间片小,cpu会在多个任务间来回切换处理,所以在宏观上是同时发生的。

1.2 并行

1.2.1 概念

并行表示多个任务在同一时间点上处理,在微观和宏观上都是同时发生,它关注的是执行效率和性能。

1.2.2 并行的实现

并行的实现一定需要硬件层面的支持,只有多核才能实现并行,如下图所示。

image.png

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 并发并行,与同步异步的区别

并发并行是任务执行的描述,关注任务整体上的处理和资源利用;同步异步是编程模型,关注任务调度的方式、任务之间的交互。个人认为,并发并行是更广泛的概念,涵盖了同步异步,我们也常看到有文章讲述如何用同步异步解决并发编程中的问题。

以上均为个人理解,如有错误欢迎在评论区提出

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值