Linux hrtimer分析(2)

原创 2011年01月18日 23:01:00

本文介绍Linux2.6.29中,配置高精度模式的hrtimer与未配置高精度模式时行为的区别。本文暂不考虑高精度模式对Linux系统时钟中断的影响。

 

在没有配置高精度模式时,hrtimer的超时在系统时钟中断的轮循中检查,所以此时hrtimer的定时精度还是以轮循的间隔为单位,精度与传统的时间轮定时器一样。

在配置高精度模式后,hrtimer的超时由struct clock_event_device的超时中断完成。clock_event_device一般来说描述的都是一个硬件定时器,其定时精度由硬件系统时钟,即晶震的频率来决定,所以精度很高,这也是高精度时钟这个名称的由来。

 

下面简要介绍一下在配置了高精度模式之后hrtimer的实现细节。

1.     添加hrtimer

在配置高精度模式后,添加hrtimer也是由函数hrtimer_start完成,这与没有配置高精度模式时一样。但是,高精度模式时,如果添加的hrtimer在红黑树的最左边一个节点,即要添加的hrtimer是将会第一个到期的hrtimer时,那么这时会调用子函数hrtimer_enqueue_reprogram重新设置clock_event_device的超时中断。

hrtimer_enqueue_reprogram

       hrtimer_reprogram

              tick_program_event

                     tick_dev_program_event

                            clockevents_program_event

                                   struct clock_event_device * pDev->set_next_event

2.     删除hrtimer

删除hrtimer时的改动与添加hrtimer一样,需要考虑删除的定时器正好是红黑树中最左边节点的情况。因为此时clock_event_device的超时中断设置的超时值正好是要删除的定时器的超时值。

3.     hrtimer的到期

未配置高精度模式时,hrtimer的到期由函数hrtimer_run_queues检查。hrtimer_run_queues是在run_local_timers中被调用,而run_local_timers又是在系统时钟中断中被调用。从这里可以看出,与传统的使用时间轮算法的定时器一样,hrtimer在未配置高精度模式时采用了在每一个系统时钟中断中轮循的方式来判断hrtimer是否到期,因此,这里的定时精度为时钟中断轮循的时间间隔。

但是,在函数hrtimer_run_queues的开始处,会执行一项检查:

       if (hrtimer_hres_active())

              return;

所以在配置高精度模式后,这里的hrtimer_run_queues函数相当于空函数,会直接返回。

配置了高精度模式之后,hrtimer的到期由clock_event设备的中断处理来调用,处理函数为hrtimer_interrupt。注意这里不再采用传统的轮循方式判断定时器是否到期,而是通过设置clock_event_device的延时中断,在第一个到期的定时器超时的时间点触发一个中断来执行超时操作。所以,这里的定时精度由clock_event_device的计时精度决定。

4.     软中断

未配置高精度模式时,如果hrtimer设置了软中断标记位,触发其超时处理的软中断为TIMER_SOFTIRQ。配置高精度模式后,系统为hrtimer分配了一个专用的软中断,软中断编号为HRTIMER_SOFTIRQ

Linux时间子系统之六:高精度定时器(HRTIMER)的原理和实现

上一篇文章,我介绍了传统的低分辨率定时器的实现原理。而随着内核的不断演进,大牛们已经对这种低分辨率定时器的精度不再满足,而且,硬件也在不断地发展,系统中的定时器硬件的精度也越来越高,这也给高分辨率定时...

Linux hrtimer分析--配置高精度模式

转自:http://blog.csdn.net/walkingman321/article/details/6151172 本文介绍Linux2.6.29中,配置高精度模式的hrtimer与未配...

Linux hrtimer分析--未配置高精度模式

转自:http://blog.csdn.net/walkingman321/article/details/6133171 本文分析了Linux2.6.29中hrtimer的实现。   Linu...
  • MyArrow
  • MyArrow
  • 2011年12月10日 17:02
  • 2367

Linux hrtimer分析(二)

原文地址:http://blog.csdn.net/walkingman321/article/details/6151172 本文介绍Linux2.6.29中,配置高精度模式的hrtime...

Linux:高精度定时器(HRTIMER)的原理和实现

http://blog.csdn.net/droidphone/article/details/8074892 上一篇文章,我介绍了传统的低分辨率定时器的实现原理。而随着内核的不断演进,大牛们已经对...

Linux时间子系统之七:定时器的应用--msleep(),hrtimer_nanosleep()

Linux时间子系统之七:定时器的应用--msleep(),hrtimer_nanosleep() 分类: Linux时间管理系统 Linux内核架构2012-10-23 22:04 1...

Linux时间子系统之六:高精度定时器(HRTIMER)的原理和实现

上一篇文章,我介绍了传统的低分辨率定时器的实现原理。而随着内核的不断演进,大牛们已经对这种低分辨率定时器的精度不再满足,而且,硬件也在不断地发展,系统中的定时器硬件的精度也越来越高,这也给高分辨率定时...

彻底实现Linux TCP的Pacing发送逻辑-高精度hrtimer版

代码的实现是简单的,背后的思绪是复杂的。        如果单纯的将《彻底实现Linux TCP的Pacing发送逻辑-普通timer版》中的timer_list换成hrtimer,必然招致失败。因为...
  • dog250
  • dog250
  • 2017年01月14日 08:36
  • 4219

Linux时间子系统之六:高精度定时器(HRTIMER)的原理和实现

上一篇文章,我介绍了传统的低分辨率定时器的实现原理。而随着内核的不断演进,大牛们已经对这种低分辨率定时器的精度不再满足,而且,硬件也在不断地发展,系统中的定时器硬件的精度也越来越高,这也给高分辨率定时...

Linux时间子系统之七:定时器的应用--msleep(),hrtimer_nanosleep()

我们已经在前面几章介绍了低分辨率定时器和高精度定时器的实现原理,内核为了方便其它子系统,在时间子系统中提供了一些用于延时或调度的API,例如msleep,hrtimer_nanosleep等等,这些A...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux hrtimer分析(2)
举报原因:
原因补充:

(最多只允许输入30个字)