Linux C/C 定时器的实现原理和使用方法
时间:2021-10-25 15:36:16
[导读]定时器的实现原理定时器的实现依赖的是CPU时钟中断,时钟中断的精度就决定定时器精度的极限.那么,一个时钟中断源如何实现多个定时器呢?对于内核,简单来说就是用特定的数据结构管理众多的定时器,在时钟中断处理中判断哪些定时器超时,然后执行超时处理动作。而用户空间程序不直接感知CPU时钟...

定时器的实现原理
定时器的实现依赖的是CPU时钟中断,时钟中断的精度就决定定时器精度的极限.那么,一个时钟中断源如何实现多个定时器呢?
对于内核,简单来说就是用特定的数据结构管理众多的定时器,在时钟中断处理中判断哪些定时器超时,然后执行超时处理动作。而用户空间程序不直接感知CPU时钟中断,通过感知内核的信号、IO事件、调度,间接依赖时钟中断。
用软件来实现动态定时器常用数据结构有:时间轮、最小堆和红黑树。下面就是一些知名的实现:
Linux内核的 Hierarchy 时间轮算法Asio C Library最小堆定时器实现nginx 使用红黑树结构管理定时器事件
Linux内核定时器相关的一些相关代码:
内核启动注册时钟中断
// @file: arch/x86/kernel/time.c - Linux 4.9.7// 内核init阶段注册时钟中断处理函数static struct irqaction irq0 = { .handler = timer_interrupt, .flags = IRQF_NOBALANCING | IRQF_IRQPOLL | IRQF_TIMER, .name = "timer"};void __init setup_default_timer_irq(void){ if (!nr_legacy_irqs()) return; setup_irq(0, 





