| /****************** * 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 |








