图解|Linux内核低精度定时器原理
💡
原文中文,约7000字,阅读约需17分钟。
📝
内容提要
在Linux操作系统中,定时器扮演关键角色,用于执行延迟任务。Linux内核有高精度和低精度两种定时器。低精度定时器基于时钟中断实现,使用时间轮数据结构快速查找到期定时器。定时器根据超时时间存放在不同级别的数组中,每个数组有一个到期指针。定时器在时钟中断中执行,到期指针移动到下一个位置。内核使用timer_list对象表示定时器,通过add_timer函数添加定时器,run_timer_list函数执行到期定时器。
🎯
关键要点
- 在Linux操作系统中,定时器用于执行延迟任务。
- Linux内核有高精度和低精度两种定时器,低精度定时器基于时钟中断实现。
- 低精度定时器的精度由HZ值决定,通常设置为每秒1000次。
- 高精度定时器的精度更高,但运行成本也更高,因此低精度定时器更经济实用。
- 低精度定时器使用时间轮数据结构快速查找到期定时器,时间复杂度为log(1)。
- 时间轮通过数组保存定时器,索引为定时器的过期时间。
- 内核使用层级概念减少数组占用的内存空间,将超时时间划分为5个等级。
- 每个级别的数组存放不同范围的定时器,超时时间越小,存放的数组层级越小。
- 内核通过到期指针选择到期的定时器来执行,执行完后指针移动到下一个位置。
- 内核使用timer_list对象表示定时器,通过add_timer函数添加定时器,run_timer_list函数执行到期定时器。
❓
延伸问答
Linux内核中的低精度定时器是如何工作的?
低精度定时器依赖于时钟中断实现,使用时间轮数据结构快速查找到期定时器,时间复杂度为log(1)。
低精度定时器的精度由什么决定?
低精度定时器的精度由HZ值决定,通常设置为每秒1000次,即每1毫秒一次时钟中断。
为什么不全面使用高精度定时器?
高精度定时器虽然精度更高,但运行成本也更高,因此在对时间精度要求不高的场合,低精度定时器更经济实用。
时间轮数据结构是如何存储定时器的?
时间轮通过数组保存定时器,索引为定时器的过期时间,定时器根据超时时间存放在不同级别的数组中。
内核如何执行到期的定时器?
内核通过到期指针选择到期的定时器执行,执行完后指针移动到下一个位置,确保定时器按时执行。
Linux内核中如何添加定时器?
可以使用add_timer函数添加定时器,首先创建timer_list对象并设置到期时间和回调函数。
➡️