为什么对进程进行优先排序并不能提高速度?

为什么对进程进行优先排序并不能提高速度?

我有两个应用程序都占用了大量的系统资源。当我在任务管理器中降低其中一个应用程序的优先级,同时提高另一个应用程序的优先级时,我并没有发现优先级较高的应用程序的速度有任何显著的提高。

这是为什么?是否还有其他事情发生或需要做更多的事情?

答案1

当瓶颈是 CPU 本身时,优先级无济于事。优先级实际上会影响调度操作系统使用算法​​来确定接下来运行哪个进程,因为大多数系统中没有足够的处理器来连续运行每个进程。

优先级较高的任务会更快地到达队列顶部,因此这有助于降低总体延迟,但如果您的进程耗尽了分配给它的实际计算的整个时间片,那么调度不会改变任何事情。当您有一个正在等待 I/O 的进程并且您希望它响应更快时,更改优先级会更有用。

答案2

优先级是 CPU 时间。所有核心是否一直都得到 100% 利用?如果不是,那么优先级就没有效果。通常 CPU 不是瓶颈,而是内存、磁盘或 GPU 资源。

答案3

优先级仅在可运行线程数多于可用 CPU 核心数时才重要。当发生这种情况时,优先级控制哪些线程可以运行。在大多数系统中,没有足够的计算来争用 CPU:线程全部受阻,等待某事发生。这可能是在等待您输入内容、移动鼠标​​、触摸屏幕,或者等待数据从磁盘、网络、您插入的其他设备到达,或者等待另一个线程完成对关键数据结构的操作。它可能在等待从磁盘读取程序的一部分或等待将交换出去的某些内存读回,而不是明确地读取文件。

在 Windows 中,调度程序维护一个队列可运行每个优先级的线程。当它做出调度决定时——要么线程已经耗尽其量子(允许在其他线程需要运行之前等待的时间),这意味着另一个线程应该轮到,或者该线程已被阻塞并且不再可运行,或者更高优先级的线程已解除阻塞 - 队列中具有任何可运行线程的最高优先级的下一个线程将被调度。如果正在运行的线程已用完其时间片,则将其放在队列的末尾。如果它是其优先级中唯一可运行的线程,并且没有其他更高优先级的可运行但未运行的线程,则它将获得另一个轮到。

在多核/多处理器系统中,线程可以在哪些核心上运行可能会受到限制。此外,系统会尝试让线程保持其理想核心并在其 NUMA 节点内,这样线程的数据可能仍位于该核心的缓存中,并且可以快速访问其创建的数据。如果没有选择下一步要运行的内容,线程仍将在非理想核心上运行。

系统利用各种动态优先级提升和动态量子大小,以便前台应用程序比后台进程获得更多时间(如果需要),并且进程可以在 I/O 操作完成时快速做出反应(包括鼠标、键盘和触摸屏输入)。此外,优先级提升还用于解决优先级反转问题,即高优先级线程正在等待低优先级线程当前持有的资源。如果还有一个中优先级线程也在运行,它将使低优先级线程失去处理器时间,从而占用高优先级线程。因此,低优先级线程暂时被提升到更高的优先级,以便获得时间并希望释放高优先级线程所需的资源。

在 Windows Vista 之前,线程优先级没有效果I/O 操作完成的速度。从 Windows Vista 开始,I/O 还可以具有优先级,默认情况下优先级来自线程优先级。

总结:除非 CPU 负载过重,否则更改线程优先级几乎不会产生任何影响,即使如此,影响通常也很小。如果进程必须等待 I/O 或者不与其他进程争夺 CPU 时间,则它已经以最快的速度运行,更改优先级不会使其运行得更快。

答案4

即使提高 I/O 密集型进程的 I/O 优先级也不一定能使其运行得更快。例如,如果它是某个单独的(可能是远程的)进程所生成数据的消费者,并且它正在跟上该源生成数据的速率,那么它就无法运行得更快或拥有更高的吞吐量。

与目前普遍接受的答案第一句明确指出的相反(https://superuser.com/a/752587/322588),当 CPU 是瓶颈时优先级更改最有效,正如 Mike Dimmick 的回答中解释的那样(https://superuser.com/a/752864/322588)。此外,接受答案的第二段中的陈述“如果您的进程在实际计算中耗尽了分配给它的整个时间片,那么调度不会改变任何事情”是完全错误的,除非进程在等待运行时通常已经具有所有可运行线程中的最高优先级。这是因为在所有其他情况下,提高优先级可能会使其在每个挂钟间隔内获得更多的时间片。

几天前,Mike Dimmick 指出了这个答案的问题,并提供了一个更好的答案,但第一个答案却莫名其妙地继续获得选票。作者声称他只是为我们这些傻瓜简化了他的答案,这是不可信的,因为它不仅仅是简单,甚至过于简单,它是完全错误的,至少对于 CPU 受限的进程而言。

免责声明:我不认识迪米克先生,但我可以说他知道自己在写什么。

相关内容