M:N线程模型真的利用了CPU核心吗?

YAY*_*est 5 multithreading multicore

有多种线程模型可用于在应用程序中调度线程:

  • 1:1(内核级线程):用户创建的每个线程都映射到内核中的调度线程。
  • N:1(用户级线程):用户在单个应用程序中创建的所有线程实际上都映射到单个调度的内核线程。
  • M:N(混合线程):用户在应用程序中创建的 M 个线程映射到 N 个内核线程。

用户级线程被认为比内核级线程更快,因为内核级的上下文切换比用户级的上下文切换更昂贵。用户级线程的一大缺点是它们不利用多处理器系统,因为它们只使用一个内核级线程。

有一些文章说M:N线程模型最好使用N作为CPU核心的数量(这里有一个例子)。这样我们就可以同时实现1:1和N:1线程模型的优点。

我的问题是:

  1. 当我们使用内核级线程时,我们还会在执行期间获得“额外”时间片(与用户级线程相反),所以这不是弥补了缓慢的上下文切换吗?
  2. 为什么 CPU 核心的数量在这里也很重要?据我了解,CPU 核心的数量在这里是相当透明的,因为即使我们使用确切数量的内核线程,也无法保证它们确实同时执行,因为其他核心可以执行其他进程中的其他线程,并且“我们的” ' 之后线程可能仍会使用上下文切换。因此,无论我们有多少个 CPU 核心,他们都会使用上下文切换。我这里错了吗?

Soo*_*nts 1

用户级线程被认为比内核级线程更快

两者都可以更快,具体取决于工作负载、操作系统、硬件和绿色线程实现。

这不是弥补了缓慢的上下文切换吗?

有时。通常不会。内核线程有一个堆栈,当您有数千个堆栈时,它们会消耗千兆字节的 RAM,并且当它们进行上下文切换时,您肯定会有大量缓存未命中。假设您的工作负载 IO 很重并且上下文切换频繁。

为什么 CPU 核心的数量在这里也很重要?

无关紧要。您应该使用硬件线程数,许多现代 CPU 每个核心有 2 个硬件线程。

其他核心可以执行其他进程的其他线程

如果它们花费相当长的时间,则意味着您有 2 个进程正在加载系统。在这种情况下,更好的方法可能是使用 50% 的硬件线程。当人们设计需要资源的软件时,他们通常认为这将是计算机的主要工作负载。

由于上下文切换,创建新的内核级线程(在具有单个硬件线程的系统上)通常不会给我额外的 CPU 时间

如果还有其他进程也需要 100% CPU,那么使用 2 个线程您确实会获得额外的 CPU 时间。但这是罕见的边缘情况,由于系统无响应,用户会点击重置按钮。一般来说,除非涉及阻塞 IO 或安全性,否则创建比硬件线程更多的内核线程没有什么意义。