Linux hrtimer分析--未配置高精度模式
Linux hrtimer分析--未配置高精度模式
本文分析了Linux2.6.29中hrtimer的实现。
Linux2.6中实现了一种新的定时器hrtimer。与传统定时器使用时间轮算法不同,hrtimer使用了红黑树算法。hrtimer本身可以配置成高精度和普通精度两种,在单CPU系统和多CPU系统中的实现也有区别。这里先分析最简单的配置成普通精度、单CPU的情况。配置成高精度的情况见后续文章。
1. 时钟源的定义
为了实现hrtimer,Linux为系统中每一个CPU定义了一个hrtimer_cpu_base,这个结构体的定义如下:
- struct hrtimer_cpu_base {
- raw_spinlock_t lock;
- struct hrtimer_clock_base clock_base[HRTIMER_MAX_CLOCK_BASES]; //时钟源 #define HRTIMER_MAX_CLOCK_BASES 2
- #ifdef CONFIG_HIGH_RES_TIMERS
- ktime_t expires_next;
- int hres_active;
- int hang_detected;
- unsigned long nr_events;
- unsigned long nr_retries;
- unsigned long nr_hangs;
- ktime_t max_hang_time;
- #endif
- };
- <p> </p><pre class="cpp" name="code">struct hrtimer_clock_base {
- struct hrtimer_cpu_base *cpu_base;
- clockid_t index;
- struct rb_root active;
- struct rb_node *first;
- ktime_t resolution;
- ktime_t (*get_time)(void);
- ktime_t softirq_time;
- #ifdef CONFIG_HIGH_RES_TIMERS
- ktime_t offset;
- #endif
- };
在hrtimer.c中,有为每个CPU具体定义hrtimer_cpu_base的代码:
- DEFINE_PER_CPU(struct hrtimer_cpu_base, hrtimer_bases) =
- {
- .clock_base =
- {
- {
- .index = CLOCK_REALTIME,
- .get_time = &ktime_get_real,
- .resolution = KTIME_LOW_RES,
- },
- {
- .index = CLOCK_MONOTONIC,
- .get_time = &ktime_get,
- .resolution = KTIME_LOW_RES,
- },
- }
- };
1.1 时钟源类型
可以看出,每个CPU都必须定义两个时钟源:REALTIME和MONOTONIC。REALTIME代表实时时钟,MONOTONIC代表单调递增时钟。两者的区别在于,当用户更改系统时间时,REALTIME时钟会收到影响,但MONOTONIC不受影响。这可以从它们两个的get_time函数指针看出来,REALTIME时钟指向的是ktime_get_real,MONOTONIC指向的是ktime_get。
时钟源的结构体定义为struct hrtimer_clock_base,其中有两个域struct rb_node *first和struct rb_root active,这两个域维护了hrtimer的红黑树。也就是说,每一个hrtimer_clock_base都维护了自己的一个红黑树。
hrtimer在初始化时,都需要加入到某一个时钟源的红黑树中,这个时钟源要么是REALTIME,要么是MONOTONIC,这个关联通过struct hrtimer的base域实现。
- struct hrtimer {
- struct rb_node node;
- ktime_t _expires;
- ktime_t _softexpires;
- enum hrtimer_restart (*function)(struct hrtimer *);
- struct hrtimer_clock_base *base;
- unsigned long state;
- #ifdef CONFIG_TIMER_STATS
- int start_pid;
- void *start_site;
- char start_comm[16];
- #endif
- };
|
评论暂时关闭