简单谈谈Linux内核定时器
脚本之家 / 编程助手:解决程序员“几乎”所有问题!
脚本之家官方知识库 → 点击立即使用
软件意义上的定时器最终依赖硬件定时器来实现, 内核在时钟中断发生后检测各定时器是否到期 , 到期后的定时器处理函数将作为软中断在底半部执行 。实质上,时钟中断处理程序会 换起TIMER_SOFTIRQ软中断 ,运行当前处理器上到期的所有定时器。
总结起来还是软中断的流程
a.注册软中断处理函数
1 2 3 | /*/linux/kernel.timer.c*/ void __init init_timers( void ) -->open_softirq(TIMER_SOFTIRQ, run_timer_softirq, NULL); |
b.添加timer_list到某个链表
void add_timer (struct timer_list *timer);
c.触发软中断处理函数
1 2 3 | void irq_exit( void ) -->tick_nohz_stop_sched_tick(); -->raise_softirq_irqoff(TIMER_SOFTIRQ); |
d.调用软中断处理函数
static void run_timer_softirq(struct softirq_action *h)
-->__run_timers(base);
-->遍历执行时间到达的timer_list中的定时器处理函数
在Linux设备驱动编程中,可以利用Linux内核中提供的一组函数和数据结构来完成定时触发工作或者完成某种周期性的事务。这组函数和数据结构使得驱动程序师在多数情况下不用关心具体的软件定时器究竟对应着怎样的内核和硬件行为。
1) 一个timer_list 结构体的实例对应一个定时器,其定义如下:
1 2 3 4 5 6 7 8 9 10 | struct timer_list { struct list_head entry, /*定时器列表*/ unsigned long expires, /*定时器到期时间*/ void (*function) (unsigned long ), /*定时器处理函数*/ unsigned long data, /*作为参数被传入定时器处理函数*/ struct timer_base_s *base, ... }; |
实例化 struct timer_list my_timer;
2) 初始化定时器
1 2 3 4 5 6 7 | void init_timer ( struct timer_list *timer); TIMER_INITIALIZER (_function, _expires, _data) DEFINE_TIMER (_name, _function, _expires, _data) setup_timer (); |
3) 增加定时器
void add_timer (struct timer_list *timer);
4) 删除定时器
int del_timer (struct timer_list *timer);
5) 修改定时器的expire
int mod_timer (struct timer_list *timer, unsigned long expires);

微信公众号搜索 “ 脚本之家 ” ,选择关注
程序猿的那些事、送书等活动等着你
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 reterry123@163.com 进行投诉反馈,一经查实,立即处理!
相关文章
使用 DataAnt 监控 Apache APISIX的原理解析
Apache APISIX 是一个开源的云原生 API 网关,作为 API 网关,它兼具动态、实时、高性能等特点,提供了负载均衡、动态上游、灰度发布、服务熔断、身份认证、可观测性等丰富的流量管理功能,这篇文章主要介绍了如何使用 DataAnt 监控 Apache APISIX,需要的朋友可以参考下2022-06-06
最新评论