多核使用、线程、线程池

2023-11-26

我有一些关于多线程编程和多核使用的问题。

我特别想知道操作系统和/或框架(这是.NET)如何处理频繁使用的核心。

这是我关于线程的问题:

  • When a new thread is spawned, what is the algorithm for assigning the thread to a particular core?
    1. 循环类型的算法
    2. Random
    3. 目前最少使用的核心
  • 如果不是当前使用最少的核心,那么确定这一点的此类代码是否会使线程的典型使用相形见绌,从而使事情变得更糟?
  • 线程在其生命周期内是否从一个核心移至另一个核心?如果是这样,这是否是为了处理由于某种原因“过度使用”的核心,因此操作系统尝试将线程转移到较少使用的核心以帮助系统?如果不是的话,为什么不呢?

我的最后一个问题基本上是上述问题的重用,是关于 .NET ThreadPool 类的,它处理 .BeginInvoke 等内容。这个类有做这些事情吗?如果没有,为什么不或者应该这样做?

有没有什么方法可以调整这种处理,向操作系统暗示这个特定的线程,请在为其分配核心时多加注意,因为我知道它将使用大量的CPU。这有意义吗?或者“大量CPU”只是相对的,因此还不够好?


当一个新线程产生时,什么是 分配线程的算法 到特定的核心?

这完全取决于操作系统。答案通常是经过大量修改的循环方案。每x毫秒,一个核心被中断,并在其上放置一个新线程(因此不存在“最少使用的核心”。只要有线程准备运行,每个核心都会有事情要做)。

