首先,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.如果编写一个以内核方式运行的设备驱动程序,可以获得这些优先级的等级,而用户方式的应用程序则不能
转自 看雪安全论坛