采用混合时钟模式提高Linux时钟精度的方法
2 动态高精度时钟设计和实现
动态高精度时钟设计方案借鉴了KURT-Linux思想,但与其不同的是提供一个与标准Linux核心时钟并行的具有精密刻度的实时时钟,并与原核心时钟区别开。采用X86体系CPU提供的TSC作为高精度的时间标度,权衡一定时间段(如一个jiffies)内高精度定时器的数量,设置Linux时钟中断模式为标准模式、one-shot模式或高频周期时钟模式。实现了μs级定时精度的同时,降低了频繁计算和设置时钟芯片的时间代价。
下面给出关键的全局变量:
(1)time_mode:表示当前时钟工作模式。其中-1代表高频周期时钟模式,该模式下,根据需要达到的定时精度,设置时钟芯片以较高的频率产生周期性中断;0代表标准模式,时钟芯片以标准Linux默认的频率产生周期中断;1代表one-shot模式,时钟芯片被设置为单次触发状态,即每次给时钟芯片设置一个超时时间,超时事件发生时,在时钟中断处理程序中根据需要再次给时钟芯片设置一个超时时间。系统启动时设置为默认值0。
(2)SCALE:时钟精度提高比。设置高频周期模式需要的参数,用来表示所需要达到的时钟精度相对普通Linux时钟精度的提高倍数。
(3)Threshold:阈值。如果即将在某一时间段内超时的实时定时器数量大于预设值,系统设置硬件定时器工作在高频周期时钟模式。
2.1 时钟中断处理
为了加强Linux的实时功能,同时又要保持Linux的完整性,本方案的动态多模式时钟机制以模块化的方式实现有关实时部分的功能,并利用接口函数实现实时模块与Linux核心的联系。
(1)标准模式。标准模式下的中断处理首先查询实时定时器队列中是否有实时定时器在下一个系统时钟中断(jiffies+1)之前超时,即在(jiffies,jiffies+1)内是否有实时定时器要处理,根据实时定时器数量设置时钟芯片的工作模式,执行do_timer_interrupt()等函数维护系统相关时间,标记下半部。
(2)one_shot模式。one-shot模式下的中断处理先判断jiffies时钟是否到期,如果到期:
①查询实时定时器队列中是否有实时定时器在下一个系统时钟中断(tick+1)之前超时,即在(jiffies,jiffies+1)内有实时定时器要处理(其超时时间用sub_jiffies表示),然后根据实时定时器数量设置时钟芯片工作模式。
②执行do_timer_interrupt()函数等维护与系统有关的时间,并标记下半部。
如果jiffies时钟未到期,则查询实时定时器链表,根据其最早超时实时定时器的超时时间与当前时间的差值设置时钟芯片产生下一次中断的时间。
(3)高频周期时钟模式。高频周期模式下中断处理先判断jiffies时钟是否到期,如果系统时钟节拍到期,执行上述①、②模式。否则,如果有实时定时器超时,标记中断下半部;如果没有实时定时器超时则直接返回。
对超时定时器的处理都留到时钟中断下半部(softirq)处理,超时的实时定时器优先得到处理,以尽可能保证实时定时器的及时处理,随后处理普通Linux的定时器,时钟中断处理过程如图1所示。
2.2 定时器组织
普通Linux系统原有的粗粒度定时器对于内核的稳定和不要求高精度定时的非实时应用仍是合适的,只是针对有高精度定时要求的实时应用组织一个高精度定时器队列HRT_list,队列中的定时器按超时时间非降序排列,队列中第一个定时器的超时时间就是队列的最早超时时间。
原Linux内核中的定时器是通过称为CTW(Cascading Timer Wheel)的结构管理和维护,并因此使得对定时器的插入、删除等操作的时间为0(1)。本文把HRT_list队列和CTW结合起来以降低定时器处理时间、提高效率。把需要较长时间才超时的实时定时器仍旧插入到原定时器队列中,借助该队列维护。在每次系统时钟中断处理的下半部处理完超时的实时定时器后,把在下一次系统时钟中断前超时的高精度定时器从原队列移除,并插入到HRT_list队列中。因此,HRT_list队列中所需要维护的高精度实时定时器也是有限的,避免了维护一个大规模定时器队列的开销,近似实现了0(1)的系统开销。
3 性能分析与测试
3.1 性能分析
当系统中没有高精度定时器时,PIT仍以Linux系统默认的频率触发时钟中断,在每一次系统时钟中断处理过程中,只需要判断工作模式以及下一次jiffies中断前有否实时定时器超时,经测试由此而带来的处理时间不超过1us,增加系统负担<0.1%,不会影响系统的性能。当在某个时间段内系统中实时定时器不多于阈值时,系统时钟工作在类似KURT-Linux的one-shot模式,同时维持普通Linux系统时钟的稳定。而由此而带来的系统负担是可以接受的[3]。
当系统中存在大量实时定时器或在某个时间段内即将超时的实时定时器数量超过一定值(阈值)时,相对于one-shot模式需要频繁地计算下次中断时间,并重新编程在低速的ISA总线上的PIT的时间代价是可取的,证明如下:
用Thw表示中断的硬件处理时间,Tisr表示中断程序上半部执行时间,n代表某个时段内(一个jiffies内)超时的定时器数量。得到两种模式下总的时钟中断处理时间关系式:
显然,当某个时段内超时的定时器数量大于Threshold时,采用高频周期模式的时间开销就会小于one-shot模式。
- Linux实时化解决方案Xenomai的原理及应用(01-19)