Linux内核定时器

Posted 旧年不在666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux内核定时器相关的知识,希望对你有一定的参考价值。

Linux内核定时器

1、概念

  • 内核定时器用于控制某个函数(定时器处理函数)在未来的某个特定时间执行.内核定时器注册的处理函数只执行一次.处理过后即失效.

2、关键结构体

struct timer_list {
        /*
         * All fields that change during normal runtime grouped to the
         * same cacheline
         */
        struct hlist_node       entry;
        unsigned long           expires;
        void                    (*function)(unsigned long);
        unsigned long           data;
        u32                     flags;
        int                     slack;

#ifdef CONFIG_TIMER_STATS
        int                     start_pid;
        void                    *start_site;
        char                    start_comm[16];
#endif
#ifdef CONFIG_LOCKDEP
        struct lockdep_map      lockdep_map;
#endif
};
  • 主要成员:
data:传递到超时处理函数的参数,主要在多个定时器同时使用时,区别是哪个timer超时;
expires:定时器超时的时间,以linux的jiffies来衡量,例如:jiffies + (3 * HZ)
void (*function)(unsigned long):定时器超时处理函数

3、相关API函数

//定时器初始化函数
init_timer(struct timer_list*)

//激活定时器
add_timer(struct timer_list*)

//修改定时器的超时时间
mod_timer(struct timer_list *, unsigned long jiffier_timerout)

//定时器状态查询,如果在系统的定时器列表中则返回1,否则返回0
int timer_pending(const struct timer_list * timer)

//删除定时器
del_timer(struct timer_list*)

4、编程流程

//实例化一个定时器对象
static struct timer_list timer;

//编写定时器超时回调函数
static void timer_timeout_callback(unsigned long arg)
{
    //这里添加相应的逻辑
    //如果想要执行周期性的操作,这里调用mod_timer更新超时时间就好
    mod_timer(&timer, jiffies + (20 * HZ));
}

//初始化定时器
static void XXX_init(void)
{
    init_timer(&timer);
    test_timer.expires = jiffies + (20 * HZ);
    test_timer.function = timer_timeout_callback;
    test_timer.data = ((unsigned long)0);
    add_timer(&timer);
}

//删除定时器
static void XXX_exit(void)
{
	del_timer(&timer);
}

以上是关于Linux内核定时器的主要内容,如果未能解决你的问题,请参考以下文章

Linux内核--并发

linux源码分析

linux时间子系统

Linux内核定时器

Linux内核定时器

LINUX PID 1和SYSTEMD PID 0 是内核的一部分,主要用于内进换页,内核初始化的最后一步就是启动 init 进程。这个进程是系统的第一个进程,PID 为 1,又叫超级进程(代码片段