Windows via C/C++:线程调度——概述

基于优先级的操作系统(preemptive operating system)必须使用某种算法以决定CPU如何调度系统中的线程,本章将讨论Windows Vista使用的调度算法。 我们之前讨论过线程的上下文结构CONTEXT,其中含有线程最后一次执行时CPU寄存器组的状态。 操作系统每20毫秒检查系统中所有线程内核对象的状态,其中一些对象被认为是可调度(scheduable)的,操作系统会从可调度的对象中选择一个,并将其CONTEXT中的值加载到CPU寄存器组中,这个实现线程调度的过程被称为上下文切换(Context Switch)。

接下来,被选择的线程将在其进程地址空间中执行代码、操作数据。大概20ms之后,Windows会重新将CPU寄存器组的状态写回到该线程的CONTEXT结构中,并从其它可调度的线程内核对象中选择一个要调度的对象,将其CONTEXT结构内容加载到CPU寄存器中,这样原线程将不再运行,新线程开始运行。上下文切换会从系统启动开始持续到系统关闭。

系统只会调度可调度的线程,但事实上系统中的大多数线程都是不可高度的。比如,有些线程的暂停计数(suspend count)大于0,这意味着线程被挂起且不应该为其分配任何CPU时间,为了挂起一个线程,可以在创建线程时为CreateThread指定CREATE_SUSPEND标志,本章后面会讨论挂起已存在线程的方法(SuspendThread和ResumeThread函数)。

除了挂起的线程,其它线程可能会因为在等待某些资源而变得不可调度。比如,你打开了记事本之后什么也不做,记事本线程将处于等待状态,系统不会为直分配时间片,除非你移动其窗口或向其编辑区中键入文本,此时记事本线程变成可调度的,但这并不意味着它会立即获得CPU时间,系统只是从所有可调度的线程中按调度算法挑选一个线程执行,被调度的线程不一定会是记事本线程。

你可能感兴趣的:(Windows via C/C++:线程调度——概述)