Windows核心编程 - 线程调度、优先级和关联性(2)

1. 线程的执行时间

     一个能够返回线程已获得CPU时间量的函数 :GetThreadTimes(),

    要获取高精度的性能函数:QueryPerformanceFrequency()、QueryPerformanceCounter()

2.在实际上下文中谈CONTEXT结构

    系统使用CONTEXT结构记住线程的状态,这样线程在下一次获取CPU运行时间时,就可从上一次停止的地方开始执行。CPU上每个寄存器都有一个对应的数据成员,在x86计算机上,数据成员就是Eax,Ebx,Ecx,Edx等。

   查看线程内核对象的当前CPU寄存器状态: GetThreadContext(); 在调用GetThreadContext前应该调用SusendThead,否则系统可能正好获得调度此线程的上下文。一个线程有两个上下文,用户模式和内核模式。GetThreadContext只能返回线程的用户模式上下文,如果调用SusendThread暂停一个线程,但该线程正在内核模式执行,那么它的用户模式上下文保持不变。

3.线程优先级

    在调度程序给另一个可调度线程分配CPU之前,CPU可运行一个线程大约20ms,这是所有线程优先级都相同时的情况。每个线程都被赋予0~31的优先级数,当系统 确定给哪个线程分配CPU时,它会首先查看优先级为31的线程,并以循环的方式进行调度。

只要有优先级为31的线程可供调度,系统 就不会给优先级0~30的线程分配CPU,这种情况称为饥饿。任何时刻系统 中大多数线程都是不可调度的,例如,如果 进程的主线程调用了GetMessage,而系统看到并没有消息等待处理,系统就会暂停这个线程,取消这个线程当前时间片的剩余时间,并立即 将CPU分配给另一个等待中的线程。如果没有消息出现,供GetMessage获取,进程的主线程将一直被暂停,得不到CPU。但,一旦消息进入线程的队列, 系统 会知道主线程不应该暂停了,如果没有较高优先级的线程需要执行,系统 将给它分配CPU。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值