任务管理器中的优先级如何运作以及我何时应该/不应该设置它?

任务管理器中的优先级如何运作以及我何时应该/不应该设置它?

我一直在设置一些进程的优先级,以便查看实际发生的情况,但是,猜怎么着......什么都没有;一切都以同样的方式运行......

我在 Google 上发现优先级与处理速度并没有太大关系,是真的吗?那为什么不呢?如果一个进程具有最高优先级,它不是应该运行得更快吗?

答案1

假设你有一张杂货店的“排头结账”卡。你走进商店,装满购物车,走到收银台,却发现没有人在排队。你的卡能帮助你更快结账吗?不能。

优先级不会影响处理速度,因为优先级较高的进程不会运行得更快,甚至不会占用更多的 CPU 时间......如果它是唯一想要使用 CPU 的东西则不然。

要真正谈论这一点,我们需要提到线程。进程在 Windows 中不会“运行”。线程是进程的一部分,是运行的。(尽管如果一个进程只有一个线程,从外部看,区别就很模糊。)

(顺便说一句:CPU 的营销术语,例如“四核八线程”,具有误导性。CPU 有核心,但 CPU 没有“线程”。线程是进程的一部分。未启用超线程的 CPU 核心能跑一个线程;启用超线程后,一个核心能跑两个线程。但 CPU 并不“拥有”线程。

每个线程始终处于几种调度状态之一。最常见的状态是:等待(*nix 称之为“阻塞”;在两种操作系统中,这意味着等待 I/O 或类似情况,不占用 CPU 时间也不想要任何 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,并且它们的优先级相同,那么它们将通过所谓的“时间分片”进行调度,随着时间的推移,每个线程将获得大约 50% 的 CPU 时间。而如果它们的优先级不同,那么优先级较高的线程将获得 100% 的 CPU 时间,优先级较低的线程将获得没有什么

(实际上它不会一无所获,因为它会经历周期性的“饥饿避免优先级提升”,每 4 或 5 秒左右可能会给它几十毫秒的时间。但这实际上并不是“更高优先级获胜”的例外,因为它是通过调整饥饿线程的优先级来完成的。)

如果你有多个 CPU 核心,事情就会变得更加有趣,而且优先级通常有较少的效果。假设您有两个线程想要运行。假设您有两个或多个 CPU 核心,并且这些核心没有执行与这些线程同等或更高优先级的其他任务。那么您的两个线程将各自获得 100% 的核心,无论他们各自的优先事项是什么

(两个人来到超市,有两张免费的结账卡。其中一位顾客有一张“排在队首”的卡。无所谓。)

tl;dr 版本(到目前为止):优先级不是关于“谁获得多少比例的 CPU 时间”,而是“谁先运行”。

我不会在这里过多地讨论超线程,我只想说,Windows 对待内核中的两个“逻辑处理器”的方式与关闭超线程时对待内核的方式基本相同。也就是说,它们被视为“真实”CPU,但有一点例外:Windows 将尽力避免内核中同时使用多个 LP。也就是说,您通常不会看到内核中的两个 LP 都被使用,直到您拥有超过核心数线程试图同时运行。这是因为两个“逻辑处理器”不会为您提供相当于单个非超线程核心两倍的性能。

关于“基本优先级”:Windows 将根据线程最近的操作调整(“提高”和“降低”)线程的当前优先级。最近完成 I/O 操作的线程通常会比基本优先级高出一两个等级;UI 线程(正在运行窗口的线程)通常会高出很多;CPU 绑定线程通常会处于基本优先级。这样做的目的是保持程序 UI 的响应能力,并保持 IO 请求流向磁盘等。

程序(进程)还可以更改其每个线程的基本优先级,更改范围由进程的优先级(您在任务管理器中设置的优先级)决定。但绝大多数程序都不会这么做。(大多数程序应该这么做。)

还有其他事情正在发生。由于优先级的提升/衰减,以及多处理系统(多核、超线程或两者)如今非常普遍,并且由于 Windows 中总是有一些程序在后台运行(但我们希望不会占用太多 CPU 时间),并且由于硬“亲和性”和软“亲和性”的影响,很难运行测试用例并获得此处预测的准确结果。但这应该可以给你一个接近正确的画面。

综上所述...

将大多数功能保留为“正常”状态是合理的。如果不这样做,您很容易最终导致某些您真正想要运行的功能(即使您可能不知道它的存在)无法运行,例如操作系统的磁盘缓存刷新功能。事实上,操作系统的许多进程将处于非正常状态,并且应该将它们保留在 Windows 放置它们的位置。

使用任务管理器调整优先级的合理情况是,如果您有一些占用大量 CPU 的任务(如视频或 3D 渲染),并且它在运行时会降低您对系统的使用速度。不管您信不信,正确的做法是降低将其优先级提高一到两个等级。它会愉快地使用其他程序不需要的所有 CPU 周期,但不会妨碍您对系统的交互使用。它可能需要更长的时间才能完成工作,但它会在对您交互使用其他程序的干扰最小的情况下完成工作。如果您不喜欢这种权衡,请不要这样做!但将其设置为高优先级以“使其运行得更快”,它可能会挂起您的整个 UI,直到它完成。

永远不要为所谓的实时优先级设置任何东西。

(编辑 - 添加了此段)好吧,这是一个极端的说法。(“没有一个普遍的说法是正确的 - 也不例外。”)至少,没有经过非常仔细的考虑。如果你的目标是让某些东西运行得更快,那么它可能无济于事。但它可能会“硬锁定”你的系统(需要重置,或者在大多数现代机器上,需要电源循环)。或者让它反应迟钝,以至于它可能被硬锁定了。

注意:在 Vista 及更高版本中,任何视频播放器应用都应选择“多媒体类调度”功能。这将自动为其分配高达 80% 的 CPU 时间(以相对较短的时间间隔计算)。如果您无法通过此功能获得无故障播放,则说明存在严重问题。

有关更多详细信息,请参阅Windows Internals 第六版作者:Solomon、Russinovich 和 Ionescu。

也可以看看我的答案在这里有关如何设置进程和线程优先级的信息,以及任务管理器中“优先级”列的含义。

答案2

更改优先级会改变操作系统为正在运行的应用程序分配 CPU 时间的方式。只有当总体 CPU 利用率较高时,它才会产生明显的效果。

例如,你编码一个视频,同时观看另一个视频。编码应用程序可能会利用你所有 CPU 核心的 100% 计算能力。因此,其他应用程序可能会卡顿。

Windows 默认会为这两个应用程序赋予相同的“正常”优先级。此时,您可能希望提高电影播放器​​软件的优先级。这样,您将获得流畅的视频播放,但代价是视频编码速度较慢,因为与视频播放器相比,编码软件将降级为后台进程。

相关内容