我指的是 Windows 10 操作系统,但我相信答案可能与操作系统无关。
在 Windows 上,实时优先级是最高优先级,例如用于处理键盘和鼠标输入。
根据我在网上读到的内容:
将 CPU 密集型进程设置为实时意味着键盘和鼠标将变得无响应,因为操作系统没有足够的 CPU 时间来处理这些输入。
基本上,设置为实时优先级的进程将执行而不会将 CPU 交给任何其他进程,甚至任务管理器也不会。如果出现问题,您将无法停止它。
例如,请参阅微软的这篇帖子:当你将 100% CPU 程序设置为实时优先级时,你就会得到你想要的结果。
问题:
所以这一切都让我不敢在我的机器上测试这种优先级,这就是我问这个问题而不是自己尝试的原因。此外,理论上的答案似乎比用玩具脚本尝试更能证明未来。
如果我运行具有实时优先级的单线程进程,我知道它将一直执行,直到完成为止。但如果我有第二个核心,我是否能够在该进程运行时借助第二个核心使用我的电脑?
如果是的话,这具有实际应用。我可以在一个核心上运行需要尽快获得结果的计算任务,同时仍然能够使用另一个核心来使用我的电脑。
答案1
如果我运行具有实时优先级的单线程进程,我知道它将一直执行直到完成为止。
这有点夸张。以下几点可以说明这并非事实:
您在任务管理器中看到的“实时优先级”实际上是进程线程可以访问的优先级范围。一个“实时”进程的线程可能比另一个“实时”进程的线程具有更高的优先级。请参阅我的回答这里但是,“实时”类中的所有优先级都高于所有其他类中的任何优先级。
大多数线程不会将所有代码都花在 CPU 上,因此无论优先级如何,它们都不会使用 100% 的 CPU。大多数线程确实偶尔会等待某些事情。通常它们在等待 I/O 完成,或者等待解决硬页面错误,或者等待其他线程指示它们不再需要等待。(其他线程可能在同一个进程中,也可能在不同的进程中。)
处理来自硬件设备的中断(包括来自实时时钟的中断)的第一阶段无论任何基于线程的代码。这些内容没有“优先级”,因为优先级是线程的一个属性,但中断不是由线程处理的。无论后者的优先级如何,它们都优先于基于线程的代码。您可以在 Windows 10 的任务管理器的“详细信息”选项卡中看到这些内容使用的时间作为“系统中断”。
实时优先级与其他优先级有以下区别:
它的优先级比所有其他优先级类别都高(当然)。
默认情况下,此类进程的线程不会根据其最近的活动自动调整其优先级,而其他类进程的线程则有此要求。(线程优先级调整可以通过编程关闭和打开,但默认情况下,非实时进程的优先级调整是打开的。)
但是如果我有第二个核心,那么我是否能够在该过程运行时借助第二个核心使用我的电脑?
有可能。事实上,即使只有一个启用了超线程的核心,情况也是如此。
实时优先级的正确使用不适用于 CPU 密集型进程。相反,我们对需要快速响应事件的任务使用高优先级。响应这些事件的密集型 CPU 工作应以低优先级完成,理想情况下低于“正常”优先级,以免妨碍交互式用户。
答案2
基本上,实时性具有极高的优先级,除非必要,否则不应执行。这是因为如果您试图加速一个占用所有可用资源的进程,那么即使是基本进程(如您提到的键盘和鼠标)也会受到影响。这会使停止贪婪进程变得困难。
理想情况下,您应该使用某种方法来分配核心,而不是优先级。优先级会影响整个 CPU。例如,如果使用 VBox,则将线程数设置得更高对于多任务处理和同时使用来说比设置优先级更有效。
TL;DR 如果要进行多任务处理,且任务占用大量 CPU,则请为任务分配核心,并且不要将优先级置于实时之上。如有必要,使用虚拟化来划分资源会有所帮助。