首先,windows是以线程为调度单位的,但有时人们叙述不严谨,有时是一种习惯,特别是叙述单线程进程的时候,会使用进程调度的说法。实际上所有的调度是针对线程的。
线程被调度时,分为32个优先级数,分别为0~31优先级。线程的优先级不是使用0-31级直接设置的,而是通过进程优先级(分为6级)和线程相对进程优先级(分为7级)来设置的,即需要设置进程优先级和线程相对优先级(通常也称为线程优先级),操作系统会根据这两个优先级确定出线程调度的实际优先级。
windows支持6个进程优先级类(进程是不可调度的,进程优先级是Microsoft提出的一个抽象概念,有助于用户理解,所有的线程优先级是相对于进程优先级的),如下:
优先级类 | 标识符 |
---|---|
实时 | REALTIME_PRIORITY_CLASS |
高 | HIGH_PRIORITY_CLASS |
高于默认 | ABOVE_NORMAL_PRIORITY_CLASS |
默认 | NROMAL_PRIORITY_CLASS |
低于默认 | BELOW_NORMAL_PRIORITY_CLASS |
空闲 | IDLE_PRIORITY_CLASS |
相对优先级 | 常量标识符 |
---|---|
时间关键 | THREAD_PRIORITY_TIME_CRITICAL |
最高 | THREAD_PRIORITY_HIGHEST |
高于默认 | THREAD_PRIORITY_ABOVE_NORMAL |
默认 | THREAD_PRIORITY_NORMAL |
低于默认 | THREAD_PRIORITY_BELOW_NORMAL |
最低 | THREAD_PRIORITY_LOWEST |
空闲 | THREAD_PRIORITY_IDLE |
线程相对优先级 | 空闲 | 低于默认 | 默认 | 高于默认 | 高 | 实时 |
---|---|---|---|---|---|---|
Time-critical | 15 | 15 | 15 | 15 | 15 | 31 |
Highest | 6 | 8 | 10 | 12 | 15 | 26 |
Above normal | 5 | 7 | 9 | 11 | 14 | 25 |
Normal | 4 | 6 | 8 | 10 | 13 | 24 |
Below normal | 3 | 5 | 7 | 9 | 12 | 23 |
Lowest | 2 | 4 | 6 | 8 | 11 | 22 |
Idle | 1 | 1 | 1 | 1 | 1 | 16 |
线程优先级值没有为0的。这是因为0优先级保留给页面清零线程了。对于17,18,19,20,21,27,28,29,30.如果编写一个以内核方式运行的设备驱动程序,可以获得这些优先级的等级,而用户方式的应用程序则不能
转自 看雪安全论坛