简单谈谈Linux内核定时器

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

软件意义上的定时器最终依赖硬件定时器来实现, 内核在时钟中断发生后检测各定时器是否到期 , 到期后的定时器处理函数将作为软中断在底半部执行 。实质上,时钟中断处理程序会 换起TIMER_SOFTIRQ软中断 ,运行当前处理器上到期的所有定时器。

总结起来还是软中断的流程

a.注册软中断处理函数

/*/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.触发软中断处理函数

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 结构体的实例对应一个定时器,其定义如下:

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) 初始化定时器

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);

相关文章

  • Xshell实现Windows上传文件到Linux主机的方法

    Xshell实现Windows上传文件到Linux主机的方法

    这篇文章主要介绍了Xshell实现Windows上传文件到Linux主机的方法,需要的朋友可以参考下
    2017-12-12
  • Ubuntu 16.04与Apache虚拟主机配置的步骤详解

    Ubuntu 16.04与Apache虚拟主机配置的步骤详解

    这篇文章主要给大家介绍了关于Ubuntu 16.04与Apache虚拟主机配置的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用ubuntu16.04系统具有一定的参考学习价值,需要的朋友们来一起看看吧。
    2018-04-04
  • 详述Linux中Firewalld高级配置的使用

    详述Linux中Firewalld高级配置的使用

    这篇文章主要介绍了详述Linux中Firewalld高级配置的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • VirtualBox 未指定要bridged的网络界面的解决办法

    VirtualBox 未指定要bridged的网络界面的解决办法

    这篇文章主要介绍了VirtualBox 未指定要bridged的网络界面的解决办法的相关资料,希望通过本文能帮助到大家,让大家解决遇到这样的问题,需要的朋友可以参考下
    2017-10-10
  • Linux中关于inode的知识总结

    Linux中关于inode的知识总结

    这篇文章主要给大家介绍了在Linux中关于inode的相关资料,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-06-06
  • Linux shell tr 命令详解

    Linux shell tr 命令详解

    这篇文章主要介绍了Linux shell tr 命令详解的相关资料,需要的朋友可以参考下
    2017-01-01
  • ubuntu (linux)修改网卡名称命令

    ubuntu (linux)修改网卡名称命令

    这篇文章主要介绍了ubuntu (linux)修改网卡名称命令的相关资料,这里提供了实现的命令代码,需要的朋友可以参考下
    2016-11-11
  • Linux中samba服务器的搭建教程

    Linux中samba服务器的搭建教程

    这篇文章主要为大家详细介绍了Linux中samba服务器的搭建教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • linux服务器磁盘爆满的处理方案

    linux服务器磁盘爆满的处理方案

    文章描述了Linux服务器磁盘爆满导致Redis服务无法访问的问题,通过一系列命令查找并删除大文件,解决了磁盘空间不足的问题,同时,文章介绍了如何配置Nacos以防止日志文件过大导致磁盘空间爆满,需要的朋友可以参考下
    2025-02-02
  • SSH 登录工具常用命令

    SSH 登录工具常用命令

    既然申请了国外的主机,那么SSH登录工具肯定是必不可少的,这里罗列一些常用的SSH命令,以备查用。
    2009-02-02

最新评论