进程与线程
在过去,每个进程只有一个执行线程,因此进程被直接调度到核心上(而在过去,几乎只有一个核心可以调度)。然而,在支持线程的操作系统(几乎所有现代操作系统)中,它是线程,而不是调度的进程。因此,在接下来的讨论中,我们将专门讨论线程,您应该了解每个正在运行的进程都有一个或多个执行线程。
并行与并发
当两个线程并行运行时,它们都同时运行。例如,如果我们有两个线程,A 和 B,那么它们的并行执行将如下所示:
CPU 1:A ------------->
CPU 2:B ------------->
当两个线程同时运行时,它们的执行重叠。重叠可以通过以下两种方式之一发生:线程同时执行(即并行,如上所述),或者它们的执行在处理器上交错,如下所示:
CPU 1: A -----------> B ----------> A -----------> B ----- ----->
因此,出于我们的目的,可以将并行性视为并发的一种特殊情况*
调度
但是我们能够生成一个线程池(比如说 30 个),其数量大于我们拥有的内核数量(比如说 4 个)并让它们同时运行。如果我们只有 4 个核心,这怎么可能?
在这种情况下,它们可以并发运行,因为 CPU 调度程序为这 30 个线程中的每一个线程分配了一些 CPU 时间。一些线程将并行运行(如果您有 4 个内核,那么任何时候都有 4 个线程并行运行),但所有 30 个线程将同时运行。然后您可以去玩游戏或浏览网页的原因是这些新线程被添加到线程池/队列中,并且还分配了 CPU 时间。
逻辑与物理内核
根据我目前的理解,一个核心一次只能执行一个进程
这不是相当正确的。由于非常巧妙的硬件设计和流水线处理时间太长而无法进入这里(另外我不明白),一个物理内核可能实际上正在执行 两个完全不同的执行线程同时。如果需要,请仔细阅读这句话——它仍然让我大吃一惊。
这个惊人的壮举被称为同时多线程(或流行的超线程,尽管这是此类技术特定实例的专有名称)。因此,我们有 物理内核,这是实际的硬件 CPU 内核,以及 逻辑内核,这是操作系统告诉软件可用的内核数量。逻辑核心本质上是一种抽象。在典型的现代 Intel CPU 中,每个物理内核充当两个逻辑内核。
有人可以解释它是如何工作的,并推荐一些关于这个的好读物吗?
如果您真的想了解进程、线程和调度如何协同工作,我会推荐操作系统概念。