进程与线程
在过去,每个进程都有一个精确的thread执行,因此进程直接调度到核心上(在过去,几乎只有一个核心可以调度到)。然而,在支持线程的操作系统(几乎所有现代操作系统)中,它是threads,而不是计划的进程。因此,在本次讨论的其余部分中,我们将专门讨论线程,您应该了解每个正在运行的进程都有一个或多个执行线程。
并行与并发
当两个线程同时运行时parallel,他们都在跑步同时。例如,如果我们有两个线程 A 和 B,那么它们的并行执行将如下所示:
CPU 1:A ------------------------->
CPU 2:B -------------------------->
当两个线程同时运行时同时,他们的执行overlaps。重叠可以通过以下两种方式之一发生:线程同时执行(即并行执行,如上所述),或者它们的执行在处理器上交错执行,如下所示:
CPU 1:A ----------> B ----------> A -----------> B -------- -->
So, 为了我们的目的,并行性可以被认为是并发性的一个特例*
调度
但是我们能够生成一个数量大于我们拥有的核心数量(假设为 4)的线程池(假设为 30),并让它们同时运行。如果我们只有 4 个核心,这怎么可能?
在这种情况下,它们可以同时运行,因为 CPU 调度程序为这 30 个线程中的每一个分配了一定的 CPU 时间份额。一些话题will并行运行(如果有 4 个核心,则任意时刻有 4 个线程并行运行),但所有 30 个线程将同时运行。然后你可以去玩游戏或浏览网页的原因是这些新线程被添加到线程池/队列中,并获得一定的 CPU 时间。
逻辑核心与物理核心
根据我目前的理解,一个核心一次只能执行1个进程
这不是quite真的。由于非常巧妙的硬件设计和流水线,在这里讨论的时间太长(加上我不明白),一个物理核心实际上可能正在执行两个完全不同的线程同时执行。如果需要的话,请稍微咀嚼一下这句话——它仍然让我震惊。
这一惊人的壮举被称为同步多线程(或流行的超线程,尽管这是此类技术的特定实例的专有名称)。因此,我们有物理核心,它们是实际的硬件 CPU 内核,以及逻辑核心,这是操作系统告知软件可供使用的核心数量。逻辑核心本质上是一种抽象。在典型的现代 Intel CPU 中,每个物理核心充当两个逻辑核心。
有人可以解释一下这是如何工作的,并推荐一些关于这方面的好读物吗?
我会推荐操作系统概念如果您确实想了解进程、线程和调度如何协同工作。
- 术语的准确含义parallel and 同时都引起了激烈的争论,甚至在我们自己的堆栈溢出中 https://stackoverflow.com/questions/1050222/concurrency-vs-parallelism-what-is-the-difference。这些术语的含义在很大程度上取决于应用领域。