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

2024-06-01

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

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

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

有一些文章说M:N线程模型最好使用N作为CPU核心的数量(here https://en.wikipedia.org/wiki/Fiber_(computer_science)#Advantages_and_disadvantages是一个例子)。这样我们就可以同时实现1:1和N:1线程模型的优点。

我的问题是:

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

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

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

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

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

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

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

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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 线程安全区域设置技术

    我们目前正在编写一个基于线程 python Web 服务器框架 cherrypy 的 Web 应用程序 并希望同时支持来自多个区域设置的用户 区域设置模块似乎不是线程安全的 是否有第三方库或模块以线程安全的方式提供区域设置解析和格式化功能
  • 操作系统如何努力尽量减少 TLB 刷新?

    我想知道操作系统中是否实现了一种通用机制来最小化 TLB 刷新 例如将同一进程中的线程分组到 待调度 列表中 我认为在决定使用进程还是线程时 这是一个重要因素 如果操作系统不关心下一个线程是否在同一个进程空间中 那么所谓的线程 最小化 TL
  • 从代码中覆盖 OMP_NUM_THREADS - 真正的

    到目前为止我能找到的所有答案都建议致电omp set num threads 虽然对于大多数情况来说这是一个正确的答案 但它对我不起作用 在内部 调用omp set num threads导致创建每线程 ICV 或修改 如果当前线程已经有一
  • 制作静态可重入锁

    我前段时间偶然发现了这个线程 使可重入锁静态并使其成为互斥体吗 https stackoverflow com questions 5678741 does making a reentrant lock static and make i
  • 了解 Numpy 中的向量化与通过 Numexpr 进行向量化表达式的多线程处理之间的区别

    我对 NumPy 据说正在向量化其算术数组运算的概念感到有点挣扎 它是否克服了 Python 的 GIL 因为 NumPy 的一部分是用 C 实现的 另外 Numexpr 是如何工作的呢 如果我理解正确的话 它通过优化 JIT 运行代码并启
  • 在这种情况下,线程如何同时获取两个对象的锁?

    public void method Type1 inst1 Type2 inst2 synchronized inst1 synchronized inst2 do something now 从这段代码我可以理解 一旦线程进入该方法 它
  • 在流行的现代操作系统中,线程本地存储是否存在已知的大小限制?

    当我使用thread local Thread local thread or declspec thread 编译器似乎在线程创建时分配一个线程本地存储并将地址存储在fs or gs在 x86 派生系统中注册 在这种情况下 是否存在 线程
  • 在Service中使用Looper和使用单独的线程是一样的吗?

    在此示例中 来自文档 https developer android com guide components services html ExtendingService https developer android com guide
  • Node.js 多线程程序

    我编写了一个 node js 脚本来从交易所获取一些价格 它看起来像这样 async function main async function func var start time performance now for let rout
  • 如何处理 ASP.NET 中未处理的线程异常?

    ASP NET 应用程序应该如何处理非请求后台线程上发生的未处理的异常 由于错误 默认情况下 此类异常会导致进程终止 这在 ASP NET 工作进程的设置中是不可接受的因为并发运行的请求会不可预测地中止 这也是一个性能问题 请求线程上的异常
  • 使用BackgroundWorker更新UI而不冻结...?

    我有以下代码用于从后台线程填充 ListView DoWork 调用 PopulateThread 方法 delegate void PopulateThreadCallBack DoWorkEventArgs e private void
  • Java 中的“实现 Runnable”与“扩展线程”

    从我什么时候开始使用线程Java 我找到了这两种编写线程的方法 With 实施Runnable public class MyRunnable implements Runnable public void run Code Started
  • 使用 Rcpp 和 OpenMP 在 R 中实现多线程和 SIMD 矢量化 Mandelbrot

    As an OpenMP Rcpp性能测试 我想检查使用最直接和最简单的方法在 R 中计算 Mandelbrot 集的速度有多快Rcpp OpenMP执行 目前我所做的是 include
  • 广播接收器和处理程序哪个更有效?

    我知道广播接收器的onReceive 和Handler的handleMessage 运行在同一个UI线程上 假设我想在同一个应用程序 进程 内的两个服务之间进行通信 我可以扩展广播接收器类并注册事件 OR 一个 Handler 然后将其实例
  • 快速变化的集合 MVVM WPF - 高 CPU 使用率和 UI 几乎冻结

    我正在开发一个带有数据网格的应用程序 它显示某些正在运行的 Windows 进程 在我的示例 Chrome 进程中 当选中复选框时 数据网格会加载进程 要求 显示每个进程的名称 内存使用情况 私有工作集 的 实时 信息 就像在 Window
  • Flask 从线程中删除会话变量

    我尝试实施投票系统 它的工作原理是这样的 如果用户对帖子进行投票 我会在会话变量中记录其临时状态 已投票 已加星标等 如果当前用户在我将结果保存到临时表之前尚未投票 用户可以在 5 分钟内更改投票 5 分钟后 结果将使用线程永久写入数据库
  • 多个用户级线程堆栈的内存

    我想了解用户级线程堆栈的内存如何保存在内存中 我认为所有堆栈都会从页面边界开始 我是对的吗 用户级线程库如何确保某个线程的堆栈不会增长并与其他线程的连续页面边界堆栈重叠 因为所有堆栈页面都是连续的 如果您坚持使用连续的堆栈 那么是的 为单独
  • 托管线程多久切换一次操作系统线程?

    据我所知 托管线程不能保证在同一操作系统线程上运行 如果 CLR 可以在操作系统线程之间切换托管线程 这种情况发生的频率是多少 频率受什么影响 我有一个单独的问题 https stackoverflow com questions 1979
  • 为什么下面代码的输出是Thread[main,5,main]

    public class test1 public static void main String args TODO Auto generated method stub Thread t Thread currentThread Sys
  • 如何正确使用 std::condition_variable?

    我很困惑conditions variables以及如何 安全 使用它们 在我的应用程序中 我有一个创建 gui 线程的类 但是当 gui 是由 gui 线程构造时 主线程需要等待 情况与下面的函数相同 主线程创建互斥体 锁和conditi

随机推荐