关于闰秒
jopen 12年前
<p> 2012年 6 月 30 日,也就今天晚上,时间会多出现一秒,也就是我们所说的闰秒。我不知道大家对闰秒的了解有多少,所以写下这篇文章。</p> <p> <strong>背景知识</strong></p> <p> 闰秒是在在 <a href="/misc/goto?guid=4958346474015300317" target="_blank">UTC</a>(中文“世界标准时间”或“世界协调时间<strong>”</strong>/英文“<strong>C</strong>oordinated <strong>U</strong>niversal <strong>T</strong>ime”/法文“<strong>T</strong>emps <strong>U</strong>niversel <strong>C</strong>ordonné”)向 <a href="/misc/goto?guid=4958346474822884985" target="_blank">Atomic Clock</a>(原子时钟)对齐的一种方法,因为 UTC 是民用时间,其精确值是毫秒,而 Atomic Clock 精确值是纳秒,所以,1972年制定的 UTC 为了确保其时间相对于 Atomic Clock 的时间误差不能超过0.9秒,因为在过一段时间后需要加一秒。下图是有 UTC 以来闰秒的调整表(来自 <a href="/misc/goto?guid=4958346475618002855" target="_blank">Wikipedia 闰秒的中文词条</a>)</p> <p style="text-align:center;"><img title="闰秒" alt="" src="https://simg.open-open.com/show/ecd87bd100a2ee07d2a0fa809a863b9f.jpg" width="433" height="383" /></p> <p> 从上表中我们可以看到,从 1972 年到现在,在这四十年里已经进行过 25 次的闰秒调整。闰秒是在每年 6 月或 12 月的最后一天的最后一分钟进行跳秒或不跳秒。是否加入闰秒由位于巴黎的国际地球自转和参考坐标系统服务(IERS – <a title="International Earth Rotation and Reference Systems Service" href="/misc/goto?guid=4958346476418180506">International Earth Rotation and Reference Systems Service</a>)决定。如果决定加入闰秒,那么这一秒是被加在第二天的 00:00:00前的,也就是说,时间会出现 23:59:60的情况,然后才是第二天的 00:00:00。如果是负闰秒的话,23:59:58的下一秒就直接跳到第二天的 00:00:00了。<strong>现时所有闰秒都是正闰秒</strong>。</p> <p> <strong>计算机处理闰秒</strong></p> <p> 那么,对于我们的电脑系统来说,怎么处理这个闰秒呢?一般来说,我们需要为我们的电脑系统配置 UTC 时钟,并通过 NTP (<a title="Network time protocol" href="/misc/goto?guid=4958346477215645421">Network time protocol</a>)来进行时间同步,NTP 服务器会一级一级地下发闰秒事件通知直到最边缘的 NTP 服务器,然后 NTP 就会把闰秒通知给客户端的操作系统,由操作系统来处理闰秒通知。</p> <p> 虽然闰秒调整对普通民众的日常生活不会产生影响。不过,<strong>这个问题将影响部分开启 ntp 服务的 Linux 操作系统——会导致 Linux 内核 Crash!</strong>Linux kernel 是在2.6.18-164.e15之后的版本中解决了这个问题。换句话说,Linux kernel 低于<strong>2. 6.18-164</strong>的 Linux 系统,无论是什么公司的 Linux 都将受到影响。(今晚过后大家可以查看一下你的 Linux 系统日志,看看闰秒有没有发生)</p> <p> 你可以参看下面的 bug 描述:</p> <ul> <li><a href="/misc/goto?guid=4958346478011831916" target="_blank">LKML: Chris Adams: Re: Bug: Status/Summary of slashdot leap-second crash on new years 2008-2009</a></li> <li><a href="/misc/goto?guid=4958346478817368094" target="_blank">Bug 479765 – Leap second message can hang the kernel</a></li> </ul> <p> 那么,我们的操作系统是怎么处理正闰秒通知的?通常来说有三种实现:</p> <ol> <li>后退一秒。</li> <li>停止一秒。</li> <li>真正的增加一秒。</li> </ol> <p> 懂编程的人一眼就能看出来,前两种方式是以一种 Workaround 或 Hack 的方式解决这个问题。第一种方式会导致一些基于 timestamp 的消息通知乱序了,而第二种会导致出现两个一模一样的 timestamp。最后一种不会出现 timestamp 的问题。对了,你还记得以前那篇《<a href="/misc/goto?guid=4958346479624252107" rel="bookmark">你确信你了解时间吗?</a>》的文章吗?</p> <p> 最后,说说 Windows,Windows Time Service 不支持闰秒通知,所以,当闰秒发生的时候,你的 Windows 上的时间会比实际时间快一秒钟,这需要等下一次的时钟同步才会完成。你可以查看这篇文章:<a href="/misc/goto?guid=4958346480421160950">http://support.microsoft.com/kb/909614/en-us</a></p> <div id="come_from"> 来自: <a id="link_source2" href="/misc/goto?guid=4958346481228183232" target="_blank">coolshell.cn</a> </div>