timer-----内核定时器

来源:互联网 发布:java爬虫 使用代理ip 编辑:程序博客网 时间:2024/06/05 05:15

概述:

**********定时器的作用是:当在一个给定的时间到达时,可以来调用一个函数来执行你想完成的任务,优点是,定时器不会阻塞当前进程.

**********定时器是基于时钟滴答的,可以用来完成各种你想要去完成的任务.

**********一个内核定时器,其实是一个数据结构,在该结构内有定时器执行函数,时间一到该函数就会被执行.(在头文件<linux/timer.h>中)

定时器结构(主要关注三个成员)

struct timer_list {struct list_head entry;unsigned long expires;//表示定时器期望运行定时器函数的jiffies值void (*function)(unsigned long);//定时器执行函数unsigned long data;//传递给内核执行函数的参数struct tvec_base *base;#ifdef CONFIG_TIMER_STATSvoid *start_site;char start_comm[16];int start_pid;#endif};
**********定时器运行时和调用该定时器的进程不在同一个进程上下文中,也就是说它俩没有任何关系了,谁也影响不到谁.

**********定时器运行时,调用定时器的进程可能处的状态是:可能在睡眠,可能在一个不同的处理器上运行,可能已经退出.

**********定时器函数的执行必须是原子操作不能被打断.

**********定时器函数的运行是在调用该定时器进程的进程上下文之外运行的

**********在进程上下文之外,有一下限制条件

1.    不允许存取用户空间,因为没有进程上下文,没有和任何特定进程相关联的到用户空间的途径

2.    该进程的current指针在原子态没有意义,并且current不能使用,因为相关的代码没有和已被中断的进程有联系

3.    在进程上下文之外也不能进行睡眠或者调度.

**********内核可以通过调用in_interrupt()宏函数(包含在头文件<asm/hardirq.h>)来判断某一执行动作是否在进程上下文中,如果处理器在当前中断上下文中运行就返回0.

内核定时器的使用步骤:
**********第一步:定义和初始化定时器

struct  timer_list tl{        .expires = ,//具体值自己设定        .function = ,        .data = ,};

void init_timer(struct timer_list *timer);//初始化定时器结构体的函数

struct timer_list TIMER_INITIALIZER(_function, _expires, _data);
**********第二步:启动定时器

void add_timer(struct timer_list * timer);
**********删除定时器(这个可以在定时器没到时,用来取消定时,)

int del_timer(struct timer_list * timer);

和内核定时器有关的函数:

//修改一个定时器的超时时间
int mod_timer(struct timer_list *timer, unsigned long expires);
//删除一个定时器,并且确保在该函数返回时,定时器执行函数不在任何CPU上运行.
int del_timer_sync(struct timer_list *timer);
//判断定时器是否在调度运行,返回值:1表示在运行,0表示没有
int timer_pending(const struct timer_list * timer);


































































0 0
原创粉丝点击