最近在看sysstat的代码时,被两个时间单位整的有点晕。在sysstat源码中,在读取/proc/stat和/proc/pid/stat的时间时,作者在程序说明中使用的是jiffies概念,但是实际上man proc看的时候,这个值是clock tick,而且在源码中使用的也是通过sysconf(_SC_CLK_TCK)获取的频率。我不知道为什么作者要以这种容易发生混乱的方式来注解代码,因为通过查看《Linux/UNIX系统编程手册》发现这两个概念完全不同,现把这两个概念抄录在下面:
- jiffies
time()和gettimeofday()等时间相关的各种系统调用的精度是受限于系统软件时钟(software clock)的分辨率,它的度量单位被称为jiffies。jiffies的大小是定义在内核源代码的常量HZ。这是内核按照round-robin的分时调度算法分配CPU进程的单位。
在2.4或以上版本的Linux/x86-32内核中,软件时钟速度是100赫兹,也就是说,一个jiffy是10毫秒。
自Linux面世以来,由于CPU的速度已大大增加,Linux/x86-32 2.6.0内核的软件时钟速度已经提高到1000赫兹。更高的软件时钟速率意味着定时器可以有更高的操作精度和时间可以拥有更高的测量精度。然而,这并非可以任意提高时钟频率,因为每个时钟中断会消耗少量的CPU时间,这部分时间CPU无法执行任何操作。
经过内核开发人员之间的讨论,最终导致软件时间频率成为一个可配置的内核的选项(包括处理器类型和特性,定时器的频率)。自2.6.13内核,时钟频率可以设置到100、250(默认)或1000赫兹,对应的jiffy值分别为10、4、1毫秒。自内核2.6.20,增加了一个频率:300赫兹,它可以被两种常见的视频帧速率25帧每秒(PAL)和30帧每秒(NTSC)整除。
- clock tick
时钟计时单元(clock tick),可以调用sysconf(_SC_CLK_TCK)来获得每秒包含的时钟计时单元数,在大多数Linux的硬件架构,sysconf(_SC_CLK_TCK)返回100。与此对应的内核常量是USER_HZ。这个值即为/proc/stat和/proc/pid/stat中记录时间的单位。