在所有外部中断中,时钟中断起着特殊的作用。因为计算机是以精确的时间进行数值运算的数据处理的,最基本的时间单元是时钟周期,例如取指令,执行指令,存取内存等,我们将要讨论的是操作系统建立的时间系统,这个时间系统是整个操作系统活动的动力。
1.时钟硬件
大部分PC中有两个时钟源,他们分别叫做RTC和OS(操作从系统)时钟。RTC(实时时钟)也叫做CMOS时钟,它是PC主机板上的一块芯片(或者叫作实时时钟电路),它靠电池供电,即系统供电,也可以维持时间和日期。由于它独立与操作系统,所以也被称之为硬件时钟,它为整个计算机提供计时标准,是最原始最底层的时钟数据。
OS时钟产生与PC主板上的定时/计数芯片,由操作系统控制这个芯片的工作,OS时钟基本单位就是该芯片的计数周期。在开机时,操作系统取得RTC中的时间数据来初始化OS时钟,然后通过计数芯片的向下计数形成了OS时钟,所以OS时钟不是本质意义上的时钟,它更应该被称为一个计数器。OS时钟只在开机时有效,而且完全由操作系统控制,所以也被称为软时钟或系统时钟。
2.时钟原型机制
不同的操作系统,RTC和OS时钟的关系是不同的。RTC是OS时钟的时间基准,操作系统通过RTC来初始化OS时钟,此后两者保持同步运行,共同维持着系统时间。所谓同步,是指操作系统在运行过程中,每隔一个人固定时间会刷新或校正RTC种的信息。
可以看到,RTC处于最底层,提供原始的时钟数据。OS时钟建立在RTC之上,初始化完成后将完全由操作系统控制,和RTC脱离关系。操作系统通过OS时钟提供给应用程序所有的时间有关的服务。因为OS时钟完全是一个软件问题,其所表达的时间由操作系统的设计者决定,将OS时钟符定义为整形还是长整形或者大到超乎想象都是由设计者决定。
3,linux时间系统
OS时钟是由可编程定时/计数器产生的输出脉冲出发中断而产生的,输出脉冲的周期叫做一个时钟节拍,计算机中的时间是以节拍为单位的,每一次时钟节拍,系统时间就回加1,操作系统根据当前时钟节拍的数目就可以得到s或ms等为单位的其他时间格式。
不同的操作系统采用不同的时间基准。定义“时间基准”的目的就是为了简化计算,这样,计算机中的时间只要表示位从这个时间基准开始的时钟节拍数就可以了。时间基准由操作系统的设计者决定的。例如DOS的时间基准就是1980年1月1日。UNIX和MINUX的时间基准是1970年1月1日上午12点,LINUX的时间基准是1970年1月1日凌晨0点。
OS时钟记录的时间也就是常说的系统时间。系统时间时已时钟节拍为单位的,而时钟中断的频率(简称节拍率)决定了一个时钟节拍的长短。节拍率是通过静态预处理定义的,也就是HZ,在系统启动时按照HZ值对硬件进行设置。体系结构不同,HZ值也不同。实际上,对于某些体系结构来说,甚至是机器不同,他的值都会不一样。
内核在文件<asm/param.h>中定义HZ的实际值,如
#define Hz 100 //内核时间频率,表示没秒产生事件中断100次。
(1)节拍数jiffies
jiffies是linux内核中的一个全局变量值,用它来表示系统自启动以来的时钟节拍数,启动时,内核将该变量初始化为0,此后,每次时钟中断处理程序都会增加该变量的值。。因为一秒内时钟中断的次数等与Hz,所以jiffies一秒内增加的值也就为Hz。系统运行时间以s为单位计算,就等于jiffies/Hz。
每次时钟中断jiffies的值都加1.
jiffies变量总是无符号长整形,因此,在32位体系结构上是32位,在64位体系结构上是64位。32位的jiffies,在时钟频率为100Hz的情况下,497天后会溢出。如果频率为1000Hz,49.7天后就会溢出。而使用64位的jiffies变量,溢出就会遥遥无期了。由于性能与历史原因,主要还考虑到与现有的内核代码的兼容性,内核开发者希望jiffies依然为unsigned long:
extern unsigned long volatile jiffies;
(2)实际时间xtime
所谓实际时间就是实际生活中以s为单位的时间。当系统启动时,内核通过读取RTC来初始化实际时间,该时间存放在内核的xtime的变量中。
在实际时间(墙上时间)定义在文件linux/timekeeping.c中:
struct timespace xtime;
timespec数据结构定义在文件linux/time.h中,形式如下:
struct timespec { //高精度
long tv_sec; // s
long tv_nsec; // ns
};
struct timeval { //普通精度
int tv_sec; // s
int tv_nesc; // us
};
尽管,linux还定义了更加符和大众习惯的时间表示:年,月,日。但是万变不离其宗,所有的时间应用都是建立在jiffies基础之上的。