如何将进程/线程优先级提高到 15 以上(高)

Ana*_*nas 5 c++ winapi multithreading real-time thread-priority

我有一个具有 8 个物理核心(16 个具有超线程)的 Intel 处理器,我试图通过提高 C++ 应用程序进程的优先级以及我在此应用程序中启动的四个线程的优先级来充分利用其中四个核心(我正在使用 OpenMp 来午餐线程)。

根据微软的优先级表:

进程优先级 线程优先级 基本优先级
HIGH_PRIORITY_CLASS 线程优先级空闲 1
THREAD_PRIORITY_LOWEST 11
THREAD_PRIORITY_BELOW_NORMAL 12
线程优先级正常 13
THREAD_PRIORITY_ABOVE_NORMAL 14
THREAD_PRIORITY_HIGHEST 15
THREAD_PRIORITY_TIME_CRITICAL 15
REALTIME_PRIORITY_CLASS 线程优先级空闲 16
THREAD_PRIORITY_LOWEST 22
THREAD_PRIORITY_BELOW_NORMAL 23
线程优先级正常 24
THREAD_PRIORITY_ABOVE_NORMAL 25
THREAD_PRIORITY_HIGHEST 26
THREAD_PRIORITY_TIME_CRITICAL 31

当我执行以下操作时,我只看到优先级设置为 15:

int priority;
SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
priority = GetThreadPriority(GetCurrentThread());
Run Code Online (Sandbox Code Playgroud)

另外,从任务管理器检查优先级,它设置为高,而不是实时的。

如何将优先级提高到15以上?

Tur*_*ght 8

对于默认的 Windows 安装,您需要具有管理员权限才能将进程的优先级提高到REALTIME_PRIORITY_CLASS

为此您需要拥有的特权称为SE_INC_BASE_PRIORITY_NAME

含量/值 描述
SE_INC_BASE_PRIORITY_NAME
TEXT("SeIncreaseBasePriorityPrivilege")
需要增加进程的基本优先级。
用户权限:提高调度优先级。

默认情况下,此权限仅授予管理员组的成员,
但您可以使用“增加调度优先级”组策略也向普通用户授予此权限。


假设您以有权访问所述权限的用户身份运行(默认情况下只有管理员组的成员),并且为当前进程启用了该权限,那么您应该能够通过以下方式将进程优先级提高到实时:

SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
Run Code Online (Sandbox Code Playgroud)

为什么实时优先级通常是一个坏主意

请记住,实时优先级确实意味着实时。

几乎所有系统进程都以低于实时的优先级运行 - 因此,如果您的进程决定进行一些繁重的计算,它将完全阻止系统的其余部分执行任何操作。

安排优先级
谨慎 使用HIGH_PRIORITY_CLASS。如果一个线程长时间以最高优先级运行,系统中的其他线程将无法获得处理器时间。高优先级类应保留给必须响应时间关键事件的线程。 [...]
重要的一点是,高优先级线程应该执行很短的时间,并且仅当它有时间关键的工作要执行时。

您几乎不应该使用REALTIME_PRIORITY_CLASS,因为这会中断管理鼠标输入、键盘输入和后台磁盘刷新的系统线程。此类适用于直接与硬件“对话”或执行应具有有限中断的简短任务的应用程序。

推荐阅读:当你将 100% CPU 程序设置为实时优先级时,你就会得到你想要的

对于几乎所有任务,通常最好将优先级保留为默认值 ( NORMAL_PRIORITY_CLASS- THREAD_PRIORITY_NORMAL) - 您仍然可以获得充足的 CPU 时间,但不会耗尽也需要一些 CPU 时间的任何其他应用程序。

  • 如果您的应用程序确实对时间至关重要,您可以暂时将优先级提高到高。
  • 仅当您实际与需要精确计时的硬件设备通信时才应使用实时优先级。

  • @Anas,只要你的进程中实际上只有 1 个线程在运行,你可能就没问题,这是真的。但请记住,通过将进程优先级设置为“REALTIME_PRIORITY_CLASS”,会自动将该进程中所有线程的优先级增加到至少 16 的基本优先级(即实时),并且无法将单个线程降低到非优先级。即时的。这也意味着进程中的 winapi 线程池以及您在程序中直接(或间接)创建的任何其他线程也将实时运行。 (2认同)
  • *“然后他搬起石头砸自己的脚,并要求被宠爱一下。”* (2认同)
  • @Anas BTW:您的系统上可能有绑定到特定 CPU 的线程,并且无法移开。他们只会挨饿。至少从常规优先事项开始,看看它是否会带来任何好处,然后再直接进行每个人*包括编写系统的人*都警告您的“破坏系统”设置 (2认同)