【问题标题】:Multi-core usage, threads, thread-pools多核使用、线程、线程池
【发布时间】:2008-12-28 12:36:52
【问题描述】:

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

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

这是我关于线程的问题:

  • 当产生一个新线程时,将线程分配给特定内核的算法是什么?
    1. 循环型算法
    2. 随机
    3. 目前使用最少的内核
  • 如果不是当前使用最少的内核,那么确定这种类型的代码是否会使线程的典型使用相形见绌,从而使事情变得更糟?
  • 线程是否在其生命周期内从一个内核移动到另一个内核?如果是这样,这是为了处理由于某种原因被“过度使用”的内核,因此操作系统会尝试将线程转移到使用较少的内核以帮助系统?如果没有,为什么不呢?

我的最后一个问题,基本上是对上述内容的重用,是关于 .NET ThreadPool 类的,它处理诸如 .BeginInvoke 之类的事情。这门课做这些事情吗?如果不是,为什么不呢,还是应该这样做?

有什么办法可以调整这种处理方式,在操作系统中暗示这个特定线程,当你给它分配一个核心时请多加注意,因为我知道它会使用很多 cpu。这有意义吗?或者“很多 cpu”只是相对的,因此还不够好?

【问题讨论】:

    标签: .net multithreading multicore


    【解决方案1】:

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

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

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

    当然,因为像 Windows 这样的现代操作系统很复杂,所以它还有很多其他功能。某些进程有时会得到优先处理,但根据经验,Windows 总是会选择高优先级进程(这就是为什么你可以通过在单核时代给予进程“实时”优先级来几乎冻结你的计算机)

    在 Linux 下,优先级较低的进程也会定期安排,只是不那么频繁。

    但您能做的最好的通常是假设操作系统会制定一个公平的方案,然后尝试与系统的其余部分配合使用。 (无事可做时yield/block/sleep,让其他线程运行)。

    线程是否从一个核心移动到 在他们的一生中还有另一个?

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

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

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

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

    【讨论】:

    • 据我了解,Windows 使用降级的抢占式优先级驱动调度程序;高优先级线程会暂时降级,以防止它们完全饿死低优先级线程。
    • 此外,Window 的调度程序似乎做得更好,可以防止相同优先级的线程被相同优先级的其他线程饿死。
    • @Software Monkey - 我相信情况正好相反。 Windows 将增加被饿死的线程。我相信 Linux 采用了您描述的方法。
    【解决方案2】:

    除了 jalf 出色而全面的回答之外,请记住,“并行扩展”(应该被纳入 .NET 4.0)有一个很多专门用于分配工作的代码(来自队列)均匀地分配到内核,包括窃取工作,以及潜在的掘金,例如关心哪个内核“最接近”工作所在的内存。

    因此,使用 .NET 4.0,使用 Parallel.For 之类的东西,您应该可以免费获得很多。总的来说,操作系统足够聪明,在外人看来它正常工作。 jalf 提供了很多关于幕后发生的事情的详细信息,但是大多数在大多数情况下,您不需要这种级别的详细信息,除非您正在使用高度线程化的代码解决一些性能问题。

    【讨论】:

    • 我知道,但 4.0 还没有出现在我们的视野中几年,客户转换、计划升级等需要时间,所以我们不能在它发布时跳槽。 PFX 是否也会在 3.5 版本中发布?
    • 嗯,CTP 可用,这表明它可以针对 CLR 2.0 工作。但我根本不知道。
    猜你喜欢
    • 2023-03-12
    • 1970-01-01
    • 2011-09-23
    • 2011-07-14
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 2018-10-02
    • 2022-11-02
    相关资源
    最近更新 更多