进程(线程)的优先级越高,那么就可以分占越多的CPU时间片,每个进程都有相应的优先级,优先级决定它何时运行和占用CPU的时间。最终的优先级共分 32 级,是从 0 到 31 的数值,称为基本优先级别。
线程32个优先级,16~31是实时类别 1~15是动态类别 0是系统类别
KPROCESS.BasePriority是线程创建之后的KTHREAD.BasePriority值(线程的基本、静态优先级),这个值基本不变,KTHREAD.Priority是动态优先级。
KiComputeNewPriority 用来计算非实时优先级线程的优先级(优先级值要小于16),而且这个优先级不能超过基本优先级的值。
R3可以调节进程的基本优先级(如任务管理器),但只能调节 EPROCESS.PriorityClass ,分为未知,Idle,普通,高,实时,低于普通高于普通这几种,分别对应的基本优先级是8 4 8 13 24 6 10。而NtSetInFormationProcess可以对优先级进行微调。
SetPriorityClass(设置进程优先级)
function SetPriorityClass(hProcess: THandle; dwPriorityClass: DWORD): BOOL;
优先级 | 标志 | 优先级值 |
idle (低) | IDLE_PRIORITY_CLASS | 4 |
Below (低于标准) | BELOW_NORMAL_PRIORITY_CLASS | |
normal (标准) | NORMAL_PRIORITY_CLASS | 7或9 |
Above (高于标准) | ABOVE_NORMAL_PRIORITY_CLASS | |
high (高) | HIGH_PRIORITY_CLASS | 13 |
realtime (实时) | REALTIME_PRIORITY_CLASS |
24 |
SetThreadPriority --设置线程优先级
function SetThreadPriority(hThread: THandle; nPriority: Integer): BOOL;
线程优先级等级 | 标志 | 优先级值 |
idle (最低) | THREAD_PRIORITY_IDLE | 如果进程优先级为realtime则调整为16,其它情况为1 |
LOWEST 低 | THREAD_PRIORITY_LOWEST | -2(在原有基础上-2) |
BELOW 低于标准 | THREAD_PRIORITY_BELOW_NORMAL | -1(在原有基础上-1) |
NORMAL(标准) | THREAD_PRIORITY_NORMAL | 不变(取进程优先级值) |
ABOVE 高于标准 | THREAD_PRIORITY_ABOVE_NORMAL | +1(在原有基础上+1) |
HIGHEST(高) | THREAD_PRIORITY_HIGHEST | +2(在原有基础上+2) |
CRITICAL(最高) | THREAD_PRIORITY_TIME_CRITICAL | 如果进程优先级为realtime则调整为31,其它情况为15 |