时钟中断
大部分PC 机中有两个时钟源,他们分别叫做RTC 和OS(操作系统)时钟。RTC(Real Time Clock,实时时钟)也叫做CMOS 时钟,它是PC 主机板上的一块芯片(或者叫做时钟电路),它靠电池供电,即使系统断电,也可以维持日期和时间。由于它独立于操作系统,所以也被称为硬件时钟,它为整个计算机提供一个计时标准,是最原始最底层的时钟数据。
OS 时钟产生于PC 主板上的定时/计数芯片(8253/8254),由操作系统控制这个芯片的工作,OS 时钟的基本单位就是该芯片的计数周期。在开机时操作系统取得RTC 中的时间数据来初始化OS时钟,然后通过计数芯片的向下计数形成了OS 时钟,所以OS 时钟并不是本质意义上的时钟,它更应该被称为一个计数器。OS 时钟只在开机时才有效,而且完全由操作系统控制,所以也被称为软时钟或系统时钟。
Linux 的OS 时钟的物理产生原因是可编程定时/计数器产生的输出脉冲,这个脉冲送入CPU,就可以引发一个中断请求信号,我们就把它叫做时钟中断。Linux 中用全局变量jiffies 表示系统自启动以来的时钟滴答数目。每个时钟滴答,时钟中断得到执行。时钟中断执行的频率很高:100 次/秒(Linux 设计者将一个“时钟滴答”定义为10ms),时钟中断的主要工作是处理和时间有关的所有信息、决定是否执行调度程序。和时间有关的所有信息包括系统时间、进程的时间片、延时、使用CPU 的时间、各种定时器,进程更新后的时间片为进程调度提供依据,然后在时钟中断返回时决定是否要执行调度程序。
在 Linux 2.6 中,系统时钟每 1 ms中断一次(时钟频率,用 HZ 宏表示,定义为 1000,即每秒中断 1000 次,2.4 中定义为 100,很多应用程序也仍然沿用 100 的时钟频率)
3、Tick(节拍)
Tick是HZ的倒数,即系统计时器 interrupt每发生一次中断的时间(两次连续间隔)。如HZ为250时(linux2.5时设定值),tick为4ms(millisecond)。
[root@k3master ~]# cat /boot/config-`uname -r` | grep 'CONFIG_HZ='
CONFIG_HZ=1000 //这个就是内核hz //1秒内的中断的次数
linux的时钟中断的两个内核全局变量,分别是xtime与jiffies。
1、xtime
一个timeval结构类型变量,是从cmos电路(rtc)中取得的时间,一般是从某一历史时刻开始到现在的时间,也就是为了取得我们操作系统上显示的日期。这个就是“实时时钟”,它的精确度是微秒。获取方式是通过linux-2.6.0\linux-2.6.0\include\linux\time.h(低精度)头文件里面的do_gettimeofday函数获取。(从Linux内核获取时间函数do_gettimeofday)
复制代码 struct timespec类型的结构体变量,定义见文件linux-2.6.0\linux-2.6.0\include\linux\time.h,其声明如下: struct timespec { __kernel_time_t tv_sec; /* 秒数 / long tv_nsec; / 纳秒数,1纳秒(ns)=1e-9秒(s) */ }; extern struct timespec xtime; //1 纳秒=0.000001 毫秒 //1 纳秒=0.001 微秒 // 微秒,时间单位。一秒的一百万分之一,即1秒=10的6次方微秒。缩写为μs。 //1秒(s)=1000000微秒(μs) //纳秒:原称毫微秒,就是10^(-9)秒(10亿分之一秒),即10^(-6)毫秒(1000000分之一毫秒)。1纳秒,等于1微秒的千分之一 //此结构体用于内核记录时间,其中字段tv_sec的单位是秒(s),表示整秒数,字段tv_nsec的单位是纳秒(ns),表示不足一秒的部分,在此其取值范围是0~999999999。 复制代码
2、HZ(赫兹(Hz)是国际单位制中频率的单位,它是每秒中的周期性变动重复次数的计量)
Linux核心每隔固定周期会发出timer interrupt (IRQ 0),HZ是用来保存每一秒有几次timer interrupts。如HZ为1000,代表每秒有1000次timer interrupts。 HZ可在编译核心时设定,可设定100、250、300或1000。核心版本预设值为250。 HZ这个值可以理解为操作系统的时钟频率,这个时钟的精度远低于硬件的时钟频率。如HZ设置为250,那么为一秒钟250次,每次为4ms,因此操作系统的时钟精度只能达到4ms。
3、Tick(节拍)
Tick是HZ的倒数,即系统计时器 interrupt每发生一次中断的时间(两次连续间隔)。如HZ为250时(linux2.5时设定值),tick为4ms(millisecond)。
[root@k3master ~]# cat /boot/config-`uname -r` | grep 'CONFIG_HZ='
CONFIG_HZ=1000 //这个就是内核hz //1秒内的中断的次数
4、Jiffies
在<linux/jiffies.h>,定义了Jiffies(unsigned long)这个变量。每发生一次timer interrupt,Jiffies变数会被加一。一秒内时钟中断的次数等于HZ,所以jiffies一秒内增加的值也就是HZ。 在 Linux 2.6 中,系统时钟每 1 ms中断一次(时钟频率,用 HZ 宏表示,定义为 1000,即每秒中断 1000 次,2.4 中定义为 100,很多应用程序也仍然沿用 100 的时钟频率),这个时间单位称为一个 jiffie。jiffies 与绝对时间之间的转换, 用两个宏来完成两种时间单位的互换:JIFFIES_TO_NS()、NS_TO_JIFFIES()。jiffies是记录着从电脑开机到现在总共的时钟中断次数。
...