关于时间这件小事
频率
-
带宽与频率
- 与频率相关的另一个参数是数据传输率,也称为"带宽",用于衡量数据通信速度的快慢。通常情况下,带宽=时钟频率×(位宽÷8)。譬如PCI总线的时钟频率为33.33MHz,因其位宽为32bit,所以其带宽为33.33×(32÷8)=133MB/s。
-
CPU的频率
- 在286及以前的电脑中,CPU的频率与外部总线的频率相同。Intel 386电脑中采用了时钟分频方式,时钟电路提供给CPU的时钟信号的频率66MHz,而CPU内部则以33MHz的频率工作。Intel 80486 DX2则采用倍频方式,它允许CPU以2倍或3倍于外部总线的速度运行,但仍以原有时钟频率与外界通讯。进入Pentium时代以后,倍频技术获得广泛应用,目前处理器的倍频已达20倍。
- 系统时钟频率:通常也称作"外频"——CPU外部总线的时钟频率。外频由频率合成器芯片(Frequency Syntesizer)提供。主频:主频是CPU内核(整数和浮点运算器)电路的实际运行频率,由外频(或前端总线频率)与倍率共同决定,也即:主频=外频×倍率。
- 前端总线频率:前端总线(Front Side Bus,FSB)频率是CPU和北桥芯片间进行数据交换的频率,它与外频既有联系,又有区别。外频是前端总线时钟信号的频率,而前端总线频率是指数据传输的频率。对于Pentium 4处理器来说,由于采用了QDR(Quad Data Rate,4倍数据比率)技术,1个时钟周期内可以传输4次数据,所以前端总线频率相当于外频的4倍:FSB 800MHz的处理器,外频只有200MHz。
-
计算机的心脏--频率源
时钟源硬件设备
时钟电路由时钟源硬件设备和其他辅助设备(i.e. 分/倍频器,锁相环)组成。
- RTC
- RTC独立于CPU和所有其他芯片,依靠一个独立的电池供电给RTC中的振荡器电路。
- Linux通过RTC获取时间和日期。
- TSC
- 在80x86微处理器中,有一个CLK输入引线,用于接收外部振荡器的时钟信号。
- 从pentium开始,很多80x86微处理器都引入了一个TSC, 一个64位的、用作时间戳计数器的寄存器 它在每个时钟信号(CLK)到来时+1,例如时钟 频率400MHz的微处理器,TSC每2.5ns就+1, rdtsc指令用于读该寄存器
- PIT(8254可编程中断定时器)
- Linux将PIT编程为: 100Hz、1000Hz
- 通过IRQ0发出时钟中断
- 每若干毫秒(100Hz为10ms)产生一次时钟中断,即一个tick
- HPET
用来取代PIT,能够提供比PIT更高精度的时钟源
系统时钟
操作系统应该具备在将来某个时刻调度某个任务的能力,所以需要一种能保证任务准时调度运行的机制。该机制的核心就是系统时钟。与实时时钟RTC不同,系统时钟是定时器硬件和系统软件的结合。
1.系统时钟中断源
系统时钟硬件在通过编程配置后可以产生一定频率的中断。在个人计算机中,与该中断相关的中断向量号是0。系统软件通过累计从开机到现在产生该中断的次数来维护系统时间,形成系统时钟。本小节主要介绍在个人计算机中常见的、可以用于系统时钟的硬件定时器。
(1)8254可编程定时器。
当 前使用最普遍的定时器硬件芯片是Intel 8254可编程定时器芯片(Programable Interval Timer,简称为PIT),该芯片由一个1 193 181Hz的振荡器驱动,含有3个独立的通道;每个通道包含一个16位的计数器。对于每一个到达的时钟脉冲,通道中计数器中的值减1,当计数器减到0时, 相应的通道就会产生一次输出。其中通道0的输出连接到了中断控制器,其对应的中断向量号为0,用于产生系统时钟所需要的滴答;通道1的输出在早期的计算机 中用于DRAM的刷新,新近的计算机系统中有专门的硬件负责DRAM的刷新,通道1的功能已经不存在了;通道2的输出连接到了位于主板上的蜂鸣器(PC Speaker),控制蜂鸣器发出一定频率的声音。
这里介绍一下驱动8254工作时钟频率的来历。最初的个人电脑设计时出于成本上的考虑, 主板上采用了当时广泛用于电视机且价格最便宜的一个14.318 18MHz振荡器,该振荡器的频率远远高于系统其他器件所要求的工作频率。设计师采用了3分频后得到4.77MHz驱动中央处理器8088;采用4分频后 得到3.58MHz信号用于驱动彩色图形适配器;最后将系统各种频率的基频1.193 181 6MHz(各种频率的最大公约数,即12分频)信号用做系统可编程定时器芯片的输入时钟。为了保持兼容性,可编程定时器8254一直采用这个频率的时钟作 为输入。
(2)高精度事件定时器。
高精度事件定时器(High Precision Event Timers)被设计用于取代8254可编程定时器的全部功能和实时钟RTC芯片的周期性中断功能,和8254可编程定时器相比,该定时器能产生更高精度 的周期性中断;和实时钟RTC芯片的周期性中断相比,该定时器能提供更高精度、更宽范围的中断频率。
该硬件定时器遵循Intel和 Microsoft联合制定的高精度事件定时器规范。该规范中规定一个高精度事件定时器最多拥有32个定时器。通过配置后,timer 0用于取代8254可编程定时器所产生的时钟中断;timer 1作为硬件定时器取代实时钟RTC芯片的周期性中断功能;其余的timer作为硬件定时器供内核或用户进程直接使用。
(3)处理器本地时钟。
在多处理器系统中,处理器本地时钟(CPU Local Timer)用于向本地处理器发送时钟中断请求,更新本地处理器上的相对时间jiffies。
2.其他辅助时钟源
这类辅助时钟源不具备向系统发出中断请求的功能,但有比能产生系统时钟中断的定时器硬件更高的计时精度。在系统时钟中断处理过程中,处理程序可以利用这些时 钟的值来完成高精度时间度量,如"6.6微秒级延迟"中的udelay、ndelay就使用了这类的时钟源(如时间戳计数器)完成高精度的延迟。下面介绍 常见的这类辅助时钟源。
(1)时间戳计数器。
从Pentium开始,所有的Intel处理器都包含一个64位的寄存器,该寄存器被称为时间戳记数器(Time Stamp Counter,简称为TSC)。TSC在CPU的每个时钟信号到来一次时加1,实际上该寄存器是一个不断增加的计数器,如果处理器的主频为1GHz,那 么TSC寄存器的每1ns增加1。汇编指令rdtsc可用于读取TSC的值。利用CPU的TSC,操作系统通常可以得到更为精准的时间度量。
(2)电源管理时钟。
内核中,除了使用上面的时间戳记数器作为系统时钟的辅助时钟源外,电源管理时钟(ACPI Power Management Timer)也可作为系统的辅助时钟源。
计算机时间术语描述
世界时
世界时UT,可以简单理解为按照地球自转一周来计量24小时的时间标准,由于地球自转速率的变化,世界时的秒长会有微小的变化,每天的快慢可以达到千分之几秒。
TAI时间
世界时不准,因此国际组织定义了TAI时间,即国际原子时( International Atomic Time),其起点是1958年的开始(世界时UT),以铯原子钟走秒连续计时的时间。
UTC时间
计算机网络普遍使用的UTC时间(协调世界时),由国际计量局BIPM综合全世界多个守时实验室的钟组计算得到,为了使UTC时间与地球自转1天的时间(世界时UT)协调一致,每隔1到2年, BIPM会通告在UTC时间6月30日或12月31日最后一分钟“加一秒”或“减一秒”等闰秒调整。也就是说,UTC时间会出现60秒或少了59秒的情况。
最近一次闰秒是UTC时间2015年6月底:
2015 年6月30日,23时 59分 59秒
2015 年6月30日,23时 59分 60秒
2015 年7月 1日, 0时 0分 0秒
由于存在闰秒,UTC时间与TAI时间是有差别的,UTC = TAI - n,这个n现在(2016年1月)是36秒,也就是说UTC时间比TAI时间慢了36秒。
北京时间
北京时间也就是东八区时间,在UTC时间基础上加8小时,中国的北京标准时间由位于陕西的国家授时中心发播。
GPS时间
由GPS系统通过卫星信号发播的原子时间,GPS时间用自1980年1月6日零点(UTC时间)起的星期数和该星期内内的秒数来表示。
工程上,GPS接收机会根据闰秒数将GPS时间换算为我们通常使用的UTC时间。GPS时间的源头是美国海军天文台的守时原子钟组。
北斗(BDS)时间
由北斗卫星导航系统通过卫星信号发播的原子时间,同样,北斗接收机会根据闰秒数将北斗时间换算为我们通常使用的UTC时间。
北斗时间的时钟源是位于北京的解放军时频中心的守时原子钟组,陕西的国家授时中心好尴尬:(。
频率
时间的导数就是频率,机械发条、石英晶体振荡器、原子钟等各种时钟源通过产生频率信号,按照频率均匀打拍计数,模拟时间的等间隔流逝,就有了可见的“时间”。
频率准确度
手表有准和不准的,反映的就是频率准不准,时钟频率和标准频率的偏差可以用频率准确度来衡量。1E-9量级表示1秒会差1ns,我们使用的个人电脑,它的守时时钟是个32. 768kHz的石英晶振,准确度大概只有2E-5量级(20ppm),也就是说1秒会差0.02ms,1天会跑偏大概2秒。
时间同步
广义的“时间同步”包括的时间和频率的同步。上级时钟将时间频率信号通过各种有线(以太网、SDH数字网、同轴电缆、电话等)、无线(卫星、长波、电台、微波、WIFI、Zigbee等)链路传递给下级时钟,下级时钟接受时间频率信息后,与上级时钟保持相位、频率的一致。
网络时钟同步
计算机网络时间同步只是时间同步的一种应用场景,其时间传递的链路可能是SDH网、以太网、WIFI无线网络等。
NTP
NTP(Network Time Protocol)从1985年诞生来,目前仍在在大部分的计算机网络中起着同步系统时间的作用。
- 基本原理
服务器和客户端之间通过二次报文交换,确定主从时间误差,客户端校准本地计算机时间,完成时间同步,有条件的话进一步校准本地时钟频率。
- 时间同步过程
服务器在UDP的132端口提供授时服务,客户端发送附带T1时间戳(Timestamp)的查询报文给服务器,服务器在该报文上添加到达时刻T2和响应报文发送时刻T3,客户端记录响应报到达时刻T4。
- 钟差计算
图中用蓝色标注了主从直接来回链路的时延Sigma:
Sigma = (t4-t1)-(t3-t2)
因此,假设来回网络链路是对称的,即传输时延相等,那么可以计算客户端与服务器之间的时间误差Delta为:
Delta = t2-t1-Sigma/2=((t2-t1)+(t3-t4))/2客户端调整自身的时间Delta,即可完成一次时间同步。
- 计时方式
NTP采用UTC时间计时,NTP时间戳包括自1900-01-01 00:00:00开始的UTC总秒数,当前秒的亚秒数。
当正闰秒时,60秒和下一分钟的0秒的NTP总秒数一致的,因此NTP报文专门定义了闰秒指示域来提示。
- 误差分析
局域网内计算机利用NTP协议进行时间同步,时间同步精度在5ms左右,主要误差包括:
- 计算机打时间戳的位置在应用层,受协议栈缓存、任务调度等影响,不能在网络报文到来时马上打戳;
- 各种中间网络传输设备带来的传输时延不确定性以及链路的不对称性,将进一步降低NTP时间同步精度。
PTP
为克服NTP的各种缺点,PTP(Precision Time Protocol,精确时间同步协议)应运而生,最新协议是IEEE1588v2,可实现亚微秒量级的时间同步精度。
- 基本原理
主从节点在网络链路层打时间戳,利用支持IEEE1588协议的PHY片,精准记录时间同步网络报文接受或发送的时刻。交换机、路由器等网络中间节点准确记录时间同步报文在其中停留的时间,实现对链路时延的准确计算。
- 时间同步过程
PTP默认使用组播协议,二层或四层UDP组播都可以,一般我们使用基于UDP组播,使用319和320两个端口。
PTP定义了三种角色:OC、BC和TC。我们一般接触的是OC:主时钟和从时钟,交换机、路由器一般是BC或TC。
由于硬件性能有限,网络报文发送时记录的时刻信息,可以在随后的Follow_Up跟随报文中发出,这就是PTP的双步模式(Two-step)。
下图是两OC主从时钟之间的同步过程:
a.主时钟向从时钟发送Sync报文,并在本地记录发送时间t1;从时钟收到该报文后,记录接收时间t2。
b.时钟发送Sync报文之后,紧接着发送一个携带有t1的Follow_Up报文。
c.从时钟向主时钟发送Delay_Req报文,用于发起反向传输延时的计算,并在本地记录发送时间t3;主时钟收到该报文后,记录接收时间t4。
d.主时钟收到Delay_Req报文之后,回复一个携带有t4的Delay_Resp报文。
- 时差计算
与NTP一样的原理,从时钟根据拥有的t1~t4这四个时间戳,由此可计算出主、从时钟间的往返总延时为:
Sigma = (t4-t1)-(t3-t2)假设网络是对称的,从时钟相对于主时钟的时钟偏差为:
Delta = t2-t1-Sigma/2=((t2-t1)+(t3-t4))/2
- 计时方式
与NTP不同,PTP采用TAI世界原子时间计时,而且PTP计时的起点与unix时间一致,即UTC时间1970年1月1日0点。
PTP主钟会告知从钟,当前UTC相对于TAI的累计偏移量,从钟据此计算当前准确的UTC时间。
- 误差分析
PTP能准确记录报文发送和接受的时间,也能计算中间链路的延时,剩下影响最大的就是网络链路的不对称性了。
在实际工程中,网络中间链路设备不支持PTP协议,大大降低了PTP的同步精度。目前,PTP主要应用在通信同步网、电力同步网等行业网络系统里。
- 同步拓扑
PTP域中所有的时钟节点都按一定层次组织在一起,可通过BMC(Best Master Clock,最佳主时钟)协议动态选举出最优时钟,最优时钟的时间最终将被同步到整个PTP域中。
BMC算法与STP(Spaning Tree Protocl)生成树协议类似,最终形成无环路的树形网络拓扑,且都是动态选举,能适应最佳主时钟切换的变化。