我一直在设置一些进程的优先级,以便查看其实际发生的情况,但是,请猜测是什么。一切都以相同的方式运行...
我在Google上发现优先级与处理速度并没有真正的联系,对吗?那为什么不呢?如果一个进程具有最高优先级,它应该不会更快?
我一直在设置一些进程的优先级,以便查看其实际发生的情况,但是,请猜测是什么。一切都以相同的方式运行...
我在Google上发现优先级与处理速度并没有真正的联系,对吗?那为什么不呢?如果一个进程具有最高优先级,它应该不会更快?
Answers:
假设您有一家杂货店的“行首”卡。您去商店,装满购物车,去结帐柜台,发现没有人在排队。您的信用卡可以帮助您更快地结帐吗?不。
优先级不会影响处理速度,因为优先级较高的进程不会运行得更快,甚至不会占用更多的CPU时间... 如果这不是唯一要使用CPU的东西,那不是。
要真正谈论这一点,我们需要提及线程。进程不会在Windows中“运行”。线程是进程的一部分,是运行的线程。(尽管一个进程只有一个线程,但从外部来看,这种区分是非常模糊的。)
(顺便说一句:CPU具有例如“四个核心和八个线程”的市场营销术语具有误导性。CPU具有核心,但是CPU没有“具有”线程。线程是进程的一部分。CPU核心如果不启用超线程,则可以运行一个线程;如果启用超线程,则一个内核可以运行两个线程,但是CPU没有“拥有”线程。)
每个线程始终处于几种调度状态之一。最常见的状态是:等待(* nix将此称为“已阻止”;在两种操作系统中,这都意味着等待I / O或类似操作,不占用CPU时间,并且不需要任何时间);准备就绪(想使用CPU时间,但现在没有可用的CPU);和运行。仅正在运行的线程消耗CPU时间。即,如果一个进程没有正在运行的线程,则将在诸如任务管理器之类的工具中使用0%的CPU时间。
线程一次只能在一个内核上运行(或者,如果启用了超线程,则可以在“逻辑处理器”上运行),因此,一个进程只能使用与当前要运行的线程一样多的CPU内核(或LP)。 。(可以对整个系统做出相同的陈述。)
大多数系统上的大多数线程将大部分时间都花在“等待”状态。(这就是为什么当您的系统不执行任何操作时,您的空闲进程应该占用超过95%的CPU时间的原因。)例外是诸如视频或3D渲染,游戏等之类的“工作”线程。线程很少确实可以使用100%的CPU,因为它们通常必须处理必须从某个地方读取的某些输入数据,并且通常创建必须写入某个地方的输出数据。随着时间的推移,它们可能会引用内存中的许多不同数据,这可能意味着它们必须等待解决硬页面错误。
但是执行诸如视频渲染或3D图像渲染之类的线程很可能会将其几乎所有时间都花在CPU上“计算”,而很少等待I / O。此类线程通常称为“计算绑定”,这意味着它们的整体性能主要受CPU速度的限制。
您在任务管理器中进行的设置实际上为进程中的所有线程建立了“基本优先级”。线程的实际优先级或“当前”优先级可能更高(但绝不会低于基准)。稍后再讨论。调度决策(“谁来运行,以及在哪个CPU上运行”)始终使用线程的当前优先级来完成。优先级仅对“就绪”线程和“正在运行”线程有意义(换句话说,优先级对“等待”线程没有意义)。
Windows使用抢先式调度算法。如果系统中只有一个线程要使用CPU时间,那么它的优先级丝毫没有关系。它获得100%的CPU。当低优先级线程正在运行时,调度程序似乎并不会“保留” CPU功能的一部分,以防万一出现了更高优先级的情况。
如果两个线程要使用CPU,并且它们具有相同的优先级,则通过所谓的“时间分片”进行调度,随着时间的流逝,每个线程将获得大约CPU时间的50%。而如果它们具有不同的优先级,则优先级较高的线程将获得100%,而优先级较低的线程将一无所获。
(实际上,它不会一无所获,因为它将经历周期性的“饥饿避免优先级提升”,每4或5秒左右可能会给它几十毫秒的时间。但这并不是“更高优先级”的例外胜”,因为它是通过调整饥饿线程的优先级来完成的。)
如果你有一个以上的CPU核心,事情变得更加有趣,一般优先考虑具有较少的影响。假设您有两个要运行的线程。并假设您有两个或多个CPU核心,它们没有比这些线程具有相同或更高优先级的其他事情。然后,您的两个线程将各自获得100%的内核,而不管它们各自的优先级如何。
(两个人在超市露面,有两个免费的检查器。其中一个顾客有“去排队的头”卡。没关系。)
tl; dr版本(到目前为止):优先级不是关于“谁获得多少CPU时间”,而是“谁首先运行”。
除了要说Windows将内核中的两个“逻辑处理器”中的每一个对待内核的方式几乎与关闭HT时的方式一样,我在这里不打算讨论超线程。也就是说,它们被视为“真正的” CPU,但有以下例外:Windows将非常努力地一次不在一个内核中使用多个LP。也就是说,通常您不会看到正在使用一个内核中的两个LP,直到您有多个内核线程试图同时运行它们为止。这是因为两个“逻辑处理器”给您的性能没有一个非超线程内核的两倍。
关于“基本优先级”:Windows将根据线程最近所做的事情来调整(“增强”和“衰减”)线程的当前优先级。最近完成I / O操作的线程通常比基址高一个或两个凹口。UI线程(运行窗口的线程)通常会更高。受CPU约束的线程通常以它们为基础。这样做的目的是为了保持程序UI中的响应能力,并保持IO请求流向磁盘之类的东西。
程序(进程)还可以在由进程优先级(您在任务管理器中设置的事物)确定的范围内更改其每个线程的基本优先级。但是绝大多数程序都不会打扰。(他们应该更多。)
还有其他事情。由于优先级提升/衰减,以及由于当今多处理系统(多核或超线程或两者兼有)非常普遍,并且由于Windows中总是在后台运行某些东西(但我们希望不要占用太多CPU时间),并且由于硬性和软性“亲和力”的影响,很难运行测试用例并获得此处可以预测的准确结果。但这应该使您接近正确的画面。
结论...
将大多数内容保留为“正常”是合理的。如果不这样做,您很容易最终会饿死您真正想要工作的某些东西(即使您可能不知道它确实存在),例如OS的磁盘缓存刷新功能。确实,许多操作系统的进程都将处于“普通”之外的其他进程,并且应将它们留在Windows放置的任何位置。
使用任务管理器处理优先级的合理情况是,如果您有一些占用CPU的任务(例如视频或3D渲染),并且在运行时减慢了对系统的使用。正确与否,无论您是否相信,都应将其优先级降低一两个等级。它会愉快地使用所有其他CPU周期,而不会妨碍您交互式使用系统。完成工作可能需要一点时间,但是完成工作的方式将对您对其他程序的交互使用产生的干扰降至最低。如果您不喜欢这种折衷,那就不要做!但是将其设置为高优先级以尝试“使其更快”,它可能会挂起整个UI,直到完成为止。
切勿对所谓的“实时”优先级设置任何内容。
(编辑-添加了此段)好的,这是一个极端的声明。(“没有一个普遍的要求是正确的-不排除这一要求。”)至少,并非没有非常仔细的考虑。如果您的目标是使某些程序运行更快,则可能无济于事。但这可能会“硬锁定”您的系统(需要重设,或者在大多数现代机器上,都需要重新启动电源)。或者使它反应迟钝,以至于它可能会被硬锁定。
nb:任何视频播放器应用程序都应选择在Vista和更高版本中使用“多媒体课程安排”功能。在相对较短的时间间隔内,这将自动为它提供最多80%的CPU。如果您无法获得无故障播放,那是非常错误的。
有关更多详细信息,请参见Solomon,Russinovich和Ionescu撰写的Windows Internals 6th Edition中有关线程和调度的章节。
另请参阅我的回答,以获取有关如何设置进程和线程优先级以及“任务管理器”中“优先级”列的含义的信息。
更改优先级会更改操作系统将CPU时间分配给正在运行的应用程序的方式。仅在总体CPU利用率很高时,它才会产生明显的效果。
例如,您编码视频并同时观看其他视频。可能,编码应用程序将在所有CPU内核上利用100%的计算能力。结果,其他应用程序可能会结结巴巴。
默认情况下,Windows将为这两个应用程序赋予相同的“正常”优先级。此时,您可能需要提高影片播放器软件的优先级。这样,您将获得流畅的视频播放效果,但要以较慢的视频编码为代价,因为与视频播放器相比,编码软件将降级为后台处理。
When should I set [priorities in Task Manager]?
几乎永远不会。