时钟中断周期对操作系统整体实时性的影响分析
时钟中断是操作系统最重要的中断,操作系统内核依靠时钟中断完成时间片计算和分配、定时等管理工作,是分时机制实现的基础。可以说如果没有时钟中断,操作系统将无法正常运行。时钟中断由专门的时钟芯片产生,比如PC机上的8253芯片。大多数的操作系统实现,时钟中断周期会维持在10ms到100ms之间,比如Windows操作系统,其时钟中断周期一般为10ms或者20ms。表面上看,似乎时钟中断周期越短,系统的实时性越好,因为进程或线程的运行时间片会被控制的越精确,优先级高的进程或线程会优先得到运行。但仔细分析起来,会发现实际并不是这么回事,时钟中断周期的大小与系统整体实时性关系并不十分紧密。
可用两个指标来衡量操作系统的实时性:一个是中断响应时间,即从外部中断发生,到得到操作系统处理之间的时间;另外一个是任务切入时间,即一个高优先级的线程运行所需的资源就绪,到得到调度所需的时间。时钟中断周期的大小,与这两个指标并无直接关联。
首先看中断响应时间,这个时间与硬件系统关联紧密。中断一般由外部设备引发,外部设备的控制电路连接到计算机的中断控制器上(比如PC的8259A芯片)。一旦外部设备发生中断,设备会通过一条中断引脚通知中断控制器,中断控制器根据输入引脚的状态(比如是否禁止引发中断)、输入引脚的优先级、连接到片上的其它中断引脚的情况,综合判断是否需要对该中断进行处理。如果判断结果为进一步处理,则通过CPU的中断输入(比如x86CPU的INTR信号)通知CPU。CPU并不会马上处理中断,而是有一套比较复杂的判断机制,判断是否对刚刚输入的中断进行响应。最重要的决定因素有两个:一个是CPU只会在一条指令执行完毕后才会检查中断状态,如果CPU正处于一条指令的执行过程中(需要注意的是,CPU执行一条指令,有时候会需要很多个CPU节拍的),中断是不会被处理的。另外一个因素是中断使能标志是否被清除(比如x86 CPU标志寄存器中的中断使能位)。如果使能标志被清除,则CPU也不会响应中断。只有CPU的中断使能标志位被设置、同时CPU处于指令完毕状态时,外部中断才会得到处理。一旦CPU响应外部中断,它会根据中断号(在x86CPU上,需要从中断控制器中读入),从中断向量表中选择一个中断向量,然后调用该中断向量所对应的中断处理函数,这时候才正式进入操作系统的处理范围。
可见,在这个复杂的判定处理过程中,并未涉及到时钟中断周期,即时钟中断周期与中断响应时间无关。影响中断响应时间的,是中断控制器本身处理、CPU的最大指令处理时间(处理一条指令的最大时间)、操作系统是否频繁清除中断使能标志等因素。为了尽可能的提高中断响应时间,操作系统在实现的时候,需要尽可能的避免清除中断使能标志。即使无法避免,也尽可能的减少中断关闭时间。
再考察任务切入时间。响应时间快的操作系统,在一个高优先级的线程或任务的运行资源准备就绪后,应该马上调度该线程进入运行状态,以快速处理高优先级的事件,除非系统中有更高优先级的线程或任务在运行。线程或任务的运行资源,一般是由外部中断所控制的,比如接收到一个外部输入事件,这个输入事件会被调度到一个专用的处理线程进行处理。这时候,一旦外部中断处理结束,CPU会重新调度系统中的所有线程或任务。这样处理外部事件的高优先级线程会立即得到调度,而不用等时钟中断的发生。因此这种情况下,时钟中断周期的大小,对切入时间是没有影响的。另外一种可能是,线程运行所需要的资源,是由另外的线程产生的。比如一个高优先级的线程等待一个事件对象,而该时间对象由另外的核心线程所控制。这种情况下,一旦另外的核心线程释放事件对象,等待该事件的高优先级线程也会马上得到调度,因为释放事件对象的过程是一个系统调用,在系统调用结束后,一般的操作系统也会重新调度系统中的所有线程。当然,这里的前提是在系统调用结束后,操作系统会立即重新调度所有核心线程,而不用等到时钟中断发生。有的操作系统的实现机制是,在系统调用结束后,并不会马上重新调度核心线程,而必须等到时钟中断发生后才调度。这种机制下,时钟中断的周期大小,就与整体响应时间有非常紧密的关系了。
从上面的分析来看,在实现了抢占式调度机制,同时实现了系统调用结束后即可重新调度所有线程的操作系统,其时钟中断周期与线程切入时间也是无关的。
系统时钟中断周期短的一个好处是,可以把定时器精度做得很好,比如时钟中断周期为10ms,则可以实现10ms级别的定时器。而如果系统时钟中断周期为100ms,则如果不借助于其它外部定时机制,定时器功能最多能实现100ms的精度范围。但在大多数情况下,定时器功能的精度要求并不需太高,因为定时器功能往往用在诸如网络协议等的实现中,这些功能并不需要精度非常高的定时机制。在精度要求非常高的场合,定时器是不建议使用的,因为定时器要借助于系统时钟控制芯片,在中断被关闭的情况下,可能会造成较大的定时误差,比如误差达到ms级,即时时钟中断周期非常短。这在实时性要求非常严格的系统中,是无法忍受的。
综合上述分析可见,系统时钟中断周期的大小,与操作系统的实时性无必然联系。时钟中断周期长的操作系统,其实时性不一定会差,只要它尽可能的减少中断关闭时间,同时在系统调用和外部中断结束后立即重新调度线程。相反,时钟中断周期短的操作系统,如果没有实现抢占式调度机制,其实时性也可能会很差。虽然在时钟中断周期短的情况下,定时功能会精确一些,但现实意义也不是非常大。而且在电源电量受限的嵌入式应用场景下,时钟中断太频繁,还会导致电量消耗严重。这时候为了省电,还不如把系统时钟中断周期设置得很长,以降低整体资源消耗。
欢迎加入Hello China开发技术QQ群:38467832