
内核在硬件定时器帮助下才能进行计算和管理时间.定时器产生中断的频率称为节拍率.(HZ)定义在,在i386平台上,现在采用的HZ值为1000,即每秒发生1000次,周期为1毫秒.2.5版以后的内核都是1000,以前一直采用100.提高HZ的好处有:
1.内核定时器能够以更高的频率和更高的准确度运行.
2.依赖定是器执行的系统调用,比如poll(),运行的确精度更高.
3.提高了进程抢占的准确度.
提高HZ的确坏处有:
1.节拍率更高,系统负担过重
2.中断处理程式将占用更多的处理时间.
Jiffies
内核定义了一个全局变量jiffies.用于记录系统启动以来产生的节拍的总数.启动是,jifies 初始化为0.此后,每次执行中断处理程式都会增加该变量的值. Jiffies 定义在中:
Extern unsigned long volatile jiffies;
采用系统提供的宏来比较两个jiffies 值:linux提供了4个宏来比较节拍记数,他们能正确处理节拍记数的循环.定义如下:
#incude
#define time_after(unknown,known);
#define time_before(unknown,known);
#define time_after_eq(unknown,known);
#defien time_before_eq(unknown,known);
Unknown通常用来指jiffies,known 是需要对比的值(常常是个jiffies 加碱后计算出来的相对值)
获取当前时间:
驱动程式需要处理绝对时间,内核提供了两个结构体.定义在
1. Struct timeval {
Time_t tv_sec;
Suseconds_t tv_usec;
}; 较老,但很流行.采用秒和毫秒.
2. Struct timespec {
Tiem_t tv_sec;
Long tv_nsec;
};较新,采用秒和纳秒值保存时间.
3. Do_gettimeofday()
该函数用通常的秒或微妙来填充一个指向struct timeval 的指针变量.原形如下:
#include
Void do_gettimeofday(struct timeval *tv);
4. Current_kernel_time()
该函数能够用于获得timespec
#include
Struct timespec crrrent_kernel_time(void);
|