zoukankan      html  css  js  c++  java
  • jiffies和HZ

    全局变量jiffies用来记录自系统启动以来产生的节拍的总数。启动时,内核将该变量初始化为0,此后,每次时钟中断处理程序都会增加该变量的值。一秒内时钟中断的次数等于Hz,所以jiffies一秒内增加的值也就是Hz。系统运行时间以秒为单位,等于jiffies/Hz。
    将以秒为单位的时间转化为jiffies:
    seconds * Hz
    将jiffies转化为以秒为单位的时间:
    jiffies / Hz
    相比之下,内核中将秒转换为jiffies用的多些。
    硬件给内核提供一个系统定时器用以计算和管理时间,内核通过编程预设系统定时器的频率,即节拍率(tick rate),每一个周期称作一个tick(节拍)。Linux内核从2.5版内核开始把频率从100调高到1000(当然带来了很多优点,也有一些缺点).
    jiffies是内核中的一个全局变量,用来记录自系统启动一来产生的节拍数。譬如,如果计算系统运行了多长时间,可以用 jiffies/tick rate 来计算。jiffies定义在文件<linux/jiffies.h>中:
    extern unsigned long volatile jiffies;
    可以利用jiffies设置超时等,譬如:
    unsigned long timeout = jiffies + tick_rate * 2; // 2秒钟后超时
    if(time_before(jiffies, timeout){
    // 还没有超时
    }
    else{
    // 已经超时
    }
    • jiffies的回绕wrap around
    当jiffies的值超过它的最大存放范围后就会发生溢出。对于32位无符号长整型,最大取值为(2^32)-1,即429496795。如果节拍计数达到了最大值后还要继续增加,它的值就会回绕到0。
    内核提供了四个宏来比较节拍计数,这些宏定义在文件<linux/jiffies.h>中:
    time_before(unknown, known)
    time_after(unknown, known)
    time_before_eq(unknown, known)
    time_after_eq(unknown, known)
    比较的时候用这些宏可以避免jiffies由于过大造成的回绕问题。
    • 用户空间和HZ
    问题提出:
    在2.6以前的内核中,如果改变内核中的HZ值会给用户空间中某些程序造成异常结果。因为内核是以节拍数/秒的形式给用户空间导出这个值的,应用程序便依赖这个特定的HZ值。如果在内核中改变了HZ的定义值,就打破了用户空间的常量关系---用户空间并不知道新的HZ值。
    解决方法:
    内核更改所有导出的jiffies值。内核定义了USER_HZ来代表用户空间看到的HZ值。在x86体系结构上,由于HZ值原来一直是100,所以USER_HZ值就定义为100。内核可以使用宏jiffies_to_clock_t()将一个有HZ表示的节拍计数转换为一个由USER_HZ表示的节拍计数。

    参考:
    http://www.cnblogs.com/leaven/archive/2010/08/30/1812338.html
    http://www.cnblogs.com/simonshi/archive/2010/12/13/1694819.html

  • 相关阅读:
    CCF NOI1006 捡石头
    POJ NOI MATH-7648 蓄水池水管问题
    CCF NOI1005 存款收益
    CCF NOI1004 填充矩形
    CCF NOI1003 猜数游戏
    CCF NOI1002 三角形
    Project Euler Problem 26 Reciprocal cycles
    HDU1799 循环多少次?
    CCF NOI1001 温度转换
    POJ NOI MATH-7647 余数相同问题
  • 原文地址:https://www.cnblogs.com/embedded-linux/p/6091468.html
Copyright © 2011-2022 走看看