有趣的多线程之并行和并发

168 阅读2分钟

关于并发编程,有一道面试题是这样的

什么是并行?什么是并发?

什么是并行?什么是并发?

通常的解释是这样的:

比如有两个任务:

并行是指两个任务同一时刻在两个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这段时间。

通过这个例子,不知道没理解的小伙伴们,对并行和并发理解了没。

关于标题

程序是可以模拟生活中的很多任务和行为的。

我觉得很有趣。

后面打算写一个系列,主题方向就是将生活中的一些流程抽象成程序。

在这个过程中,我们来探讨是否可以用程序的一些思路去优化,以及如何做到闭环优化,会不会带来新的问题,明确这种优化或者模拟手段的边界,可以解决这个问题到什么程度。

参考