Linux内核设计与实现 - 第11章 定时器和时间管理
目录
- 11.1 内核中的时间概念
- 11.2 硬件时钟源
- 11.3 jiffies和HZ
- 11.4 定时器实现
- 11.5 高精度定时器(hrtimer)
- 11.6 延迟执行机制
- 11.7 时间管理实践
11.1 内核中的时间概念
-
墙上时间(Wall Time)
- 实际日期和时间
- 通过RTC(实时时钟)获取
- 用户空间通过
time()
/gettimeofday()
获取
-
系统运行时间(Uptime)
- 自系统启动以来的时间
- 不受系统时间修改影响
- 通过
/proc/uptime
查看
-
单调时间(Monotonic Time)
- 保证单向递增的时间
- 不受NTP调整影响
- 适合测量时间间隔
11.2 硬件时钟源
-
RTC(实时时钟)
- 独立供电的硬件时钟
- 精度较低(秒级)
- 提供系统初始时间
-
TSC(时间戳计数器)
- CPU内部64位寄存器
- 高精度(纳秒级)
- 受CPU频率变化影响
-
HPET(高精度事件定时器)
- 专门的时间计数硬件
- 精度可达100纳秒
- 支持多个比较器
11.3 jiffies和HZ
-
jiffies机制
- 全局变量
jiffies
- 记录自启动以来的时钟滴答数
- 32位系统使用
jiffies_64
避免回绕
- 全局变量
-
HZ参数
- 定义每秒时钟中断次数
- 典型值:100, 250, 300, 1000
- 高HZ值提高响应速度但增加开销
-
时间转换函数
jiffies_to_msecs(unsigned long j); // jiffies转毫秒 msecs_to_jiffies(unsigned int m); // 毫秒转jiffies
11.4 定时器实现
-
定时器结构
struct timer_list {struct list_head entry;unsigned long expires;void (*function)(unsigned long);unsigned long data;... };
-
定时器API
init_timer(struct timer_list *timer); // 初始化定时器 add_timer(struct timer_list *timer); // 激活定时器 mod_timer(struct timer_list *timer, unsigned long expires); // 修改定时器 del_timer(struct timer_list *timer); // 删除定时器
-
实现注意事项
- 定时器函数在中断上下文执行
- 不能睡眠或调用可能阻塞的函数
- 需要处理竞争条件
11.5 高精度定时器(hrtimer)
-
hrtimer特点
- 纳秒级精度
- 基于红黑树实现
- 支持多种时钟源
-
hrtimer API
hrtimer_init(struct hrtimer *timer, clockid_t which_clock, enum hrtimer_mode mode); hrtimer_start(struct hrtimer *timer, ktime_t tim, const enum hrtimer_mode mode); hrtimer_cancel(struct hrtimer *timer);
-
使用场景
- 多媒体应用
- 实时系统
- 性能分析工具
11.6 延迟执行机制
-
忙等待
udelay(unsigned long usecs); // 微秒级延迟 ndelay(unsigned long nsecs); // 纳秒级延迟
-
调度延迟
msleep(unsigned int msecs); // 毫秒级睡眠 ssleep(unsigned int seconds); // 秒级睡眠
-
工作队列延迟
schedule_delayed_work(struct delayed_work *dwork, unsigned long delay);
11.7 时间管理实践
-
性能测量
ktime_get(); // 获取当前时间 ktime_sub(a, b); // 计算时间差
-
超时处理
wait_event_timeout(wq, condition, timeout);
-
节流控制
unsigned long usecs_to_jiffies(const unsigned int u);