Windows操作系统线程调度耍起来

Windows等常用操作系统都不是实时性操作系统,所谓不是实时性,意思是你写的程序放在这个操作系统上面运行,当程序需要睡眠2秒时,你的程序睡眠的可能不是2秒,而是2秒后能变为可调度状态,但是如果系统程序多导致系统繁忙,则你的程序可能睡10秒,也可能永远睡在那里。这就是非实时性操作系统。正常的状态下,指明睡眠2秒,会睡眠2秒零几百微秒。通过调节线程调度优先级,可以使本线程响应得比其他线程更快一些。以下总结了一些重要的概念:

1:Windows线程调度时,每个时间片为2ms,线程占用CPU时间片用完会被强制调出。调用Sleep(0)、等待事件等也会让出剩余时间片被调出。至于下一次调度是什么时候没有保证。

2:线程优先级可以在1-31之间调节,数值越大表示优先级越高。优先级高的线程会优先调度。

3:优先级低的线程饥饿数秒未得到调度,系统会自动临时提升优先级到15,之后每调度一次减1,直到优先级减回原值。

4:调用SetPriorityClass能修改进程优先级,可调节为下表中的几种:

 

5:调用SetThreadPriority能修改线程的优先级,可调节为下表中的几种:

 

6:进程优先级和线程优先级组合起来,可以算出线程的基础优先级值。基础优先级低于15的线程在饥饿时会被系统临时调节到15。

7:优先级高于15的线程被命名为实时优先级,因为优先级低于它的线程就算饿死也不可能争过它。

 

8:把线程优先级调节到11时,很少有超过1毫秒的延迟。但是这是一个相对值,在不同的机器、不同的繁忙程度结果是不一样的。

9:调节线程优先级唯一改变的就是 线程从 可调度状态变为运行状态 这个变化所用的时间缩短。

10:优先级高的线程应该大多数时候处于不可调度状态,否则对其他进程的实时性会有较大影响。

原文地址:https://www.cnblogs.com/xjjsk/p/10232878.html