Linux内核设备驱动之内核的时间管理笔记整理

2019-01-16 20:43:40丽君
/****************** * linux内核的时间管理 ******************/

(1)内核中的时间概念

时间管理在linux内核中占有非常重要的作用。

相对于事件驱动而言,内核中有大量函数是基于时间驱动的。

有些函数是周期执行的,比如每10毫秒刷新一次屏幕;

有些函数是推后一定时间执行的,比如内核在500毫秒后执行某项任务。

要区分:

*绝对时间和相对时间 *周期性产生的事件和推迟执行的事件

周期性事件是由系统系统定时器驱动的

(2)HZ值

内核必须在硬件定时器的帮助下才能计算和管理时间。

定时器产生中断的频率称为节拍率(tick rate)。

在内核中指定了一个变量HZ,内核初始化的时候会根据这个值确定定时器的节拍率。

HZ定义在<asm/param.h>,在i386平台上,目前采用的HZ值是1000。

也就是时钟中断每秒发生1000次,周期为1毫秒。即:

#define HZ 1000

注意!HZ不是个固定不变的值,它是可以更改的,可以在内核源代码配置的时候输入。

不同的体系结构其HZ值是不一样的,比如arm就采用100。

如果在驱动中要使用系统的中断频率,直接使用HZ,而不要用100或1000

a.理想的HZ值

i386的HZ值一直采用100,直到2.5版后才改为1000。

提高节拍率意味着时钟中断产生的更加频繁,中断处理程序也会更频繁地执行。

带来的好处有:

*内核定时器能够以更高的频率和更高的准确度运行 *依赖定时器执行的系统调用,比如poll()和select(),运行的精度更高 *提高进程抢占的准确度

(缩短了调度延时,如果进程还剩2ms时间片,在10ms的调度周期下,进程会多运行8ms。
由于耽误了抢占,对于一些对时间要求严格的任务会产生影响)

坏处有:

*节拍率要高,系统负担越重。

中断处理程序将占用更多的处理器时间。

(3)jiffies

全局变量jiffies用于记录系统启动以来产生的节拍的总数。

启动时,jiffies初始化为0,此后每次时钟中断处理程序都会增加该变量的值。

这样,系统启动后的运行时间就是jiffies/HZ秒

jiffies定义于<linux/jiffies.h>中:

extern unsigned long volatile jiffies;

jiffies变量总是为unsigned long型。

因此在32位体系结构上是32位,而在64位体系上是64位。对于32位的jiffies,如果HZ为1000,49.7天后会溢出。虽然溢出的情况不常见,但程序在检测超时时仍然可能因为回绕而导致错误。linux提供了4个宏来比较节拍计数,它们能正确地处理节拍计数回绕。

#include <linux/jiffies.h> #define time_after(unknown, known) // unknow > known #define time_before(unknown, known) // unknow < known #define time_after_eq(unknown, known) // unknow >= known #define time_before_eq(unknown, known) // unknow <= known