多核和多CPU,是两种不同的处理架构:
image.png

对于多核心的架构,由于共用一套MMU和cache(这里可以先持保留意见),地址空间只能是一个,同一时刻只能运行一个进程,此时进程不能并行只能并发。同一个进程下的多线程可以并发执行,因为多线程共享同一套进程空间资源。

下面我们来说说并发和并行的概念:

  • 并发指的是程序的结构
  • 并行指的是程序运行时的状态

    并行(parallelism)

    这个概念很好理解,所谓并行,就是同时执行的意思,无需过多解读。判断程序是否处于并行状态,就看同一时刻是否超过一个“工作单位”在运行就好了。所以,单线程用于无法达到并行状态。

要达到并行状态,最简单的就是多线程和多进程,python(我也不懂这门语言)的多线程由于存在著名的GLI, 无法让两个线程真正”同时运行“, 所以实际上无法到达并行状态的。

并发(concurrency)

要理解“并发”的概念,必须得清楚,并发指的是程序的结构。当我们说这个程序是并发的,实际上,这句话应当表述成“这个程序采用了支持并发的设计”。既然并发指的是人为设计的结构,那么怎么样的程序结构才叫支持并发的设计?

正确并发设计的标准是:使多个操作可以在重叠的时间段内进行(two tasks can start, run, and complete in overlapping time periods)。

操作的执行是在重叠的时间段内进行,它是否就是我们前面说到的并行呢?是不是呢?(把我整懵了)。并行,当然是在重叠的时间段内执行。但是另外一种执行模式,也属于在重叠的时间段内进行,这就是协程。使用协程时,程序的执行看起来往往是这个样子的:
image.png
task1,task2是两段不同的代码,比如两个函数,其中黑色块代码正在执行。注意,这里从始至终,在任何一个时间点上都只有一段代码在执行,但是,由于task1和task2在重叠的时间段内执行,所以这是一个支持并发的设计。与并行不同,单核单线程能支持并发。

并发设计让并发执行成为可能,而并行是并发执行的一种模式(懵逼)。

参考

还在疑惑并发和并行?
多核CPU 是否能同时执行多个进程?
多核 CPU 和多个 CPU 有何区别?( 芯片上是怎么实现多核和多CPU的)
多核MMU和ASID管理逻辑