Windows线程调度策略(超详细)
Windows 采用基于优先级的、抢占调度算法来调度线程。
用于处理调度的 Windows 内核部分称为调度程序,Windows 调度程序确保具有最高优先级的线程总是在运行的。由于调度程序选择运行的线程会一直运行,直到被更高优先级的线程所抢占,或终止,或时间片已到,或调用阻塞系统调用(如 I/O)。如果在低优先级线程运行时,更高优先级的实时线程变成就绪,那么低优先级线程就被抢占。这种抢占使得实时线程在需要使用 CPU 时优先得到使用。
调度程序采用 32 级的优先级方案,以便确定线程执行顺序。优先级分为两大类:可变类包括优先级从 1〜15 的线程,实时类包括优先级从 16〜31 的线程(还有一个线程运行在优先级 0,它用于内存管理)。
调度程序为每个调度优先级采用一个队列;从高到低检查队列,直到它发现一个线程可以执行。如果没有找到就绪线程,那么调度程序会执行一个称为空闲线程的特别线程。
在 Windows 内核和 Windows API 的数字优先级之间有一个关系。Windows API 定义了一个进程可能属于的一些优先级类型。它们包括:
- IDLE_PRIORITY_CLASS
- BELOW_NORMAL_PRIORITY_CLASS
- NORMAL_PRIORITY_CLASS
- ABOVE NORMAL_PRIORITY_CLASS
- HIGH_PRIORITY_CLASS
- REALTIME_PRIORITY_CLASS
进程通常属于类 NORMAL_PRIORITY_CLASS。进程属于这个类,除非进程的父进程属于类 IDLE_PRIORITY_CLASS,或者在创建进程时指定了某个类。此外,通过 Windows API 的函数 SetPriorityClass(),进程的优先级的类可以修改。除了 REALTIME_PRIORITY_CLASS外,所有其他类的优先级都是可变的,这意味着属于这些类型的线程优先级能够改变。
具有给定优先级类的一个线程也有一个相对优先级。这个相对优先级的值包括:
- IDLE
- LOWEST
- BELOW_NORMAL
- NORMAL
- ABOVE_NORMAL
- HIGHEST
- TIME_CRITICAL
每个线程的优先级基于它所属的优先级类型和它在该类型中的相对优先级,图 2 说明了这种关系。
发表评论