对linux内核中jiffies+Hz表示一秒钟的理解

jiffies在内核中是一个全局变量,它用来统计系统启动以来系统中产生的总节拍数,这个变量定义在include/linux/jiffies.h中,定义形式如下。

unsigned long volatile jiffies;

想要理解jiffies的含义,我们需要首先理解时钟  节拍率  节拍的概念。

一、时钟

时钟应用于处理器的定时信号,它使得处理器在时钟中运行,依靠信号时钟,处理器便知道什么时候能够执行它的下一个功能。在Linux系统中,时钟分为硬件时钟(又叫实时时钟)和软件时钟(又叫系统时钟)。在对内核编程中,我们经常用到的是系统时钟,系统时钟的主要任务有如下三点:

1.保证系统时间的正确性。

2.防止进程超额使用CPU。

3.记录CPU和资源消耗的统计时间。

系统时钟的初始值在系统启动时,通过读取硬件时钟获得,然后由Linux内核来维护。在系统运行中,系统时钟的更新是根据系统启动后的时钟滴答数来更新的。

实时时钟的主要作用是提供计时和产生精确的时钟中断。实时时钟是用来持久存放系统时间的设备,即便系统关闭后,它也可以靠主板上的微型电池提供的电力保持系统的计时。

二、节拍率

节拍率其实就是系统定时器产生中断的频率,所谓频率即指中断每秒钟产生多少次,即Hz(赫兹)。不同的体系结构的系统而言,节拍率不一定相同。

节拍率(Hz)的值可以在文件include/asm-x86/param.h中看到,定义如下。

#define  Hz 1000

三、节拍

节拍就是指系统中连续两次时钟中断的间隔时间,该值等于节拍率分之一,即1/Hz。因为系统再启动时已经设置了Hz,所以系统的节拍也可以确定。内核正是利用节拍来计算系统时钟和系统运行时间的。

三、jiffies变量

jiffies用来统计系统启动以来系统中产生的总节拍数。该变量在系统启动时被初始化为0,接下来没进行一次时钟中断,jiffies自动加1。因此,知道了总的节拍数,然后再除以Hz,即可知系统的运行时间(jiffies/Hz)。

对于jiffies+Hz的含义,jiffies表示当前的系统时钟中断数,Hz表示一秒后的时钟中断的增加量,假设time=jiffies+Hz,正如上面所说 ,内核正是利用节拍数来计算系统时钟和系统运行时间的,则通过jiffies+Hz即可间接表示一秒钟。

如果系统中某个程序运行一段时间后,需要比较该运行时间是否超过一秒,即可通过比较time和程序运行后的jiffies值来判断是否超过一秒。当然此时,我们需要考虑jiffies变量的回绕问题,不可直接用if(time > jiffies)来比较,linux系统提供了4个宏定义来解决用户空间利用jiffies变量进行时间比较时可能产生的回绕现象,如下所示:

[cpp] view plain copy
 
  1. #define time_after(unknown,known) ((long)(known)-(long)(unknown)<0)  
  2. <pre name="code" class="cpp">#define time_before(unknown,known) ((long)(unknown)-(long)(known)<0)  

#define time_after_eq(unknown,known) ((long)(unknown)-(long)(unknown)<=0)

[cpp] view plain copy
 
    1. #define time_before_eq(unknown,known) ((long)(unknown)-(long)(known)<=0)  
posted @ 2018-03-26 14:19  zxiaocheng  阅读(1315)  评论(0编辑  收藏  举报