简单谈谈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);

相关文章

  • linux新文件权限设置之umask的深入理解

    linux新文件权限设置之umask的深入理解

    这篇文章主要给大家介绍了关于linux新文件权限设置之umask的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-03-03
  • 谷歌云Google Cloud 启用Ubuntu的SSH服务

    谷歌云Google Cloud 启用Ubuntu的SSH服务

    默认情况下,当 Ubuntu 最初被安装的时候,通过 SSH 进行远程访问是不被允许的,在 Ubuntu 上启用 SSH 非常的简单直接,需要的朋友可以参考下
    2023-12-12
  • Apache Spark 2.0 在作业完成时却花费很长时间结束

    Apache Spark 2.0 在作业完成时却花费很长时间结束

    大家在使用 Apache Spark 2.x 的时候可能会遇到这种现象:虽然我们的 Spark Jobs 已经全部完成了,但是我们的程序却还在执行。怎么回事呢?下面小编通过实例代码给大家介绍下
    2019-06-06
  • Linux下独立添加PHP扩展模块mbstring的方法

    Linux下独立添加PHP扩展模块mbstring的方法

    Linux下独立添加PHP扩展模块mbstring的方法,需要的朋友可以参考下。
    2010-05-05
  • Redhat 7/CentOS 7 SSH 免密登录的方法

    Redhat 7/CentOS 7 SSH 免密登录的方法

    本篇文章主要介绍了Redhat 7/CentOS 7 SSH 免密登录的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • centos7 用rpm安装mysql详解

    centos7 用rpm安装mysql详解

    这篇文章主要介绍了centos7 用rpm安装mysql详解的相关资料,需要的朋友可以参考下
    2016-10-10
  • 解决VMware安装linux系统启动后黑屏问题

    解决VMware安装linux系统启动后黑屏问题

    这篇文章主要介绍了解决VMware安装linux系统启动后黑屏问题,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-12-12
  • linux系统Ansible自动化运维部署方法

    linux系统Ansible自动化运维部署方法

    在本篇文章里小编给大家整理了关于linux系统Ansible自动化运维部署方法以及知识点总结,需要的朋友们参考下。
    2019-06-06
  • Squid集群做CDN全网加速配置分享

    Squid集群做CDN全网加速配置分享

    主服务器群,然后在利用Squid逆向缓存web80端口来加速自己的网站.各大门户网站象163,sina,chinaitlab之类基本都是使用的这种技术,好处是大大的有.比如加速了网络和可以防黑客(因为他们见到的都是CDN的主机)
    2013-04-04
  • 浅谈简单使用CentOS7防火墙及开放端口

    浅谈简单使用CentOS7防火墙及开放端口

    这篇文章主要介绍了浅谈简单使用CentOS7防火墙及开放端口,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09

最新评论