简单谈谈Linux内核定时器

 更新时间:2017年10月23日 08:30:44   作者:yangjiguang  
内核定时器用于控制某个函数(定时器处理函数)在未来的某个特定时间执行.内核定时器注册的处理函数只执行一次.处理过后即失效.

脚本之家 / 编程助手:解决程序员“几乎”所有问题!
脚本之家官方知识库 → 点击立即使用

软件意义上的定时器最终依赖硬件定时器来实现, 内核在时钟中断发生后检测各定时器是否到期 , 到期后的定时器处理函数将作为软中断在底半部执行 。实质上,时钟中断处理程序会 换起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);

蓄力AI

微信公众号搜索 “ 脚本之家 ” ,选择关注

程序猿的那些事、送书等活动等着你

原文链接:http://www.linuxidc.com/Linux/2017-10/147463.htm

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 reterry123@163.com 进行投诉反馈,一经查实,立即处理!

相关文章

  • Ubuntu下sublime中文无法输入的处理方案

    Ubuntu下sublime中文无法输入的处理方案

    本文主要是给出了Ubuntu下sublime中文无法输入的处理方案,非常的实用,遇到相同问题的小伙伴们可以参考下
    2014-11-11
  • Linux多线程编程快速入门

    Linux多线程编程快速入门

    这篇文章主要介绍了Linux多线程编程快速入门,涉及到了线程基本知识,线程标识,线程创建,线程终止,管理线程的终止等相关内容,小编觉得还是挺不错的,这里分享给大家,需要的朋友可以参考下
    2018-01-01
  • Linxu服务器上安装JDK 详细步骤

    Linxu服务器上安装JDK 详细步骤

    这篇文章主要介绍了Linxu服务器上安装JDK 详细步骤,在安装之前需要先卸载自己linux上的jdk,具体内容详情大家参考下本文
    2017-12-12
  • 使用 DataAnt 监控 Apache APISIX的原理解析

    使用 DataAnt 监控 Apache APISIX的原理解析

    Apache APISIX 是一个开源的云原生 API 网关,作为 API 网关,它兼具动态、实时、高性能等特点,提供了负载均衡、动态上游、灰度发布、服务熔断、身份认证、可观测性等丰富的流量管理功能,这篇文章主要介绍了如何使用 DataAnt 监控 Apache APISIX,需要的朋友可以参考下
    2022-06-06
  • Linux中的curl命令详解

    Linux中的curl命令详解

    大家应该都知道在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具,可以说是一款很强大的http命令行工具。它支持文件的上传和下载,是综合传输工具,但按传统,习惯称url为下载工具。本文将详细介绍Linux中的curl命令,下面来一起看看吧。
    2016-11-11
  • Linux dirname命令的具体使用

    Linux dirname命令的具体使用

    这篇文章主要介绍了Linux dirname命令的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • linux文件管理命令实例分析【显示、查看、统计等】

    linux文件管理命令实例分析【显示、查看、统计等】

    这篇文章主要介绍了linux文件管理命令,结合实例形式分析Linux文件管理的显示、查看、统计等相关操作命令使用技巧,需要的朋友可以参考下
    2020-03-03
  • linux下快速列出局域网中所有主机名(计算机名)的脚本

    linux下快速列出局域网中所有主机名(计算机名)的脚本

    这篇文章主要介绍了linux下快速列出局域网中所有主机名(计算机名)的脚本,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • 关于如何在崩溃或重启后保持Linux进程运行的解决方法

    关于如何在崩溃或重启后保持Linux进程运行的解决方法

    在计算机系统中,进程的稳定性和持久性对于确保系统正常运行至关重要,在 Linux 系统中,由于各种原因,进程可能会面临崩溃或系统重启的情况,为了确保关键进程的持续运行,我们需要采取一些措施来处理这种情况,文中给大家介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • linux增加iptables防火墙规则的示例

    linux增加iptables防火墙规则的示例

    这篇文章主要介绍了linux增加iptables防火墙规则的示例,大家在使用的时候要把规则后的中文注释去掉
    2014-01-01

最新评论