优先级如何在任务管理器上工作,我何时应该/不应该设置它?

Pab*_*ito 38 windows task-manager priority threads

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

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

Jam*_*han 64

假设您有一张杂货店的“排在第一位”的卡片。你去商店,装满你的购物车,去结账柜台,发现没有人在排队。您的卡是否可以帮助您更快地结账?不。

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

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

(顺便说一句:例如,CPU 具有“四核八线程”的营销术语具有误导性。CPU 有内核,但 CPU 没有“线程”。线程是进程的一部分。CPU 内核不启用超线程可以运行一个线程;启用超线程时,一个内核可以运行两个线程。但 CPU 没有“拥有”线程。)

每个线程始终处于几种调度状态之一。最常见的状态是:等待(*nix 称之为“阻塞”;在两个操作系统中这意味着等待 I/O 或类似的,不使用 CPU 时间并且不需要任何时间);就绪(想使用 CPU 时间,但现在没有可用的 CPU);和运行。只有运行线程消耗 CPU 时间;即如果一个进程没有正在运行的线程,它将被视为在任务管理器等工具中使用零%的 CPU 时间。

一个线程一次只能在一个内核上运行(或者,如果启用了超线程,则为“逻辑处理器”),因此一个进程只能使用与当前想要运行的线程一样多的 CPU 内核(或 LP) . (可以对整个系统进行相同的陈述。)

大多数系统上的大多数线程大部分时间都处于等待状态。(这就是为什么当您的系统不执行任何操作时,您的空闲进程应该获得超过 95% 的 CPU 时间。)例外情况是视频或 3D 渲染、游戏等的“工作”线程。很少有线程可以真正使用 100% 的 CPU,因为它们通常必须处理一些必须从某处读取的输入数据,并且它们通常会创建必须写入某处的输出数据。随着时间的推移,它们可能会引用内存中的许多不同数据,这可能意味着它们必须等待解决硬页面错误。

但是,执行诸如视频渲染或 3D 图像渲染之类的线程可能会将几乎所有时间都花在 CPU 中“计算”上,而很少等待 I/O。此类线程通常称为“计算受限”,这意味着它们的整体性能主要受 CPU 速度的限制。

您在任务管理器中所做的设置实际上为进程中的所有线程建立了“基本优先级”。线程的实际或“当前”优先级可能更高(但绝不会低于基数)。稍后会详细介绍。调度决策(“谁可以运行,在什么 CPU 上运行”)总是使用线程的当前优先级来完成。Priority 仅对 Ready 和 Running 线程有意义(或者换句话说,priority对 Waiting 线程没有意义)。

Windows 使用抢占式调度算法。如果系统中只有一个线程想要使用 CPU 时间,那么它的优先级是什么都无所谓;它获得 100% 的 CPU。当低优先级线程正在运行时,调度程序并不是“阻止”CPU 的一部分功能,以防万一出现更高优先级的线程。

如果两个线程想要使用一个 CPU,并且它们具有相同的优先级,那么它们将通过所谓的“时间切片”进行调度,随着时间的推移,每个线程获得大约 50% 的 CPU 时间。而如果它们具有不同的优先级,那么高优先级线程获得 100%,而低优先级线程则一无所获

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

如果你有一个以上的CPU核心,事情变得更加有趣,一般优先考虑具有较少的影响。假设您有两个要运行的线程。并且假设您有两个或多个 CPU 内核,它们不执行与这些线程同等或更高优先级的任何其他操作。那么您的两个线程将分别获得 100% 的核心,而不管它们各自的优先级如何

(两个人出现在超市,有两个免费的检查器。其中一个顾客有一张“走到队头”的卡片。没关系。)

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

我不会在这里过多地讨论超线程,只是说 Windows 处理内核中的两个“逻辑处理器”中的每一个的方式几乎与关闭 HT 时处理内核的方式相同。即,它们被视为“真正的”CPU,但有一个例外:Windows 将非常努力地在一个内核中一次不使用多个 LP。即,您通常不会开始看到正在使用的内核中的两个 LP,直到您有多个内核线程尝试同时运行。这是因为两个“逻辑处理器”不会为您提供单个非超线程内核两倍的性能。

关于“基本优先级”:Windows 将根据线程最近所做的事情调整(“提升”和“衰减”)线程的当前优先级。最近完成 I/O 操作的线程通常比基数高一两个档位;UI 线程(运行窗口的线程)通常会更高;CPU 绑定线程通常位于它们的基础上。这样做的目的是保持程序 UI 的响应能力,并保持 IO 请求流向磁盘之类的东西。

程序(进程)还可以在进程的优先级(您在任务管理器中设置的内容)确定的范围内更改其每个线程的基本优先级。但绝大多数程序都不会打扰。(他们中的更多人应该。)

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

综上所述...

将大部分内容保留为“正常”是合理的。如果你不这样做,你很容易最终会饿死你真正喜欢工作的东西(即使你可能不知道它存在),比如操作系统的磁盘缓存刷新功能。事实上,许多操作系统的进程将处于非正常状态,它们应该留在 Windows 放置它们的任何地方。

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

切勿为所谓的实时优先级设置任何内容。

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

注意:在 Vista 及更高版本中,任何视频播放器应用程序都应选择加入“多媒体课程安排”功能。这将自动提供高达 80% 的 CPU,在相对较短的时间间隔内计算。如果你不能获得无故障播放,那是非常错误的。

有关更多详细信息,请参阅Solomon、Russinovich 和 Ionescu在Windows Internals 6th Edition 中有关线程和调度的章节。

有关如何设置进程和线程优先级以及任务管理器中“优先级”列的含义的信息,另请参阅我的回答


小智 6

改变优先级会改变操作系统将 CPU 时间分配给正在运行的应用程序的方式。如果整体 CPU 利用率很高,它只会产生明显的效果。

例如,您对视频进行编码并同时观看不同的视频。很可能,编码应用程序将在所有 CPU 内核上使用 100% 的计算能力。因此,其他应用程序可能会卡顿。

默认情况下,Windows 将为两个应用程序提供相同的“正常”优先级。此时,您可能希望提高电影播放器​​软件的优先级。通过这种方式,您将以较慢的视频编码为代价获得流畅的视频播放,因为与视频播放器相比,编码软件将降级为后台进程。