时钟-基本概念
以下内容整理自《分布式原理系统与范型》 (清华大学出版社 ; ISBN 7302089612)
计算机的计时器通常是一个精密加工过的石英晶体。石英晶体在其张力限度内以一定的频率震荡,这个频率取决于晶体本身如何被切割及其受到张力的大小。有两个寄存器与石英晶体相关联,一个是计数器(counter),另一个是保持寄存器(holding register)。石英晶体的每次震荡使计数器减1。当计数器减为0时,产生一个中断,计算器从保持计数器中重新装入初始值。这种方法使得对一个计时器进行编程,令其每秒产生60次中断(或者以其他希望的频率产生中断成为可能)。每次中断称为一个时钟滴答(clock tick)。
系统初次启动时通常要求用户输入日期和时间,然后将它们转换成某一个已知起始时间后的时钟滴答数,并将它存储在存储器中。许多计算机都有一个用特殊的电池支持的CMOS RAM,其目的是为了以后启动时不再需要输入日期和时间。时钟每滴答一次,中断服务程序就使存储在存储器时间里的时间值加1。用这种方法进行(软)时钟计时。
一旦引入多CPU系统,每个CPU都有自己的时钟。尽管石英晶体震荡的频率通常是相当稳定的,但仍不可能保证不同计算机中的石英晶体都以完全相同的频率在震荡。实际上,当一个系统有n台计算机时,所有n个晶体都将以略微不同的速度震荡,导致(软)时钟逐步不同步;当同时读取这些时钟值时,将得到不同的值。这种时间值的不同称作时钟偏移(clock skew)。
自从17世纪机械钟发明以来,人们就一直用天文学的方法测量时间。每天太阳都是从东方地平线上升起,然后升到天空的最高处,最后再落到西边。太阳到达天空中它出现的最高点成为中天(transit of the sun),它在每天正午发生。两次连续的太阳中天之间的时间成为一个太阳日(solar day)。因为每天有24h(小时),每小时有3600s(秒),所以一个太阳(solar second)被精确定义为1/86400个太阳日。几何算法如下图示:

在20世纪40年代,科学家们证实了地球的自转周期并非常数。由于潮汐摩擦和大气的阻力,地球自转的速度正在变慢。基于对远古时代珊瑚的生长图案的研究,地质学家现在相信,在3亿年前每年大约有400天。年的长度(地球绕太阳一周的时间)被认为是不变的,那么每天的时间就简单的变长了。除了这种长期变化的趋势,也存在一天长短的短期变化,这可能是由地球地核层熔岩的剧烈沸腾引起的。这些发现促使天文学家们在计算天的长度时测量很多天的长度,然后对它们取平均值;最后除以86400得到的结果成为平均太阳秒(mean solar second)。
1948年原子钟诞生,它使更精确地测量时间成为可能可能。原子钟不受地球的摆动和震荡的影响,而是通过铯133原子的跃迁计时。物理学家从天文学家的手中接管了计时的工作,定义1秒是铯133原子做 9 192 631 770次跃迁所用的时间。选择9 192 631 770是为了使原子秒与引入原子秒的那一年的平均太阳秒相等。目前世界上大约有50个实验室拥有铯133时钟。每个实验室都定期向巴黎的 Bureau International del' Heure (BIH) 报告其时钟的滴答次数。BIH将这些值平均起来产生国际原子时间 (international atomic time),简称为TAI。这样TAI就是铯133时钟从1958年1月1日午夜(起始时间)以来被 9 192 631 770 除后的平均滴答数。
尽管TAI相当稳定,并且任何人只要愿意都可以买到一只铯时钟,但是它仍然存在一个严重的问题,那就是86400个TAI秒比现在一个平均太阳日少3μs(因为平均太阳日越来越长)。使用TAI计时将意味着多年以后,中午会出现的越来越早,直到最终出现在凌晨。
BIH通过引入闰秒(leap second)解决了该问题,即当TAI和太阳秒之间的差错加到800μs时使用一次闰秒。闰秒的使用如下图示。

这种修正产生了一种时间系统,改时间系统基于恒定的TAI秒,但是却和太阳的运动保持一致;它被称为统一协调时间(universal coordinated time),简称为UTC。UTC是所有现代人计时的基础。它从根本上取代了原有的标准,即格林尼治平均时间(greenwich mean time),后者是一种天文时间。
大多数电力公司将他们的60Hz或者50Hz时钟的计时基础放在了UTC上。因此,当BIH宣布闰秒后,电力公司将他们使用的频率分别从60Hz或者50Hz增加到61Hz或者51Hz,以便于把他们分布地区的时钟往前拨。对于计算机来说1秒是个相当大的时间间隔,所以需要在几年间保持精确时间的操作系统必须有专门的软件根据闰秒的定义来计算闰秒(除非使用电力线频率来计时,而这种计时方法通常很粗糙)。到目前为止,使用闰秒的次数大约是30次。
为了向需要精确时间的人们提供UTC,NIST(National Institute of Standard Time,国际事件标准化组织)使用了一个位于科罗拉多州柯林斯堡的成为WWV的短波广播站。WWV在每个UTC秒开始时广播一个小脉冲。WWV本身的精度为±1ms,但由于随机空气波动能影响信号传播路劲的长度,实际的精度仅能达到±10ms。英格兰的MSF站(位于沃里克郡的拉格比)也提供类似的服务。
一些地球卫星也提供UTC服务。同步环境操作卫星(geostationary environment operational satellite)能提供精确到0.5ms的UTC,其他一些卫星提供的精度更高。
使用短波广播或者卫星服务需要准确了解发送信号和接受者的相对位置,以便于对信号传输延迟进行补偿。接受WWV、GEOS和其他信号的无线电接收器在市场上可以买到。
=========================================================================
以下内容整理自《HotSpot实战》(人民邮电出版社, ISBN 9787115343635)
Linux的时钟与计时器,CLOCK_MONOTONIC提供相对时间,它的时间值是通过jiffies值来计算的,jiffies取决于系统的频率,单位是Hz,是周期的倒数。一般表示为一秒钟中断产生的次数。该时钟不受系统时钟源的影响,较为稳定,只受jiffies值的影响。按照POSIX规范,与CLOCK_MONOTONIC相对应的另外一种时钟类型是CLOCK_REALTIME,这是系统实时时钟(RTC)。这是一个硬件时钟,用来持久存放系统时间,系统关闭后靠主板上的微型电池保持计时。系统启动时,内核通过读取RTC来初始化Wall Time,并存放在xtime变量中,即xtime是从cmos电路中取得时间,一般是从某一历史时刻开始到现在的时间,也就是为了取得我们操作系统上显示的日期,它的精度是微秒。
更多详细解释可以参见: http://www.360doc.com/content/11/1201/09/1317564_168810003.shtml
posted on 2016-03-13 09:25 ThomasLand 阅读(797) 评论(0) 收藏 举报
浙公网安备 33010602011771号