我对多线程编程和多核用法有一些疑问。

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

这是我关于线程的问题:

  • 产生新线程时,将线程分配给特定内核的算法是什么?
  • 算法的循环类型
  • 随机
  • 当前最少使用的核心
  • 如果不是当前使用最少的内核,那么这种决定了线程的典型用法的代码类型将使这个问题相形见and,从而使情况变得更糟吗?
  • 线程在生命周期中是否从一个核心移动到另一个核心?如果是这样,这是否可以处理由于某种原因而被“过度使用”的内核,从而操作系统尝试将线程改组为使用较少的内核以帮助系统?如果不是,又为什么呢?

  • 我的最后一个问题,基本上是上述内容的重用,是关于.NET ThreadPool类的,该类处理.BeginInvoke之类的东西。这个类(class)有没有做这些东西?如果不是,为什么不呢?

    有什么办法可以调整这种处理方式,在操作系统中暗示该特定线程,在为它分配内核时,请多加注意,因为我知道它将使用大量的cpu。那有道理吗?还是“很多cpu”只是相对的,因此还不够好?

    最佳答案



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

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

    当然,由于现代操作系统(例如Windows)很复杂,因此还有很多其他功能。有时会对某些进程给予优先处理,但是根据经验,Windows将始终选择高优先级的进程(这就是为什么您可以通过在单核时代将进程“实时”赋予优先级来卡住计算机的原因)

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

    但是,您能做的最好的事情通常是假设操作系统将制定出合理的方案,然后尝试与系统的其余部分配合使用。 (当您无事可做时,将Yield/block/sleep,允许其他线程运行)。



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



    这就是线程/进程优先级的目的。如果您的线程必须占用大量CPU时间,即使有其他占用大量CPU的线程正在运行,请提高该线程的优先级。
    但是要小心。通常,没有多少CPU密集型线程在运行,这意味着即使以普通优先级运行,您也将获得99.9%的CPU时间。就像我说的那样,Windows会非常积极地调度优先级更高的线程,因此只有在您确实需要时才提高优先级。

    关于.net - 多核用法,线程,线程池,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/396137/

    10-12 12:53
    查看更多