这一秒,困扰了程序员 50 年——闰秒终于要被取消了!
近日,在法国巴黎闭幕的第 27 届国际计量大会上,与会代表通过一项决议,决定最迟在 2035 年取消闰秒。
好在很快,事件的罪魁祸首就被发现了:闰秒。换句话来说,就是那天晚上出现了一个奇怪的时间——23:59:60。就因为多了的这一秒,让没有准备好的计算机程序产生异常并崩溃。
而如今,这个令无数科技企业“头疼”了许多年的闰秒,终于要被没了:近日,在法国巴黎闭幕的第 27 届国际计量大会上,与会代表通过一项决议,决定最迟在 2035 年取消闰秒。
一、闰秒从何而来?
闰秒是什么?简单来说,我们可以把它理解成两套时间标准之间的误差:基于地球自转的世界时(UT)和基于原子振荡周期的国际原子时(TAI)。
二者之间,一直与地球自转时间相匹配的世界时首先在 1927 年确立,但随着科技发展,人们发现地球每天的自转速度也不一样,它会受潮汐、地壳运动等因素影响而越变越慢。
也就是说,在世界时的标准下,一天并不是固定的 24 小时,总会有几毫秒误差。当然,我们的日常生活可能并不会受此影响,但对太空探测、卫星导航等对时间精确度要求极高的领域而言,世界时显然是不够用了。
在这一精度需求下,在 1967 年,国际度量衡大会决定,用基于铯原子稳定周期性的电磁波,重新定义“秒”的时长,即国际原子时。但也由于原子时非常稳定,而世界时会随着地球自转会越来越慢,两者之间的差距会逐渐变大,于是在 1972 年,结合了这两个时间标准的“协调世界时(Coordinated Universal Time 简称 UTC )”出现了。
“协调世界时”以国际原子时秒长为基础,同时规定,当世界时与原子时之间时刻累计相差超过 0.9 秒时,就在“协调世界时”上加上或减去 1 秒,以尽量接近世界时——这 1 秒,就是闰秒。
自从 1972 年有了“闰秒”这个概念后,这 50 年来全球已经加了 27 次闰秒,而最近的一次调整是在北京时间 2017 年 1 月 1 日 7 时 59 分 59 秒(时钟显示 07:59:60)出现。
二、计算机中令人“头疼”的闰秒问题
本来呢,这多一秒少一秒的,对我们来说,基本是没什么影响的,但对于服务器而言却是一整个“天差地别”。
在计算机运行中,既定的子任务调度过程中会观察相对应的时间,而时间会以毫秒甚至更短的时间进行精度切分,一旦时间发生一些跳变,就会导致服务器宕机、系统崩溃或时间对应不一致等带来的一系列问题。
因为多了一个闰秒,很多任务会因为时间条件不匹配而启动失败,程序就会不停尝试、一直循环,直到服务器过载。而且,闰秒和闰年还不一样,没有规律可循,程序员也无法一开始就提前写进系统,从而导致了开头所说的 Reddit、领英等网站崩溃,部分 Linux 服务器 CPU 利用率飙升等等。
对此,不同科技企业之间的解决方式也不尽相同。部分网站可能习惯依赖公共时间服务器,选择直接停 1 秒或者跳 1 秒;而谷歌和 Meta 这类大型科技企业则采用“闰秒弥补”(Leap Smear)的方式,将闰秒分解为大量微小的部分,每次更新都增加几毫秒,最终增加至 1 秒以保证服务器正常运行,但这也并不是万全之策。
三、呼吁废除闰秒
在这种情况下,也难怪许多科技企业对“闰秒”的存在积怨已久——今年 7 月,谷歌、微软、Meta 和亚马逊四家科技巨头联合呼吁废除闰秒,理由是每次出现闰秒,都会对网络造成显著影响。
关于闰秒的废除,Meta 工程师 Oleg Obleukhov 与科学家 Ahmad Byagowi 还专门发表了一篇文章,称:
“每当引入闰秒时,我们都会遇到问题。”
“闰秒是一种弊大于利的冒险做法,我们认为现在是时候引入新技术来取代它了。”
“就算没有闰秒,现在的时间状态也至少足以支撑下一个千年。”
对此,美国国家标准与技术研究院(NIST)与国际计量局(BIPM)表示赞成,在 11 月 18 日第 27 届国际计量大会上,科学家和各国政府代表们也投票决定到 2035 年取消闰秒。
据 Nature 报道,来自加拿大,美国和法国的代表都投了赞成票,呼吁闰秒能在 2035 年取消,但投了反对票的俄罗斯代表则希望能将日期推迟到 2040 年或更晚,以预留时间调整其卫星导航系统 GLONASS 中有关闰秒的技术问题。
根据最新决议,目前闰秒还将继续存在,最晚将从 2035 年开始,允许原子时和世界时之间的误差累计超过 1 秒。不过美国国家标准与技术研究所物理学家朱达·莱文也补充道:“这种误差允许累积到多长时间,我们还没有决定。”
因此,各方代表将举行谈判,在 2035 年之前确定一个累积时长以及如何处理这一时长的方案——但在这之前,程序员们该对闰秒做的应对措施还是要做,直至这一决议真正生效。
原文链接:https://blog.csdn.net/csdnnews/article/details/128040013
>