Answers:
当瓶颈是CPU本身时,优先级无济于事。由于大多数系统中没有足够的处理器来连续运行每个进程,因此实际上优先级的高低会影响操作系统用来确定下一步运行哪个进程的调度算法。
较高优先级的任务将使其进入队列顶部的速度更快,因此这有助于一般的延迟,但是,如果您的进程耗尽了整个时间片,则会在实际计算中分配该时间片,那么调度将不会在那里进行任何更改。当您有一个正在等待I / O的进程并且希望它具有更快的响应速度时,更改优先级会更加有用。
仅当可运行线程多于可用CPU内核时,优先级才重要。发生这种情况时,优先级控制着要运行的线程。在大多数系统中,CPU上的任何争用都没有进行足够的计算:所有线程都被阻塞,等待发生某些事情。那可能正在等待您键入内容,移动鼠标,触摸屏幕,或者等待数据从磁盘,网络,您插入的其他设备进入,或者等待其他线程完成对关键数据的处理。结构体。它可能正在等待程序的一部分从磁盘或交换出的一些内存中读取以供回读,而不是显式读取文件。
在Windows中,调度程序在每个优先级上都保留可运行线程的队列。当它做出调度决定时-一个线程用完了自己的量子量(允许运行其他线程之前的允许时间),这意味着另一个线程应该转弯,或者该线程已阻塞并且不再可运行,或者优先级更高线程已解除阻塞-将调度队列中具有所有可运行线程的最高优先级的下一个线程。如果正在运行的线程已经用完了它的数量,则将其放在队列的末尾。如果它是其优先级级别上唯一可运行的线程,并且没有其他更高优先级的可运行但未运行的线程,它将转回另一侧。
在多核/多处理器系统中,线程可以在哪些核上运行可能受到限制。另外,系统尝试将线程保留在理想的内核上以及其NUMA节点内,以便线程的数据可能仍保留在该内核的缓存中,并且可以快速访问其创建的数据。如果没有选择下一步运行的线程,线程仍将在非理想内核上运行。
该系统利用各种动态优先级提升和动态量子大小,从而使前台应用程序比后台进程获得更多的时间(如果需要),并且使进程在I / O操作完成(包括鼠标,键盘和触摸屏输入)。此外,使用优先级提升来解决优先级反转问题,在此情况下,高优先级线程正在等待低优先级线程当前持有的资源。如果还有一个中优先级线程正在运行,它将耗尽处理器时间的低优先级线程,从而阻塞了高优先级线程。因此,将低优先级线程临时提升为较高优先级,这样就节省了时间,并有望释放高优先级线程所需的资源。
在Windows Vista之前,线程优先级对I / O操作完成的速度没有影响。从Windows Vista开始,I / O也可以具有优先级,默认情况下,该优先级来自线程优先级。
简介:除非CPU负载很重,否则您基本上看不到更改线程优先级的任何影响,即使那样,影响通常也很小。如果该进程必须等待I / O或不与其他进程争夺CPU时间,则该进程已经在以其可能的最快速度运行,并且更改优先级不会使其更快。
即使提高了与I / O绑定的进程的I / O优先级,也不一定会使它运行得更快。例如,如果它是一个单独的,可能是远程的过程所产生的数据的使用者,并且与该源产生数据的速率保持一致,那么它就不能运行得更快或具有更高的吞吐量。
与当前接受的答案(/superuser//a/752587/322588)的第一句话中明确指出的相反,当CPU成为瓶颈时,优先级更改最有效,如Mike Dimmick的答案所述。 (/superuser//a/752864/322588)。此外,在接受的答案的第二段中,“如果您的进程用尽了整个时间片,那么它将在实际计算中分配,那么调度将不会在此处进行任何更改”,这是完全错误的,除非该过程通常已经具有最高的优先级等待运行时可运行的线程。这是因为在所有其他情况下,提高优先级可能会使每个壁钟间隔获得更多的时间片。
迈克·迪米克(Mike Dimmick)几天前指出了此答案的问题,并提供了更好的答案,但第一个莫名其妙地继续获得选票。它的作者声称他只是为我们的虚拟人哑巴了答案,这是不合理的,因为它不仅简单,甚至是简单化,而且是完全错误的,至少在CPU绑定进程方面是这样。
免责声明:我不认识迪米克先生,尽管我可以告诉他迪米克知道他在写什么。
timeBeginPeriod (...)
,任何交互式的操作都可以进行。游戏通常会在启动时将其设置为1,并对整个系统上运行的所有组件应用1 ms的调度间隔。它不仅仅局限于做到这一点的过程。这是很难认真考虑Windows进行多任务处理的部分原因。