关于并发编程,有一道面试题是这样的
什么是并行?什么是并发?
什么是并行?什么是并发?
通常的解释是这样的:
比如有两个任务:
并行是指两个任务同一时刻在两个cpu上各自执行,他们是时刻并行的。
并发是指,两个任务在一个cpu上交替执行,在一个时间段内,看起来是并行的。支持这样工作的模式,也就是支持并发处理。
并行和并发的区别
相同点:
- 给人的感觉都是同时处理两件事
不同点:
- 并行是真正的同时刻执行。一个cpu处理一个任务,没有上下文切换。
- 并发是调度cpu时间片达到同时执行的感觉,微观层面不是同时执行的。
生活中的例子
这个问题我在路上偶然想到了更具形象的解释。
每个人是一个单独的处理单元,根据上面的解释,可以知道,每个人没有办法做并行的事情,没办法在同一时刻做两件事。但是可以并发做两件事
比如,我在10点05分的时候开始烧水,我在10点06分的时候开始看书,假如10点20分水烧开了,我放下书,去盛水,之后接着看书。
这个场景,看起来,我是一边烧水,一边看书的。同时进行了两件事。
是这样吗?不是,
事实上,这里存在两个处理单元,然后还存在通信。
- 我是一个处理单元
- 电水壶是一个处理单元
gantt
title 看书的同时烧水
dateFormat YYYY-MM-DD HH:mm:ss
section 烧水
给电水壶装水 :a1, 2022-04-09 10:05:00, 40s
烧水 :after a1 , 15m
水开了装水 : 40s
section 看书
看书 :2022-04-09 10:05:40 , 15m
继续看书 : 2022-04-09 10:21:20, 30m
从上面的甘特图可以看出,中间有一段是并行的,就是从2022-04-09 10:05:40到2022-04-09 10:20:40这段时间。
通过这个例子,不知道没理解的小伙伴们,对并行和并发理解了没。
关于标题
程序是可以模拟生活中的很多任务和行为的。
我觉得很有趣。
后面打算写一个系列,主题方向就是将生活中的一些流程抽象成程序。
在这个过程中,我们来探讨是否可以用程序的一些思路去优化,以及如何做到闭环优化,会不会带来新的问题,明确这种优化或者模拟手段的边界,可以解决这个问题到什么程度。