进程与线程
在过去,每个进程只有一个执行线程,因此进程被直接调度到内核上(在过去,几乎只有一个内核可以调度)。但是,在支持线程的操作系统(几乎都是现代操作系统)中,调度的是线程,而不是进程。因此,在本讨论的其余部分,我们将专门讨论线程,您应该了解每个正在运行的进程都有一个或多个执行线程。
并行性与并发性
当两个线程并行运行时,它们都同时运行。例如,如果我们有两个线程,A和B,那么它们的并行执行将如下所示:
CPU 1:------------------------->
CPU 2: B ------------------------->
当两个线程同时运行时,它们的执行会重叠。重叠可以通过以下两种方式之一发生:线程同时执行(即并行执行,如上所述),或者它们的执行在处理器上交错,如下所示:
CPU 1:A -----------> B ----------> A -----------> B ---------->
因此,就我们的目的而言,并行性可以被视为并发的特例*
调度
但是我们能够生成一个线程池(假设30),其数量大于我们拥有的内核数量(假设4),并让它们并发运行。如果我们只有4个核心,这怎么可能?
在这种情况下,它们可以并发运行,因为 CPU 调度程序为这 30 个线程中的每一个线程提供了一些 CPU 时间份额。某些线程将并行运行(如果您有 4 个内核,则任何时候都会有 4 个线程并行运行),但所有 30 个线程将同时运行。然后,您可以玩游戏或浏览网页的原因是这些新线程被添加到线程池/队列中,并且还获得了一部分CPU时间。
逻辑内核与物理内核
根据我目前的理解,一个核心一次只能执行1个过程。
这并不完全正确。由于非常聪明的硬件设计和流水线,在这里要花很长时间(加上我不理解它),一个物理内核实际上有可能同时执行两个完全不同的执行线程。如果你需要的话,可以稍微咀嚼一下这句话——它仍然让我大吃一惊。
这个惊人的壮举被称为同步多线程(或流行的超线程,尽管这是此类技术的特定实例的专有名称)。因此,我们有物理内核,它们是实际的硬件CPU内核,还有逻辑内核,这是操作系统告诉软件可供使用的核心数量。逻辑内核本质上是一种抽象。在典型的现代英特尔 CPU 中,每个物理内核充当两个逻辑内核。
有人可以解释一下这是如何运作的,并推荐一些好的阅读吗?
如果您真的想了解进程,线程和调度如何协同工作,我会推荐操作系统概念。
- 术语并行和并发的确切含义引起了激烈的争论,即使在我们自己的堆栈溢出中也是如此。这些术语的含义很大程度上取决于应用程序域。