性能监视器解码基本优先级计数器

性能监视器解码基本优先级计数器

因此,在 perf mon 中,我可以将基本优先级计数器附加到某个进程(例如 Google Chrome)。这显示其优先级为“8”。如果我在任务管理器中查看,Google Chrome 具有“正常优先级”。

我的问题是,是否存在任何表格表明性能监视器中的 8 与正常优先级相同?

编辑:我刚刚注意到空闲进程的优先级为 0。但是根据这个

https://docs.microsoft.com/en-us/windows/desktop/procthread/scheduling-priorities

“只有零页线程的优先级可以为零。”

我对此感到很困惑 :<

答案1

该表格曾经在 microsoft.com 和无数其他地方相当容易找到。

在此处输入图片描述

任务管理器中的“基本优先级”列显示进程类别(在某些文档中称为“进程优先级类别”)。请注意,任务管理器(至少在 Windows 10 中)将“空闲”优先级类别标记为“低”(可能是为了避免与空闲进程等混淆)。

进程类仅用于初始化进程内创建的线程的优先级。每个线程都以“正常”线程优先级创建。如果进程属于“正常”进程类,则意味着该线程的基本优先级为 8。

(奇怪的是,CreateProcess API 接受进程类的参数,但 CreateThread 却不接受。要创建具有非“正常”线程优先级的线程,您必须先创建该线程,然后使用 SetThreadPriority 更改其优先级。)

程序可以在其进程类中更改其自身线程的优先级。在“正常”进程中,将线程设置为 THREAD_PRIORITY_HIGHEST 会将该线程的基本优先级设置为 10。如果您更改进程的优先级(例如使用任务管理器),则每个线程的基本优先级都会根据表格进行更改。

此表中有很多“名称异常”。“最高”不是最高线程优先级,“最低”不是最低,“空闲”并不意味着您没有或不会做任何事情,“实时”不保证适合实时工作的调度行为(它只是比非实时类更可预测,部分原因是它高于所有非实时类,部分原因是“实时”类中关闭了自动优先级调整)。

对于进程,应该使用进程类来指示每个进程相对于“正常”进程获得 CPU 时间的重要性(或不重要)。并且在每个进程中,开发人员应该以类似的方式设置线程优先级,相对于进程中的“正常”线程。实际上,很少有开发人员会费心这样做。(他们应该这样做。例如,视频渲染等计算密集型任务应设置为低于正常优先级,以避免干扰系统的交互使用。)

而且“空闲”进程类别和进程内的“空闲”线程优先级并不意味着该进程或线程不会执行任何操作。它只是意味着线程或进程愿意承受别人不想要的 CPU 周期。

您会注意到表中没有“0”。普通应用程序无法通过常规 API 请求以优先级 0 运行。只有内核模式线程才能以优先级 0 运行。正如您所发现的,这是为零页线程(或线程)保留的;NUMA 机器上可能有多个。

关于空闲进程 - 它及其线程是特殊情况。每个线程对象都有一个“优先级”成员,对于空闲线程,这些成员设置为 0。但是,空闲线程的优先级成员实际上从未用于任何事情,并且空闲线程没有就绪队列。相反,如果 OS 调度程序找不到任何其他线程在可用 CPU 上运行,它只会为该 CPU 选择空闲线程。(每个 CPU 都有自己专用的空闲线程。)因此,尽管它似乎具有优先级 0,但它的调度方式就像它的优先级为负 1 一样。即使是优先级 0 的线程也会优先于空闲线程。

在 Windows 中,“空闲”一词至少还有另一个常见含义。进程可以“注册空闲检测”。在这种情况下,“空闲”意味着在过去十五分钟内没有用户输入(键盘或鼠标),并且任何 CPU 或任何磁盘的使用率不超过 10%。当检测到这种“空闲”时,Windows 可以启动各种“内务处理”或“清理”任务,例如文件放置优化。响应这些任务而运行的代码不一定在空闲进程类或空闲线程优先级中运行。您可能已经看到了一个用于请求运行“空闲任务”的小命令行方法:

C:\> Rundll32.exe advapi32.dll,ProcessIdleTasks

这就是 that 所指的。它与空闲进程或所谓的“空闲”进程或线程优先级无关。

我写了一个答案,更详细地介绍了调度程序如何使用线程优先级进行选择这里

参考:https://docs.google.com/viewer?url=https%3A%2F%2Fdownload.microsoft.com%2Fdownload%2F1%2F4%2F0%2F14045a9e-c978-47d1-954b-92b9fd877995%2F97807356648739_samplechapters.pdf 以下是摘录自Windows Internals 第 6 版作者:所罗门·鲁西诺维奇等人。您要找的材料从PDF的第62页开始,实际书页码为408。

答案2

一个很好的、非常详细的信息来源是这篇文章
Windows OS Hub:Windows 中的进程优先级管理

以下是部分摘录:

Windows 中有 32 个优先级,从 0 到 31。

其分组如下:

  • 31 — 16 为实时级别
  • 15 — 1 为动态级别
  • 0 是为零页线程保留的系统级别

当一个进程被创建时,它会被分配以下六个优先级之一:

  • 实时类(值 24),
  • 高级(价值 13),
  • 高于正常级别(值 10),
  • 普通类(值 8),
  • 低于正常级别(值 6),
  • 或空闲类(值 4)。

8您观察到的优先级是“正常”优先级。该优先级0是最低优先级,因此只要存在更高优先级的进程或线程,该进程就永远不会执行。

如果您想了解 Windows 内部工作原理,请参阅 Mark E. Russinovich 和 David A. Solomon 的文章:
Windows 操作系统中的进程、线程和作业

相关内容