现在的位置: 首页 > 综合 > 正文

第七章 线程的调度、优先级和亲缘性(4)

2013年03月06日 ⁄ 综合 ⁄ 共 917字 ⁄ 字号 评论关闭
六、运用结构环境
环境结构使得系统能够记住线程的状态,这样,当下次线程拥有可以运行的C P U时,它就能够找到它上次中断运行的地方。
Windows实际上允许查看线程内核对象的内部情况,以便抓取它当前的一组 C P U寄存器。若要进行这项操作,只需要调用G e t T h r e a d C o n t e x t函数
BOOL GetThreadContext(HANDLE hThread , PCONTEXT pContext );
指定一个CONTEXT结构,对某些标志(该结构的ContextFlags成员)进行初始化,指明想要收回哪些寄存器,并将该结构的地址传递给GetThreadContext。然后该函数将数据填入你要求的成员.调GetThreadContext之前,应该调用SuspendThread,否则,线程可能被调度,而且线程的环境可能与你收回的不同(一个线程实际上有两个环境。一个是用户方式,一个是内核方式)。它只能返回线程的用户方式环境。
BOOL SetThreadContext(HANDLE hThread, CONST CONTEXT *pContext);
将新寄存器值放回线程的内核对象中, 修改其环境的线程应该首先暂停,否则其结果将无法预测。调用SetThreadContext之前,必须再次对CONTEXT的ContextFlags成员进行初始化。
七、线程的优先级
每个线程都会被赋予一个从0(最低)到3 1(最高)的优先级号码。当系统确定将哪个线程分配给CPU时,先查看有无优先级为3 1的线程可以调度,如果有就将该线程赋予一个CPU。在该线程的时间片结束时,系统再查看是否还有另一个优先级为3 1的线程可以运行,如果有,则调度之。如果无则查看有无优先级为30的线程可调度,以此类推。
低优先级的线程在运行时系统发现一个高优先级的线程准备要运行,那么系统就会立即暂停低优先级线程的运行(即使它处于它的时间片中) ,并将CPU分配给高优先级线程,使它获得一个完整的时间片。
当系统引导时,它会创建一个特殊的线程,称为 0页线程。该线程被赋予优先级0,它是整个系统中唯一的一个在优先级0上运行的线程。当系统中没有任何线程需要执行操作时,0页线程负责将系统中的所有空闲R A M页面置0。

抱歉!评论已关闭.