使用比 CPU 更多的软件线程 = 超额订阅?

Using more software threads than CPUs = oversubscribing?

lscpu的输出给出(包括部分输出):

CPU(s):                12
On-line CPU(s) list:   0-11
Thread(s) per core:    1
Core(s) per socket:    6
Socket(s):             2
NUMA node(s):          2

我只是想确认我的理解是正确的:

(1) 我有 12 个 CPU(s)/核心。这个数字也是我拥有的硬件线程数。

(2) 如果 (1) 为真,并且,比方说,我 运行 一个使用超过 12 个软件线程的代码,这将导致超额订阅。假设我使用 13 个软件线程,这是否意味着保证我的软件线程中的 1 个不能 运行 与其他 12 个并发?

我认为术语有些混乱。我认为您的意思是并行性,因为并发性不是并行性(它是一个更广泛的概念),这意味着多任务处理,系统可以同时执行多个任务。这可以通过纯并行、抢占式多任务或协作式多任务来实现,但它们都只是并发的形式。从逻辑上讲,多线程执行可以表示为具有任意顺序的细粒度活动的单线程序列,无论我们在单个内核或单个线程中执行所有任务,这仍然会带来并发问题。因此,您系统上所有 13 个线程或更多线程具有 12 个硬件线程将 运行 并发,但只有 12 个将 运行 并行。

附带说明一下,硬件线程或逻辑 CPU 不是逻辑软件线程,而是 CPU 核心可以通过 Hyper-Threading 同时执行的执行流数量,所以它们还提供并行性,但有一些限制(在您的情况下,每个核心都有单个逻辑 CPU,因此没有超线程)。