timer-----内核定时器

概述:

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

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

**********一个内核定时器,其实是一个数据结构,在该结构内有定时器执行函数,时间一到该函数就会被执行.(在头文件<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_STATS
	void *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);


































































timer-----内核定时器

上一篇:POJ 3237树链剖分


下一篇:二叉查找树的实现(BST)