为什么不对流程进行优先级排序可以提高速度?


18

我有2个应用程序都在使用大量系统资源。当我在任务管理器中降低一个的优先级,同时增加另一个的优先级时,我注意到较高优先级的应用程序的速度没有明显改善。

为什么是这样?还有更多的事情要做吗?


6
就像现实生活一样。如果您比其他乘客拥有更高的乘坐飞机优先级,这并不意味着航班会花更少的时间给您!
Mehrdad 2014年

Answers:


28

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

较高优先级的任务将使其进入队列顶部的速度更快,因此这有助于一般的延迟,但是,如果您的进程耗尽了整个时间片,则会在实际计算中分配该时间片,那么调度将不会在那里进行任何更改。当您有一个正在等待I / O的进程并且希望它具有更快的响应速度时,更改优先级会更加有用。


5
当瓶颈是可运行的线程太多时,优先级确实会有所帮助。在时间片结束时仍可运行的Windows上较高优先级的线程将有另一个机会优先于较低优先级的线程运行(Windows尽量不使低优先级线程饿死,并偶尔提升它们)。优先级对等待I / O的线程几乎没有影响-Windows在I / O完成后根据其正在等待的I / O的类型临时提高线程的优先级。
Mike Dimmick 2014年

4

优先级是CPU时间。是否所有内核都一直被100%使用?如果没有,则优先级将无效。通常,CPU不是瓶颈,而是内存,磁盘或GPU资源。


3

仅当可运行线程多于可用CPU内核时,优先级才重要。发生这种情况时,优先级控制着要运行的线程。在大多数系统中,CPU上的任何争用都没有进行足够的计算:所有线程都被阻塞,等待发生某些事情。那可能正在等待您键入内容,移动鼠标,触摸屏幕,或者等待数据从磁盘,网络,您插入的其他设备进入,或者等待其他线程完成对关键数据的处理。结构体。它可能正在等待程序的一部分从磁盘或交换出的一些内存中读取以供回读,而不是显式读取文件。

在Windows中,调度程序在每个优先级上都保留可运行线程的队列。当它做出调度决定时-一个线程用完了自己的量子量(允许运行其他线程之前的允许时间),这意味着另一个线程应该转弯,或者该线程已阻塞并且不再可运行,或者优先级更高线程已解除阻塞-将调度队列中具有所有可运行线程的最高优先级的下一个线程。如果正在运行的线程已经用完了它的数量,则将其放在队列的末尾。如果它是其优先级级别上唯一可运行的线程,并且没有其他更高优先级的可运行但未运行的线程,它将转回另一侧。

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

该系统利用各种动态优先级提升和动态量子大小,从而使前台应用程序比后台进程获得更多的时间(如果需要),并且使进程在I / O操作完成(包括鼠标,键盘和触摸屏输入)。此外,使用优先级提升来解决优先级反转问题,在此情况下,高优先级线程正在等待低优先级线程当前持有的资源。如果还有一个中优先级线程正在运行,它将耗尽处理器时间的低优先级线程,从而阻塞了高优先级线程。因此,将低优先级线程临时提升为较高优先级,这样就节省了时间,并有望释放高优先级线程所需的资源。

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

简介:除非CPU负载很重,否则您基本上看不到更改线程优先级的任何影响,即使那样,影响通常也很小。如果该进程必须等待I / O或不与其他进程争夺CPU时间,则该进程已经在以其可能的最快速度运行,并且更改优先级不会使其更快。


0

通常,要使一个程序使用一个以上的CPU(通过添加多线程)会花费额外的精力。因此,即使程序具有最高可用优先级,也可能只使用一个内核。

其他可能的问题:

  • 该程序可能效率低下/编写得不好
  • 由于“缓慢的”磁盘访问或缓慢的网络,它可能会变慢

0

即使提高了与I / O绑定的进程的I / O优先级,也不一定会使它运行得更快。例如,如果它是一个单独的,可能是远程的过程所产生的数据的使用者,并且与该源产生数据的速率保持一致,那么它就不能运行得更快或具有更高的吞吐量。

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

迈克·迪米克(Mike Dimmick)几天前指出了此答案的问题,并提供了更好的答案,但第一个莫名其妙地继续获得选票。它的作者声称他只是为我们的虚拟人哑巴了答案,这是不合理的,因为它不仅简单,甚至是简单化,而且是完全错误的,至少在CPU绑定进程方面是这样。

免责声明:我不认识迪米克先生,尽管我可以告诉他迪米克知道他在写什么。


也许你误会了;问题是流程运行得更快。受CPU约束的进程将耗尽其整个调度单元(量子),然后最后进入准备就绪的队列。在Windows之类的桌面操作系统中,这意味着该进程每秒有1 / quantum-Hz的机会运行。更改优先级(通常)不会更改其时间片的长度。它总是需要相同数量的调度数量才能完成。至关重要的是,这是Windows实际测量进程运行时间的方式:已调度的量子数量。
2014年

该过程可能会更快完成,但是仍然可以运行相同数量的调度单元。当受I / O约束的进程进入等待列表时,如果I / O操作完成,它可能有第二次机会运行并抢占优先级较低的正在运行的进程。受CPU约束的进程没有这种自由,它们耗尽了整个时间片,然后进入就绪队列。这可能的他们,如果他们有足够高的优先级之后立即运行,但没有任何与Windows是如何测量的执行时间。
2014年

等待的I / O绑定进程的优先级根本不同,并且可以对Windows中报告的运行时产生可观的影响。同样,Windows将运行时间作为已过期的量子数量进行度量(即使进程在实际运行的10 ms量子中花费1 ms,然后自愿等待其余9 ms的I / O,Windows内核也将其视为10 ms用户模式运行时)。抢占可帮助I / O绑定的应用程序完成较少的量化工作。其他内核(例如Linux)可以在进程的运行时中正确测量部分量子,而Windows无法。
安东·科尔曼

@ AndonM.Coleman从Vista和更高版本开始,是的,它可以并且可以。
Jamie Hanrahan

@JamieHanrahan:嗯,您可以随时调用timeBeginPeriod (...),任何交互式的操作都可以进行。游戏通常会在启动时将其设置为1,并对整个系统上运行的所有组件应用1 ms的调度间隔。它不仅仅局限于做到这一点的过程。这是很难认真考虑Windows进行多任务处理的部分原因。
安东·科尔曼
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.