在Windows中,我相信优先级最高的线程/进程是always选择执行。 (因此,如果您有一个进程在单核系统上以高优先级运行,则该进程可能会在 100% 的时间内运行,从而导致其他所有进程都处于饥饿状态。当然,这仅适用于该进程从不阻塞的情况,而这在现实世界。

当然,由于 Windows 等现代操作系统很复杂,因此还有更多内容。某些进程有时会受到优先对待,但根据经验,Windows 总是会选择高优先级进程(这就是为什么在单核时代给进程“实时”优先级时,您几乎可以冻结计算机)

在 Linux 下,低优先级的进程也会被定期调度,只是频率不那么高。

但你能做的最好的事情通常就是假设操作系统会制定出一个公平的方案,然后尝试与系统的其余部分很好地合作。 (无事可做时屈服/阻塞/睡眠,允许其他线程运行)。

线程是否从一个核心移至 他们一生中的另一个?

当然。想象一下,您在双核系统上运行三个线程。向我展示一个公平的时间表,不涉及定期在核心之间移动线程。

我的最后一个问题基本上是 重用上述内容,是关于 .NET ThreadPool 类,它处理 诸如 .BeginInvoke 之类的东西。 这个类有做这些事情吗? 如果没有,为什么不或者应该这样做? 什么东西?线程调度和选择要运行的核心?不,线程池只是一种为多个任务重用线程的机制,而不必为每个任务创建一个新线程,然后再将其关闭。

有什么办法可以调整这个 处理,有点暗示 这个特定的操作系统 线

这就是线程/进程优先级的用途。如果您有一个线程必须获得大量 CPU 时间,即使有其他 CPU 密集型线程正在运行,也请提高该线程的优先级。 但要小心处理。通常,运行的 CPU 密集型线程并不多,这意味着即使在正常优先级下,您也将获得 99.9% 的 CPU 时间。正如我所说,Windows 会非常积极地调度优先级较高的线程,因此只有在以下情况下才提高优先级:really说真的。

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

多核使用、线程、线程池 的相关文章

  • 如何编写基于线程的并行列表迭代?

    我需要一个如何使用 ocaml 线程编写并行 iter 函数的示例 我的第一个想法是有一个与此类似的函数 let procs 4 let rec part part i lst match lst with gt hd tl gt let
  • WPF 绑定无法与 int 类型的属性正常工作

    我拥有以下财产int输入我的视图模型 该模型绑定到TextBox 一切正常 TwoWay绑定工作正常 除了一种情况 如果我清除的值TextBox 属性设置器不会被调用 尽管值已被清除TextBox 属性仍保持先前的值 有人遇到过类似的问题吗
  • 来自网站但不来自控制台应用程序的 Web 服务调用中出现 EndpointNotFoundException

    我明白了EndpointNotFoundException在来自网站的 Web 服务调用上 而如果我从控制台应用程序执行此操作 则同样的调用也有效 以下是更详细的异常消息 Could not connect to https TCP err
  • Web API 帮助页面显示每个方法的两个版本

    如何避免帮助页面显示我的方法的两个版本 正如你所看到的 我已经设置了一条自定义路线 api property search finnId 但我不希望使用查询参数的那个出现在 帮助 页面中 有办法解决这个问题吗 我正在使用 ASP NET F
  • 寻找系统、全面、完整的VB.NET和C#语法比较

    我是一名经验丰富的 VB NET 开发人员 想从 C 开始 我正在寻找两种语言语法之间基于网络的比较作为快速参考 我发现自己正在整理 VB NET 语法模板 例如 Public MustInherit Class BaseClass Pub
  • 排除以特定字符开头的正则表达式匹配

    我有以下内容 Regex urlRx new Regex https ftp file www A Za z0 9 A Za z0 9 RegexOptions IgnoreCase 这匹配所有 URL 但我想排除那些以字符开头的 URL
  • 如何将对象转换为元组?

    我创建元组并将其添加到组合框中 comboBox1 Items Add new Tuple
  • 查询限制与返回类不同的类

    对于我当前的项目 我正在学习 NHibernate 但在翻译以下查询时遇到问题 select person Firstname person Lastname from Person inner join Contract on contr
  • 为什么 BLToolkit 没有更流行? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 新的 SDK 项目在 Visual Studio 中缺少“启动外部命令”

    旧的 NET 项目在调试下有一个选项 允许 启动外部命令 如图所示 当我使用新的SDK样式创建新项目时 我看不到相同的选项 如下图 有办法拿回来吗 两张图片均取自同一个 VS 因此与版本无关 我发现的解决方法是正常运行程序并附加到它 但这并
  • VBScript 线程

    不久前 我在 vbscript 中将这段多线程代码拼凑在一起 然后我再次将其取出以将其应用于另一个问题 我现在遇到一个问题 运行命令 第 20 行 的返回值始终为 0 我意识到我已经使用了False作为 WaitOnReturn 参数 但否
  • .NET 服务是否表现出线程敏捷性?

    与以下问题相关this https stackoverflow com questions 657735 how is asp net multithreaded and this https stackoverflow com quest
  • Web API 请求上的滑动会话

    UPDATE 看起来它正在尝试写入新的 cookie 标头ApplyResponseGrantAsync但不能因为它是抛出标头已发送的异常 UPDATE 更清楚 我如何获得Set Cookie在 Web API 请求期间添加到 XHR 响应
  • 并行执行按位运算的代码

    我有这段代码 通过将该 AU 矩阵的每个字节 8 个元素打包到 A 中来减少内存消耗 从而使 100k 200k 矩阵占用更少的空间 正如您所期望的 这段代码需要永远运行 我也计划将行数增加到 200k 我正在一个非常强大的实例 CPU 和
  • 您使用什么工具和技术来查找死代码? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 您使用哪些工具和技术来查找 NET 中的死代码 过去 我用 Obsolete 属性修饰方法 传递 tr
  • VS2010中VSHost.exe不断启动

    我正在 VS2010 中使用一个包含大量项目的解决方案 但它不断变得无响应 我注意到的一件事可能是一条线索 尽管我尚未开始任何调试 但 MyApplicationName vshost exe 不断出现在进程列表中 也许每当构建发生时它就会
  • 持续运行的 C# 代码 - 服务还是单独的线程?

    我有一个 NET 4 Web 应用程序 它有 3 个关联的独立项目 DAL BAL 和 UI 我正在使用实体框架进行数据库交互 我有代码循环遍历一堆数据库数据 根据找到的内容调用方法 然后更新数据库 我希望这段代码一直运行 同时 我希望用户
  • 从不同的线程访问对象

    我有一个服务器类 它基本上等待来自客户端的连接 在该类中 我创建了一个 NetworkStream 对象 以便能够从客户端接收字节 由于 NetworkStream Read 方法不是异步的 这意味着它将等到从客户端读取字节才能继续执行类似
  • 通过 GroupPrincipal 查找用户

    在我的 Active Directory my domain 中 我有许多组 UserGrp1 UserGrp2 等 其中有许多用户 一个用户可以存在于多个组中 我目前的代码允许我使用 GroupPrincipal 类来查找组 然后从那里获
  • 为什么要关闭 System.Diagnostics 跟踪自动刷新?

    在我所有的应用程序中 我总是设置

随机推荐