Windows系统的线程调度

1. 线程调度的一般过程

一个线程在创建的时候,内核会为其创建一个内核对象,在该内核对象中有一个成员变量叫做上下文结构,其中存储的是CPU最后运行该线程时CPU寄存器的值,这样当该线程再次被调度运行的时候,CPU就读取上下文结构中的数据,实现继续对该线程执行。

大体的调度过程是:CPU每隔20ms左右就会检查一遍所有的线程内核对象,通过其结构中的暂停计数器的值,判断是否可被调度,如果可以被调度,则加载该线程,读取其上下文结构,继续执行该线程未完的代码。

如果所有运行的线程都具有相同的优先级,那么线程调度的过程就如上面所示。但是由于windows操作系统是一个抢先式的操作系统,因此任何一个线程都有可能在时间片未到的时候被其他的线程打断。

2. 暂停和恢复线程的运行

当使用CreateThread创建一个线程的时候,内核创建的内核对象中将会有一个暂停计数器的变量,用来表示当前的线程或者进程暂停的次数,因为当一个线程或进程创建的时候,它需要一定时间去初始化,因此开始时该计数器为1,当初始化结束后,系统会查看在创建的时候是否设置了CREATE_SUPENDED标志,如果设置了(一般这么设置是为了让线程先挂起不执行任何该线程代码,然后在挂起期间改变线程的运行环境,比如优先级,然后再恢复运行,当然即使不在线程挂起时修改环境也是可以的,只不过这样线程的一部分代码将在原始环境下运行完成),则它将会一直处于暂停(挂起)状态,如果没有设置,则将计数器减为0,表示该线程对象可以被调度。

除了在创建的时候让线程暂停外,还可以使用API函数让线程暂停:

DWORD SuspendThread(HANDLE handle)

如果要解除暂停,则使用API函数:

DWORD ResumeThread(HANDLE handle)

Windows没有提供暂停和恢复进程的API函数,但是可以通过暂停和恢复该进程中所有的线程来达到目的。

3. 线程的优先级

每个线程都会被赋予一个从031的优先级号码。当系统要分配线程时间片的时候,它首先是找到所有线程中优先级别最高的一个线程进行运行,在运行期间,如果出现一个可被调度的更高优先级的线程,则会中断当前的运行,而执行更高优先级的线程,否则,一直执行到时间片用完,这时,系统会查看所有的可调度线程。

l 如果这些线程的优先级都比当前的线程优先级低,那么系统将继续执行当前的线程,其他的线程将不会得到CPU,如果经过3~5秒一直处于这样的状态,那么系统会动态的提升某些渴求调度线程的优先级,让他们占用CPU一定时间,然后再降回原来的优先级。

l 如果存在相同优先级的线程,则系统会将CPU分配给那个线程。

总的来说,优先级高的线程基本上会一直占有CPU,而不给低优先级线程以机会。同时不管当前线程的时间片是否用完,如果出现可调度的更高优先级的线程,那么就会打断当前的线程,去执行高优先级的线程。因此,高优先级的线程不应该一直占有CPU,应该注意时常将其挂起。

4. 线程优先级的设置

Windows操作系统中,不直接将线程设置为0~31中的某个级别号码,而是设置进程优先级类与相对线程优先级,通过一张映射表,得到线程具体的优先级别。

因此要设置线程的优先级的时候,首先要设置进程优先级类,主要有六个优先级类,大多数进程都处于正常优先级(默认),然后再设置相对线程优先级,主要有七个优先级,默认为正常级别。0级优先级是系统分配给0页线程的,用于当系统中没有程序运行时运行的线程,用于清除RAM

一般来说上面设置的优先级叫做线程的基本优先级,系统会动态的调整线程的优先级,通常有两种情况:

一.一些特殊时间的发生,比如按键操作等会动态的提升某些处理线程的优先级别,然后处理结束后会渐进的降回。

二.当某个高优先级的线程占用CPU时间过多时,系统会将一些优先级别低的线程提升级别,让其运行一段时间,然后再恢复。

5. 亲缘性

a) 软亲缘性:当系统给线程分配CPU时,如果所有其他因素相同的话,它将设法在上次运行该线程的CPU上执行线程。

b) 硬亲缘性:可以控制哪个CPU运行哪个线程

可以通过调用GetSystemInfo函数获得当前计算机的信息,包括几个CPU

我们可以设置亲缘性:

i. 使用SetProcessAffinityMask设置进程的亲缘性,让指定进程中的所有线程都在指定的CPU上工作。

ii. 使用SetThreadAffinityMask设置线程的亲缘性,让指定线程在指定的CPU上运行。

需要注意的是:有时强制将一个线程分配给特定的CPU的做法是不妥当的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值