程本身不存在调度问题的,调度的是线程。我们可以在Windows任务管理器设置某个进程的优先级类,微软使用优先级类仅仅是使问题简单化。当然,通过优先级类和相对线程优先级的配合,就可以得到线程的优先级值(BASE PRIORITY LEVEL)。
Windows系统有0~31共32个优先级值。大于15以上的优先级全部是Real-time级优先级,这是最高的优先级类,通常会首先调度这些优先级的线程。High、Normal、Idle这些优先级就是平时很常用的优先级类了。我们通常是使用Normal级。
Windows会自动微调线程的优先级,以至于低优先级的不至于太“饥饿”而分配不到CPU时间。系统可以将低优先级的线程自动调到15优先级值,分配完CPU时间之后,再将它的优先级值设回原来的优先级值。但是系统只会微调Normal优先级类的进程的线程。Real-time等都不会进行自动调度。
通常程序改变自身优先级的方法是使用SetPriorityClass、SetThreadPriority等API函数。通过GetPriorityClass、GetThreadPriority函数可以获取优先级类或相对线程优先级。
|