多核使用、线程、线程池

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(使用前将#替换为@)

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

  • 在非 UI 线程上运行 RIA 服务

    我正在尝试从非 UI 线程进行 RIA 服务调用 我通过打开新线程和后台工作人员进行了调用 但对于这两种情况 回调都在 UI 线程上运行 是否可以在调用者线程而不是 UI 上执行回调 Thanks tl dr Use WCF 自行将结果编组
  • 向 .NET 隔离的 Azure 函数添加运行状况检查

    我找不到任何资源来将运行状况检查添加到在 NET 5 0 隔离中运行的 HTTPTrigger 功能应用程序 static async Task Main var host new HostBuilder ConfigureAppConfi
  • 保存带有文本或图像的原始剪贴板,并稍后在 C# 中恢复它

    我正在尝试创建一个 C WinForms 剪贴板管理器 如果它包含图像或文本 不是文件 流或其他花哨的东西 它可以记住最后 X 个剪贴板条目 然后我希望稍后能够恢复剪贴板 以便我可以粘贴原始文本或图像 我的问题是 即使我将剪贴板复制为IDa
  • SQLite 更新很多行非常慢

    我相信我已经使用了很多方法来加速许多行的更新 但到目前为止没有任何帮助 我们正在开立交易 像这样 private SQLiteTransaction BeginTransaction SQLiteConnection connection
  • 没有 ASP.NET/IIS 的 .NET Web 服务?

    我正在实现一个需要公开 Web 服务接口的服务器组件 但应用程序不需要它在 IIS 上与 ASP NET 一起运行 有没有一种直接的方法可以在不使用 ASP NET IIS 的情况下在 NET 中实现 Web 服务 我使用的是 NET 3
  • rusage 进程/线程的 Cpu 时间不可能

    我正在计算进程 线程正在使用的 cpu 时间之间的增量 以及某个函数的调用之间的增量 我得到了进程 cpu 时间不可能的值 有时下一次调用会返回较小的 cpu 时间 这是不可能的 这是我用来计算CPU时间的代码 u64 CpuTime ca
  • 使用 Trace 和 TraceSource 之间的区别

    任何人都知道之间的区别System Diagnostic Trace and System Diagnostic TraceSource课程 我在我的大部分项目中都使用了 Trace 我只是碰巧发现了TraceSource另一天 他们似乎提
  • NotSupportedException:LINQ to Entities 无法识别该方法[重复]

    这个问题在这里已经有答案了 我正在尝试使此查询与 EF 一起使用 但它抛出异常 var c ac Communities OrderBy o gt o Posts Count Skip page limit Take limit Selec
  • 如何在 linq to sql 中批量插入/更新?

    我该如何做这两种情况 目前我正在做这样的事情 public class Repository private LinqtoSqlContext dbcontext new LinqtoSqlContext public void Updat
  • 使用 pythonw.exe 时 Python subprocess.call() 失败

    我有一些 Python 代码 当我使用 python exe 运行时可以正常工作 但如果我使用 pythonw exe 则失败 def runStuff commandLine outputFileName somefile txt out
  • .NET Winform 键盘控件

    有没有winform键盘控件 我正在寻找一个可以拖放的控件 这是针对具有触摸屏功能的仓库应用程序 如餐厅应用程序中的应用程序 这是一篇 CodeProject 文章 详细介绍了如何创建触摸屏键盘 触摸屏键盘 http www codepro
  • 获取 UWP 应用中当前登录用户的用户名/用户 ID

    我想要得到username或用户idUWP 应用中当前登录的用户的信息 下面是我正在使用但它返回的代码null var current users Where p gt p AuthenticationStatus UserAuthenti
  • 什么样的应用程序需要多线程?

    什么是一些具体的例子需要或不需要多线程的应用程序 但这样会更好吗 如果答案以每个帖子一个申请的形式最好 这样最适用的就会浮到顶部 没有硬性且快速的答案 但大多数时候 您不会看到工作流程 计算是连续的系统有任何优势 然而 如果问题可以分解为可
  • 如何一次运行多个后台线程任务?

    我正在尝试循环遍历包含 2016 年 10 月日期的 String 对象数组 这意味着 31 个 String 对象 2016 年 10 月 1 日 2016 年 10 月 31 日 对于每个对象 我想从数据库检索一些数据并附加返回值 也是
  • System.Drawing.dll / NumericUpDown 的 .NET 访问冲突异常

    我遇到了一个非常愚蠢的问题 我已经尝试完全重新安装 NET 但它没有解决问题 我什至无法通过谷歌搜索找到其他有同样问题的人 就在我的计算机上 如果我将 NumericUpDown 控件添加到 NET 项目中的窗体并运行该应用程序 则在运行该
  • JPG、DOC、PDF 等文件是否也编译成程序集?

    Q1 Does aspnet compiler exe将网站目录中包含的所有文件 甚至 JPG DOC 和 PDF 类型 编译成程序集 如果将图像添加到Web项目中的文件列表中 从而将它们添加到项目文件中 这些图像也会被VS编译成程序集吗
  • Java 同步计数器 - get() 怎么样?

    众所周知这么简单x 不是原子操作 实际上是读 增量 写操作 这就是为什么它应该同步 但是关于get 我读过它也应该同步 但有人能解释一下为什么吗 通过引入来避免内存一致性错误happens before关系 当出现以下情况时该怎么办get
  • 底层连接已关闭:接收时发生意外错误

    我来这里是因为我在通过 ftp 协议下载一些文件时遇到问题 这很奇怪 因为它偶尔会发生 甚至对于同一个文件也是如此 只是一个精确度 我正在下载非常大的文件 从 500 Mo 到 30Go 以下是我的函数返回的异常类型 抱歉 这是法语 Sys
  • WCF Xml 与二进制序列化的优缺点

    我知道如果我将二进制序列化与 WCF 一起使用 我就会失去互操作性 如果我愿意接受这一点 我想知道使用二进制比 Xml 是否有效率优势 如果还有我上面没有提到的其他优点和缺点 是的 可能是一个大事件 XML 序列化数据比二进制数据要大 使用
  • GetReferencedAssemblies 不返回所有程序集

    我在表单中有以下代码 并试图找到一种方法来加载由名为的表单引用的项目程序集DataObjects 使用以下代码 我只列出了六个程序集 查看表单所在项目的引用 有十三个程序集引用 这里有什么问题吗 private void ListRefer

随机推荐