SetProcessInformation 函数 (processthreadsapi.h)
设置指定进程的信息。
语法
BOOL SetProcessInformation(
[in] HANDLE hProcess,
[in] PROCESS_INFORMATION_CLASS ProcessInformationClass,
LPVOID ProcessInformation,
[in] DWORD ProcessInformationSize
);
参数
[in] hProcess
进程的句柄。 此句柄必须具有 PROCESS_SET_INFORMATION 访问权限。 有关详细信息,请参阅 进程安全性和访问权限。
[in] ProcessInformationClass
指定要设置的信息类型的 PROCESS_INFORMATION_CLASS 枚举的成员。
ProcessInformation
指向包含由 ProcessInformationClass 参数指定的信息类型的对象的指针。
如果 ProcessInformationClass 参数 ProcessMemoryPriority,则此参数必须指向 MEMORY_PRIORITY_INFORMATION 结构MEMORY_PRIORITY_INFORMATION 结构。
如果 ProcessInformationClass 参数 ProcessPowerThrottling,则此参数必须指向 PROCESS_POWER_THROTTLING_STATE 结构。
如果
如果
[in] ProcessInformationSize
由 ProcessInformation 参数指定的结构的大小(以字节为单位)。
如果 ProcessInformationClass 参数 ProcessMemoryPriority,则必须 sizeof(MEMORY_PRIORITY_INFORMATION)
此参数。
如果 ProcessInformationClass 参数 ProcessPowerThrottling,则必须 sizeof(PROCESS_POWER_THROTTLING_STATE)
此参数。
如果 ProcessInformationClass 参数 ProcessLeapSecondInfo,则必须 sizeof(PROCESS_LEAP_SECOND_INFO)
此参数。
返回值
如果函数成功,则返回值为非零。
如果函数失败,则返回值为零。 若要获取扩展的错误信息,请调用 GetLastError。
言论
为了帮助提高系统性能,应用程序应使用具有 ProcessMemoryPriority 的 SetProcessInformation 函数来降低线程的默认内存优先级,这些线程执行后台操作或访问文件和数据不应很快再次访问。 例如,文件索引应用程序可能会为执行索引任务的进程设置较低的默认优先级。
内存优先级 有助于确定 工作集中的页面在剪裁之前 的时长。 进程的内存优先级确定由该进程的线程添加到进程工作集中的物理页面的默认优先级。 当内存管理器剪裁工作集时,它会在优先级较高的页面之前剪裁较低的优先级页。 这提高了整体系统性能,因为更高的优先级页面不太可能从工作集中剪裁,然后在再次访问页面时触发页面错误。
ProcessPowerThrottling 允许对进程实施限制策略,在不需要最佳性能的情况下,可以使用限制策略来平衡性能和电源效率。
当进程选择启用 PROCESS_POWER_THROTTLING_EXECUTION_SPEED
时,该过程将归类为 EcoQoS。 系统将尝试通过降低 CPU 频率或使用更高效的核心等策略提高电源效率。 当工作不促成前台用户体验时,应使用 EcoQoS,这可提供更长的电池使用时间,并减少热量和风扇噪音。 不应将 EcoQoS 用于性能关键或前台用户体验。 (在 Windows 11 之前,EcoQoS 级别不存在,并且该过程标记为 LowQoS)。 如果应用程序未显式启用 PROCESS_POWER_THROTTLING_EXECUTION_SPEED
,系统将使用自己的启发法自动推断服务质量级别。 有关详细信息,请参阅 服务质量。
当进程选择启用 PROCESS_POWER_THROTTLING_IGNORE_TIMER_RESOLUTION
时,将忽略进程发出的任何当前计时器解析请求。 不再保证属于进程的计时器过期,其计时器分辨率更高,从而提高电源效率。 显式禁用 PROCESS_POWER_THROTTLING_IGNORE_TIMER_RESOLUTION
后,系统会记住并遵循进程之前的任何计时器解析请求。 默认情况下,在 Windows 11 中,如果拥有窗口的进程完全遮挡、最小化或其他对最终用户不可见,并且不可听见,Windows 可能会自动忽略计时器分辨率请求,因此不能保证比默认系统分辨率更高的分辨率。
例子
以下示例演示如何使用 ProcessMemoryPriority 调用 SetProcessInformation,将低内存优先级设置为调用进程的默认值。
DWORD ErrorCode;
BOOL Success;
MEMORY_PRIORITY_INFORMATION MemPrio;
//
// Set low memory priority on the current process.
//
ZeroMemory(&MemPrio, sizeof(MemPrio));
MemPrio.MemoryPriority = MEMORY_PRIORITY_LOW;
Success = SetProcessInformation(GetCurrentProcess(),
ProcessMemoryPriority,
&MemPrio,
sizeof(MemPrio));
if (!Success) {
ErrorCode = GetLastError();
fprintf(stderr, "Set process memory priority failed: %d\n", ErrorCode);
goto cleanup;
}
以下示例演示如何使用 ProcessPowerThrottling 调用 SetProcessInformation 来控制进程的服务质量。
PROCESS_POWER_THROTTLING_STATE PowerThrottling;
RtlZeroMemory(&PowerThrottling, sizeof(PowerThrottling));
PowerThrottling.Version = PROCESS_POWER_THROTTLING_CURRENT_VERSION;
//
// EcoQoS
// Turn EXECUTION_SPEED throttling on.
// ControlMask selects the mechanism and StateMask declares which mechanism should be on or off.
//
PowerThrottling.ControlMask = PROCESS_POWER_THROTTLING_EXECUTION_SPEED;
PowerThrottling.StateMask = PROCESS_POWER_THROTTLING_EXECUTION_SPEED;
SetProcessInformation(GetCurrentProcess(),
ProcessPowerThrottling,
&PowerThrottling,
sizeof(PowerThrottling));
//
// HighQoS
// Turn EXECUTION_SPEED throttling off.
// ControlMask selects the mechanism and StateMask is set to zero as mechanisms should be turned off.
//
PowerThrottling.ControlMask = PROCESS_POWER_THROTTLING_EXECUTION_SPEED;
PowerThrottling.StateMask = 0;
SetProcessInformation(GetCurrentProcess(),
ProcessPowerThrottling,
&PowerThrottling,
sizeof(PowerThrottling));
以下示例演示如何使用 ProcessPowerThrottling 调用 SetProcessInformation 来控制进程的计时器解析。
PROCESS_POWER_THROTTLING_STATE PowerThrottling;
RtlZeroMemory(&PowerThrottling, sizeof(PowerThrottling));
PowerThrottling.Version = PROCESS_POWER_THROTTLING_CURRENT_VERSION;
//
// Ignore Timer Resolution Requests.
// Turn IGNORE_TIMER_RESOLUTION throttling on.
// ControlMask selects the mechanism and StateMask declares which mechanism should be on or off.
//
PowerThrottling.ControlMask = PROCESS_POWER_THROTTLING_IGNORE_TIMER_RESOLUTION;
PowerThrottling.StateMask = PROCESS_POWER_THROTTLING_IGNORE_TIMER_RESOLUTION;
SetProcessInformation(GetCurrentProcess(),
ProcessPowerThrottling,
&PowerThrottling,
sizeof(PowerThrottling));
//
// Always honor Timer Resolution Requests.
// Turn IGNORE_TIMER_RESOLUTION throttling off.
// ControlMask selects the mechanism and StateMask is set to zero as mechanisms should be turned off.
//
PowerThrottling.ControlMask = PROCESS_POWER_THROTTLING_IGNORE_TIMER_RESOLUTION;
PowerThrottling.StateMask = 0;
SetProcessInformation(GetCurrentProcess(),
ProcessPowerThrottling,
&PowerThrottling,
sizeof(PowerThrottling));
以下示例演示如何使用 ProcessPowerThrottling 调用 SetProcessInformation 以重置为默认系统托管行为。
PROCESS_POWER_THROTTLING_STATE PowerThrottling;
RtlZeroMemory(&PowerThrottling, sizeof(PowerThrottling));
PowerThrottling.Version = PROCESS_POWER_THROTTLING_CURRENT_VERSION;
//
// Let system manage all power throttling. ControlMask is set to 0 as we don't want
// to control any mechanisms.
//
PowerThrottling.ControlMask = 0;
PowerThrottling.StateMask = 0;
SetProcessInformation(GetCurrentProcess(),
ProcessPowerThrottling,
&PowerThrottling,
sizeof(PowerThrottling));
要求
要求 | 价值 |
---|---|
最低支持的客户端 | Windows 8 [桌面应用 |UWP 应用] |
支持的最低服务器 | Windows Server 2012 [桌面应用 |UWP 应用] |
目标平台 | 窗户 |
标头 | processthreadsapi.h (包括 Windows.h) |
库 | Kernel32.lib |
DLL | Kernel32.dll |
另请参阅
GetProcessInformation 函数、SetThreadInformation 函数、MEMORY_PRIORITY_INFORMATION 结构、SetProcessInformation 函数、PROCESS_INFORMATION_CLASS 枚举、OVERRIDE_PREFETCH_PARAMETER 结构