我对多线程编程和多核用法有一些疑问。
我特别想知道操作系统和/或框架(这是.NET)如何处理频繁使用的内核。
这是我关于线程的问题:
我的最后一个问题,基本上是上述内容的重用,是关于.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/