内核定时器

内核定时器

内核中最终的计时资源是定时器。定时器用于定时器超时处理程序在未来某个特定时间点执行,或者周期性的轮询硬件的状态。Linux提供了内核定时器完成这类工作。

定 时器的只需要执行一些初始化的操作,如:设置一个超时时间,指定超时要调用的函数,然后激活定时器就可以了。它的处理和工作队列还是有点类似的。和任务队 列一样,内核定时器并不是周期运行,它在超时后自动销毁。因此,如果要实现周期轮询,就需要在定时器执行函数返回前再次激活定时器。我理解的是下面超时处 理函数中的add_timer(&polling_timer);就是再次激活的作用,不知道是否准确。

 

一般来说,定时器都在超时后马上就会执行超时处理函数,但是也有可能被推迟到下一个时钟节拍时才能执行,所以不能用定时器来实现任何硬实时任务。

 

下面看看一个实现轮询操作的小例子:

 

 

struct timer_list polling_timer;

 

init_timer(&polling_timer);

polling_timer.data = (unsigned long)something;

polling_timer.function = polling_handler;

polling_timer.expires = jiffies + 2 * HZ;

add_timer(&polling_timer);

 

void polling_handler(unsigned long data) {

...

polling_timer.expires = jiffies + 2 * HZ;

add_timer(&polling_timer); 

}

 

jiffies是Linux内核中的一个全局变量,用来记录自系统启动以来产生的节拍的总数。启动时,内核将该变量初始化为0,此后,每次时钟中断处理程序都会增加该变量的值。因为一秒内时钟中断的次数等于HZ,所以jiffies一秒内增加的值也就为HZ。系统运行时间以秒为单位计算,就等于jiffies/HZ。

 

 

节拍率HZ是通过静态预处理定义的,在系统启动时按照HZ值对硬件进行设置。体系结构不同,HZ值就不同,在i386体系结构在include/asm-i386/param.h中定义如下:

#define HZ 1000

 

每秒钟时钟中断1000次,也就是说,在1秒里jiffies会被增加1000。因此jiffies + 2 * HZ表示推后2秒钟。

 

void init_timer(struct timer_list *timer);

 

该函数用来初始化定时器结构,其实它只将prev和next指针清零;

 

void add_timer(struct timer_list *timer);

 

该函数将定时器插入活动定时器的全局队列中,即激活定时器;

 

void mod_timer(&polling_timer, jiffies + new_delay);

 

需要更改已经激活的定时器的超时时间,则调用上面函数;

 

 

del_timer(&polling_timer);

 

如果需要在定时器超时前将定时器从链表中删除,则调用上面函数。注意:定时器超时后,系统会自动删除定时器,则不用调用上面函数。

 

 

在多处理器的情况下使用:

del_timer_sync(&polling_timer);

和del_timer函数类似,不同的是该函数确保在它返回时,定时器函数不在任何CPU上运行,大多数情况下使用该函数。再次注意:不需要为已经超时的定时器调用该函数,因为系统会自动删除。在已经从链表删除的定时器上调用del_timer()或del_timer_sync()没什么害处,所以说从定时器函数中删除定时器是一种很好的习惯。

 

 

内核定时器是在时钟中断发生后,作为软中断在下半部的上下文中执行的。所有的定时器结构都以链表的形式存储。时钟中断发生后,内核 按链表顺序依次执行。因为内核定时器发生在软中断中,因此,定时器执行函数不能够睡眠,也不能够持有信号量。如果对硬件的访问需要使用信号量同步,或者可 能睡眠(比如需要调用kmalloc内存分配,但是由于某种原因不能使用GFP_ATOMIC标志),就不能直接通过定时器来实现了。一个变通的做法是在 内核定时器执行函数里调用工作队列,在工作队列处理函数中实现对硬件的访问。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值