0

    计算机时间到底是怎么来的?程序员必看的时间知识!

    2023.05.29 | admin | 135次围观

    这个方案非常棒,至此终于解决了秒不固定长的问题。

    那有了这个国际原子时,可否让它直接取代掉前面说的——以天文现象计时的「世界时」呢?

    答案是否定的,这个问题远比想象的复杂得多,这是为什么呢?

    世界标准时间是怎么来的?

    现在,科学家制定出了两套时间标准:

    世界时:基于天文现象 + 钟表计时,永远与地球自转时间相匹配

    国际原子时:基于原子钟计时,每一秒的周期完全等长且固定

    假设我们以国际原子时为时间标准,那会发生什么现象呢?

    因为原子时非常稳定,但世界时随着地球自转变慢,会越来越慢电脑时间不能修改,就会发生这种现象:

    晚上 8 点是太阳高照的时刻,你能想象这种情况吗?

    这太颠覆我们的生活认知了...

    基于天文测算的世界时,已经指导我们人类生活了上千年,人类早已习惯了这种时间标准,直接被原子时取代,肯定是不能接受的。

    但我们又需要原子时这种高度稳定的计时标准,来发展科学研究,两者发生矛盾,这怎么办?

    科学家们又开始思考,终于想到一个互相兼容的解决方案。

    既然两套时间标准都很重要,那两者都保留,不会互相取代。

    我们可以再建立一套「新的时间标准」,这套时间以「原子时为基准」,开始计时电脑时间不能修改,走的每一秒都是稳定、精确的。

    同时,为了兼顾基于天文测量的世界时,人类会「持续观测」世界时与这个新时钟的差距。

    如果发现两者相差过大时,我们就「人为」地调整一下这个时钟(加一秒或减一秒),让两者相差不超过 0.9 秒。

    例如,这个时钟本身比世界时走得快,经过一段时间后,如果发现两者相差越来越大,那就给这个时钟「加一秒」,让这个时钟在 23:59:59 的下一秒变为 23:59:60 秒,让它与世界时差距控制在 0.9 秒以内,这个操作过程,相当于让快的时钟稍微「等」一下走得慢的世界时。

    而加的这一秒,科学家把它定义为「闰秒」。

    是不是挺有意思?听说过闰年,没想到还有闰秒!

    当然,当地球自转速度变快时,这里也有可能是减一秒,即从 23:59:58 直接跳到 00:00:00。但这种情况比较少,大部分情况下,地球自转速度是越来越慢的。

    这么做的好处在于,这个时钟的每一秒的计时依旧是精确的,而且还兼顾了日常生活使用的世界时,一举两得!

    由于这个时钟是基于原子时 + 世界时「协调」得出的,所以科学家们把它定义为协调世界时(Coordinated Universal Time,简称 UTC)。

    看到了么?我们在开发时经常看到的 UTC,原来是这样来的!

    有了这个研究成果,有技术能力的国家都纷纷制造自己的原子钟,然后计算协调世界时。

    同时,为了进一步降低原子钟的测量误差,每个国家会在每个月,统一上报自己计算的世界协调时到一个权威机构,然后这个权威机构会根据各国实验室的精度,进行加权计算,算出「最终」的协调世界时。

    之后,再把这个最终的时间下发到各个国家,让各个国家进行「对表」校准,保证全世界的时间误差在/以内。

    至此,科学家们建立的这套时间标准,就是我们现在沿用至今的「标 准 时间」!

    值得一提的是,配合计算世界协调时的国家,也有中国,这个实验室就是「中国科学院国家授时中心」,它位于中国的陕西省渭南市蒲城县,持续维护中国的标准时间。

    为什么国家授时中心会设立在陕西省?因为陕西省的地理位置处于中国的中部,从这个位置向各地广播时间时,对全国每个地区距离都是相对平均的。

    之后,中国会在自己算出的世界协调时的基础上,再加 8 个小时(中国在东八区),最终得出来的时间,就是「北 京 时 间」!

    没错,就是我们经常在新闻播报上听到的,北京时间。

    是不是挺有意思?北京时间并不是在北京产生的,而是在陕西省,并与参与世界时间的制定和校准。

    至此,全新的世界标准时间确立了,这套时间标准于 1972 年正式确定,一致沿用至今。

    有了标准时间,那么接下来的问题就是,这个标准时间到底是如何同步到我们的电脑、手机、电子设备上的呢?

    这就是下面要讲的「授时」。

    计算机如何同步时间?

    到现在我们知道,世界标准时间和北京时间是怎么来的,但北京时间的产生是在陕西省,难道校准一次时间需要跑到这里吗?

    很显然是不需要的。

    位于陕西省的中国科学院国家授时中心,产生北京时间后,会通过一系列方式,把这个时间广播出去,这个过程,就叫做「授时」。

    具体怎么做呢?

    国家授时中心提供很多授时方式,例如无线电波、网络、电话,都可以把时间广播出去。

    通常来说,无线电波的传播速度更快、传播误差小,所以授时中心会通过这种方式,把时间发送给全国各地的「时间服务器」。

    时间服务器有了准确的时间后,再通过其它方式(例如网络)广播到下一层的终端用户使用。

    经过这么一番研究,到这里我们就可以解释文章开头的问题了。

    一个时间服务器,原来是通过国家授时中心同步时间,然后再给其它终端提供时间同步服务的。

    那我们的计算机如何和它保持同步呢?

    你可能会想,最简单的方式就是,客户端向服务端「请求获取」标准时间,服务端响应时间数据,客户端修改自己的「本机时间」即可。

    但事情没你想的这么简单。

    因为数据在网络传输过程中,也是需要时间的,这个时间也会影响到时间的准确性。

    这怎么办呢?

    于是人们想了一种方案,当计算机在做时间校准时,也需要把网络延迟计算进去,最后「修正」这个同步过来的时间,降低误差。

    现在,已经有个软件已经把这一切都做好了,如果你了解一些运维相关的工作,就会知道,我们部署应用程序的服务器上,都会启动一个「自动校准」时间的服务,这个服务就是 NTP(Network Time Protocol),它可以保证每台机器的时间与时间服务器保持同步。

    那 NTP 是怎么同步服务器时间的呢?

    这里就涉及到 2 个重点:

    NTP 如何同步时间?

    同步时间时,对正在运行的程序有没有影响?

    先来看第一个问题:NTP 如何同步时间?

    简单来讲,它是通过在网络报文上打「时间戳」的方式,然后配合计算网络延迟,从而修正本机的时间。

    根据图示可以计算出网络「传输延迟」,以及客户端与服务端的「时间差」:

    这个计算过程假设网络来回路径是对称的,并且时延相同。

    这样一来,客户端就可以「校准」自己的本机时间了,与服务端保持同步,这个时间误差在广域网下是 10ms - 500ms,在局域网下通常可以小于 1ms。

    再来看第二个问题:同步时间时,对正在运行的程序有没有影响?

    例如,我们很多时候写的程序代码是这样的:

    t1 = time.now()// 时间发生校准t2 = time.now()
    // t2比t1小怎么办?elapsed = t2 - t1

    t2 的时间真的会比 t1 小吗?

    这里就牵涉出 2 个概念:墙上时钟、单调时钟,它们之间有什么区别呢?

    一般我们写的代码,像上面程序调用的「时间 API」,通常获取的时间是墙上时钟,所以,如果时间发生校准,就可能会发生「时光倒流」的情况。

    这必然对程序产生很大的影响,怎么解决这个问题呢?

    幸运的是,NTP 在校准时间时,提供了 2 种方式:

    ntpdate:一切以服务端时间为准,「强制修改」本机时间

    ntpd:采用「润物细无声」的方式修改本机时间,把时间差均摊到每次小的调整上

    也就是说,ntpd 当接收到需要「回拨」的时间时,会让本机时间走得「慢」一点,小步调整,逐渐与服务端的时钟「对齐」,这样一来,本机时间依旧是递增的,避免发生「倒流」。

    当我们在配置 ntp 服务时,需要格外注意这种情况。另外,在编写程序时,也要注意调用的时间 API 获取的是哪个时间,避免业务逻辑发生异常。

    至此,我们从看似简单的时间问题,一步步深挖到时间的定义,再到时间是如何同步到计算机和终端设备的,怎么样,有没有解答了你心中的很多疑惑?

    总结

    好了,总结一下。

    这篇文章我们讲了非常多的概念,这里我们再重新梳理一遍。

    1、人类的早期生活,依靠观测「天文现象」来测量时间,基于地球自转规律,定义了一套时间标准:「世界时」。

    2、后来人们发现,由于地球公转轨道是一个椭圆,并且地球自转还受到地球内部的影响,自转速度越来越慢,人们发现世界时测算出的时间「不准」。

    3、科学家们开始从「微观世界」寻找更稳定的周期运动,最终确定以「铯原子」的振动频率为基准,制造出了「原子钟」,确立了「世界原子时」,并重新定义了「秒」长度,时长高度精确。

    4、但由于人类社会活动已高度依赖「世界时」,所以科学家们基于「原子时」和「世界时」,最终确立出新的时间标准:「世界协调时」,把它定义成了全球的时间标准,至此,世界标准时间诞生。

    5、中国基于「世界协调时」再加上 8 小时时区之差,确立了「北京时间」,并广播给整个中国大地使用。

    6、「国家授时中心」把北京时间广播给全国的「时间服务器」,我们生活中使用的时间,例如计算机,就是通过时间服务器自动同步校准的。

    7、计算机通过 NTP 完成和时间服务器的「自动校准」,我们的应用程序基于此,才得以获取到准确的时间。

    8、NTP 服务应该采用润物细无声的方式同步时间,避免时间发生「倒流」。

    我们在写代码时,看似调用了一个简单的时间 API,可曾想过,背后却是人类多少年来的智慧结晶。希望这篇文章能解答你对时间的种种疑惑。

    阿里云公布IP地理位置库抄袭调查结果;华为云电脑8月16日将停止服务和运营;Chrome 92发布|极客头条

    升职加薪,领导看的从来都不是谁更“努力”

    Windows、Linux 纷纷被爆漏洞,黑客可直取 root 权限!

    版权声明

    本文仅代表作者观点。
    本文系作者授权发表,未经许可,不得转载。

    发表评论