我有一些关于多线程编程和多核使用的问题。
我特别想知道操作系统和/或框架(这是.NET)如何处理频繁使用的核心。
这是我关于线程的问题:
- When a new thread is spawned, what is the algorithm for assigning the thread to a particular core?
- 循环类型的算法
- Random
- 目前最少使用的核心
- 如果不是当前使用最少的核心,那么确定这一点的此类代码是否会使线程的典型使用相形见绌,从而使事情变得更糟?
- 线程在其生命周期内是否从一个核心移至另一个核心?如果是这样,这是否是为了处理由于某种原因“过度使用”的核心,因此操作系统尝试将线程转移到较少使用的核心以帮助系统?如果不是的话,为什么不呢?
我的最后一个问题基本上是上述问题的重用,是关于 .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(使用前将#替换为@)