4

我不明白如何使用SetThreadPrioritySetPriorityClass降低和提高线程的优先级。

我的理解是SetPriorityClass选择进程可用的优先级范围并SetThreadPriority设置类中的相对优先级。

例如,对线程执行此操作的结果是什么:

SetPriorityClass(GetCurrentProcess(), PROCESS_MODE_BACKGROUND_BEGIN);

SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_END);

感谢帮助。

4

2 回答 2

4

PROCESS_MODE_BACKGROUND_BEGIN我观察到但显然没有记录的一件事是,至少在 Windows 7 下,无论进程如何访问内存,它都会永久清空进程的工作集- 直到后台模式结束。

例如,通常没有PROCESS_MODE_BACKGROUND_BEGIN,当我的机器有千兆字节的空闲内存,并且进程需要消耗并不断处理千兆字节的内存时,进程工作集将大约等于分配大小。也就是说,该进程获得了它在其工作集中使用的所有内存。好的。
现在,工作集PROCESS_MODE_BACKGROUND_BEGIN将有几十兆! 不好的结果是,这会导致不断的页面错误并且计算运行得更慢!页面错误可能不是页面文件,而是 Windows 缓存。但是页面错误仍然会显着降低计算速度,同时也会导致 CPU 被无意义的负载消耗。

总之,PROCESS_MODE_BACKGROUND_BEGIN不适合低优先级的后台工作。这项工作会非常省时又省力
PROCESS_MODE_BACKGROUND_BEGIN仅当进程确实不打算在后台执行任何消耗操作时才适用。

相反THREAD_MODE_BACKGROUND_BEGIN即使线程是进程中的唯一线程,也不会产生如此可怕的影响。
另请注意,您需要永久关闭PROCESS_MODE_BACKGROUND_BEGIN,仅使用PROCESS_MODE_BACKGROUND_END. THREAD_MODE_BACKGROUND_END调用after是不够的PROCESS_MODE_BACKGROUND_BEGIN
因此,Arno 的说法并不完全正确,即THREAD_MODE_BACKGROUND_END取消PROCESS_MODE_BACKGROUND_BEGIN了单个线程的影响。

附加说明:SetProcessPriorityBoostwithbDisablePriorityBoost = TRUE对工作集没有任何此类影响。

于 2015-05-28T14:23:40.380 回答
3

进程优先级和线程优先级正在构建base priority线程。请参阅调度优先级以了解如何组合优先级。通过查看此列表,您可以清楚地看出您的理解是正确的;在某个优先级内,base priority可以有不同的值,由thread priority.

并非所有 Windows 版本都支持value PROCESS_MODE_BACKGROUND_BEGINfor和value for 。SetPriorityClassTHREAD_MODE_BACKGROUND_ENDSetThreadPriority

PROCESS_MODE_BACKGROUND_BEGIN: 系统降低进程(及其线程)的资源调度优先级,使其可以在不显着影响前台活动的情况下执行后台工作。

THREAD_MODE_BACKGROUND_END: 结束后台处理模式。系统将线程的资源调度优先级恢复为线程进入后台处理模式之前的状态。

这里所讨论的场景的后果是可以预测的:SetPriorityClass将把进程及其所有线程设置为background processing mode. 以下SetThreadPriority只会从 中释放 a 线程background processing mode。但是该进程的所有其他可能线程将保持在后台处理模式。

注意:只有 和 的process priority class 组合 thread priority决定base priority. 因此,无论是调用GetThreadPriority还是调用都GetPriorityClass不会返回基本优先级。只有它们的组合才会释放上面“调度优先级”链接中描述的基本优先级。不幸的是,新background processing mode值尚未包含在base priority列表中。但是名称base priority说明了这里的重要性:基于基本优先级(从进程优先级和线程优先级派生),调度程序可以动态调整调度优先级。后台模式只是fine tune调度优先级的另一种方式。另一种方法是优先级提升。优先级提升功能存在了一段时间。新的访问权限background processing modeSetThreadPrioritySetPriorityClass直接打开优先级提升能力。在 Windows XP 中,这必须通过调用SetProcessPriorityBoost来完成。

于 2012-11-30T09:07:32.880 回答