在Linux的内核时钟驱动中,当PIT通道0的计数器减到0时,就在IRQ0中产生一次时钟中断,也即一次时钟滴答。Linux用宏HZ来表示时钟滴答的频率。且在不同的平台上HZ有不同的定义值。对于ALPHA和IA62平台HZ的值是1024,对于SPARC、MIPS、ARM和i386等平台HZ的值都是100。
该宏在i386平台上的定义如下(include/asm-i386/param.h):
#ifndef HZ
#define HZ 100
#endif
通过以上了解到,在i386平台下,1秒种产生100次时钟滴答。那么,如果我们知道从系统启动起到当前时刻的时钟滴答数,那也就能计算出当前时刻相对于系统启动时间的相对时间了。进而可以设计出应用程序自己的定时器。
现在剩余的问题就是,我们如何获知从系统启动到当前时刻共经历了多少时间滴答呢?幸运的是,/proc/stat中的统计数据提供了我们想要的数据。/proc/stat中包含了一些内核和系统的统计信息,该数据都是自系统启动以来的各项指标的总计。
例如
> cat /proc/stat
cpu 2255 34 2290 22625563 6290 127 456 0 0
cpu0 1132 34 1441 11311718 3675 127 438 0 0
cpu1 1123 0 849 11313845 2614 0 18 0 0
其中cpu行展示了自系统启动以来,cpu执行所有各项不同操作分别消耗的时钟滴答数。"CPU[n]"代表的是第n个cpu,"CPU"行是所有CPU的累积数据。没行各有9列,分别是&