(转)Windows的任务调度机制

Windows是一款微内核、抢占式多任务、软实时的操作系统。Windows的任务调度主要以线程为单位进行,线程拥有33个优先级,数值为0~32,其中0为最低优先级,32为最高优先级,最高和最低优先级均保留给系统使用。用户可以使用的优先级为1~31。

Windows按照优先级高低顺序来进行任务的调度,当调度发生时,内核首先检查高优先级的线程是否 就绪,如果有发现有高优先级的线程就绪则立刻将高优先级的线程发往CPU执行。如果有高优先级的线程就绪,就不会执行低优先级的任务。不 过,windows使用成为“饥渴”的时间片分配策略,如果有线程一直渴望得到时间片但是很长时间都没有获得时间片,windows就会临时将这个线程的 优先级提高,并一次分配给2倍的时间片来执行,但是windows绝不会将这个线程的优先级提高到实时优先级范围(16~31为实时优先级范围),如果不 希望windows进行饥渴分配策略,也可以通过特定的API将该策略关闭(SetThreadPriorityBoost)。

Windows同时采用时间片策略来执行相同优先级的任务。相同优先级的线程会获得同样的时间片(一 般为2个系统Tick,在单CPU系统上一个系统Tick一般为10ms,多CPU系统上一般为15ms,可以通过 GetSystemTimeAdjustment查询)。一个线程的时间片用完后,Windows会将另外一个已经就绪的同优先级的线程发往CPU进行执 行。正在执行的线程将在线程主动放弃时间片(比如调用Sleep函数),时间片用完或Windows发现有更高优先级的线程就绪后暂停执行。

另外,Windows还存在不受优先级策略控制的线程,如DPC的处理线程,Windows中每个CPU上都有一个DPC队列,只要DPC中有等待处理的任务,Windows总是会立刻对DPC中的任务进行处理。

Windows和硬实时操作系统的区别在于,硬实时操作系统一般拥有256或更多的优先级,硬实时操 作系统的最重要特性在于中断的处理方式方面,Windows使用DPC队列方式来延时处理中断请求,在ISR中仅能执行时间非常关键的硬件寄存器操作(如 恢复清除设备中断寄存器使得设备能进行下一次中断),DPC队列按照先入先出的方式执行,这样如果系统在短时间发生大量中断而使得DPC队列中存在大量待 处理的中断请求时,时间关键的中断请求可能会在很长时间后才得到处理,使得系统丧失实时响应能力。硬实时操作系统的ISR同样一般仅能执行时间关键的硬件 寄存器操作,也必须通过任务调度切换至相关的任务上下文环境,才能访问更多的资源来进行相关的处理,但是硬实时操作系统可以根据优先级来处理中断的请求, 后发生的高优先级中断请求可以抢占低优先级中断或低优先级任务的时间片,而使得时间关键的中断请求总是能得到最优先的处理。

对各种操作系统的任务调度策略进行深入的理解之后,才能对一套应用系统的设计进行精确的把握。 Windows的调度策略很适合处理各种非事件性的数据,比如大量的流数据,可以达到很高的数据吞吐量。如果你设计的系统是需要实时响应的中断事件式的处 理,那么你可能需要考虑使用一款硬实时的操作系统,如Windows CE 5.0以上版本,或vxWorks,WindowsCE有很好的硬实时的处理能力,价格低廉,开发容易,缺点是可用软件少。而vxWorks功能强大,有 庞大的gnu软件阵容做后盾,唯一美中不足的是价格昂贵。其他免费的操作系统只会令你的项目陷入困境,如果做的是有的是时间没有钱的项目,才值得考虑。

原文:http://hi.baidu.com/dufangst/blog/item/64e796d962ae2ae077c638c2.html

原文地址:https://www.cnblogs.com/wonderKK/p/2543978.html