现在的位置: 首页 > 操作系统 > 正文

linux时钟jiffies及其相关

2018年06月06日 操作系统 ⁄ 共 2104字 ⁄ 字号 评论关闭

参考

http://blog.chinaunix.net/u3/93893/showart_1890710.html

http://www.360doc.com/content/081203/19/36491_2046150.html

 

时间单位转换见http://blog.csdn.net/mociml/archive/2008/02/10/2087595.aspx

 

在LINUX的时钟中断中涉及至二个全局变量一个是xtime,它是timeval数据结构变量,另一个则是jiffies,首先看timeval结构
struct timeval
{
time_t tv_sec; /***second***/
susecond_t tv_usec;/***microsecond***/
}
到底microsecond是毫秒还是微秒??

1秒=1000毫秒(3个零),1秒=1000 000微秒(6个零),1秒=1000 000 000纳秒(9个零),1秒=1000 000 000 000皮秒(12个零)。
秒用s表现,毫秒用ms,微秒用us表示,纳秒用ns表示,皮秒用ps表示,他们的分级单位是千,即每次3个零。
混淆的原因找到了,由于毫秒用ms表示,所以我老是以为microsecond是毫秒,所以就把tv_usec理解错了。
microsecond查词霸也是微秒的意思(microsecond!=ms,microsecond==us),看来单位的表示迷惑了我,也迷惑了大多数人,请朋友们牢记这里,非常重要。

xtime是从cmos电路中取得的时间,一般是从某一历史时刻开始到现在的时间,也就是为了取得我们操作系统上显示的日期。这个就是所谓的“实时时钟”,它的精确度是微秒。

jiffies是记录着从电脑开机到现在总共的时钟中断次数。在linux内核中jiffies远比xtime重要,那么他取决于系统的频率,单位是Hz,这里不得不说一下频率的单位,1MHz=1000,000Hz(6个零),1KHz=1000Hz(3个零).
频率是周期的倒数,一般是一秒钟中断产生的次数,所以,假如我们需要知道系统的精确的时间单位时,需要换算了,假如我们系统的频率是200Mhz,那么一次中断的间隔是1秒/200,000,000Hz=0.000 000 005秒看一下上面我们的时间单位,对照一下小数点后面是9个零,所以理论上我们系统的精确度是5纳秒。LINUX系统时钟频率是一个常数HZ来决定的,通常HZ=100,那么他的精度度就是10ms(毫秒)。也就是说每10ms一次中断。所以一般来说Linux的精确度是10毫秒。

 

硬件给内核提供一个系统定时器用以计算和管理时间,内核通过编程预设系统定时器的频率,即节拍率(tick rate),每一个周期称作一个tick(节拍)。Linux内核从2.5版内核开始把频率从100调高到1000,时间单位 jiffies 有多长?

"在 Linux 2.6 中,系统时钟每 1 毫秒中断一次(时钟频率,用 HZ 宏表示,定义为 1000,即每秒中断 1000 次,2.4 中定义为 100,很多应用程序也仍然沿用 100 的时钟频率),这个时间单位称为一个 jiffie。"
"jiffies 与绝对时间之间的转换, 用两个宏来完成两种时间单位的互换:JIFFIES_TO_NS()、NS_TO_JIFFIES()"
from http://www-900.ibm.com/developerWorks/cn/linux/kernel/l-kn26sch/index.shtml

(当然带来了很多优点,也有一些缺点).
   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{
       // 已经超时

    }

 
  
内核提供了四个宏来比较节拍计数,这些宏定义在文件<linux/jiffies.h>中:

    time_before(unknown, known)
    time_after(unknown, known)
    time_before_eq(unknown, known)
    time_after_eq(unknown, known)

    比较的时候用这些宏可以避免jiffies由于过大造成的回绕问题。

    除了系统定时器外,还有一个与时间有关的时钟:实时时钟(RTC),这是一个硬件时钟,用来持久存放系统时间,系统关闭后靠主板上的微型电池保持计时。系统启动时,内核通过读取RTC来初始化Wall Time,并存放在xtime变量中,这是RTC最主要的作用。

抱歉!评论已关闭.