關于閏秒,你了解多少?
2012年6月30日,也就今天晚上,時間會多出現一秒,也就是我們所說的閏秒。我不知道大家對閏秒的了解有多少,所以寫下這篇文章。
背景知識
閏秒是在在UTC(中文“世界標準時間”或“世界協調時間”/英文“Coordinated Universal Time”/法文“Temps Universel Cordonné”)是基于Atomic Clock(原子時鐘)的一種時間,向太陽時(Solar Time )對齊的一種方法,因為太陽時是根據地球公轉來計算的。所以,1972年制定的UTC為了確保其時間相對于UTC的時間誤差不能超過0.9秒,因此在過一段時間后需要加一秒。下圖是有UTC以來閏秒的調整表(來自Wikipedia閏秒的中文詞條)
從上表中我們可以看到,從1972年到現在,在這四十年里已經進行過25次的閏秒調整。閏秒是在每年6月或12月的最后一天的最后一分鐘進行跳秒或不跳秒。是否加入閏秒由位于巴黎的國際地球自轉和參考坐標系統服務(IERS – International Earth Rotation and Reference Systems Service)決定。如果決定加入閏秒,那么這一秒是被加在第二天的00:00:00前的,也就是說,時間會出現23:59:60的情況,然后才是第二天的00:00:00。如果是負閏秒的話,23:59:58的下一秒就直接跳到第二天的00:00:00了。現在,所有閏秒都是正閏秒。
計算機處理閏秒
那么,對于我們的電腦系統來說,怎么處理這個閏秒呢?一般來說,我們需要為我們的電腦系統配置UTC時鐘,并通過NTP (Network time protocol)來進行時間同步,NTP服務器會一級一級地下發閏秒事件通知直到最邊緣的NTP服務器,然后NTP服務器就會把閏秒通知發給客戶端的操作系統,由操作系統來處理閏秒通知。
雖然閏秒調整對普通民眾的日常生活不會產生影響。不過,這個問題將影響部分開啟ntp服務的Linux操作系統——會導致Linux內核Crash!Linux kernel是在2.6.18-164.e15之后的版本中解決了這個問題。換句話說,Linux kernel低于2.6.18-164的Linux系統,無論是什么公司的Linux都將受到影響。(今晚過后大家可以查看一下你的Linux系統日志,看看閏秒有沒有發生)
可以參看下面的bug描述:
- LKML: Chris Adams: Re: Bug: Status/Summary of slashdot leap-second crash on new years 2008-2009
- Bug 479765 – Leap second message can hang the kernel
那么,我們的操作系統是怎么處理正閏秒通知的?通常來說有三種實現:
- 后退一秒。
- 停止一秒。
- 真正的增加一秒。
懂編程的人一眼就能看出來,前兩種方式是以一種Workaround或Hack的方式解決這個問題。第一種方式會導致一些基于timestamp的 消息通知亂序了,而第二種會導致出現兩個一模一樣的timestamp。最后一種不會出現timestamp的問題。對了,你還記得以前那篇《你確信你了解時間嗎?》的文章嗎?
最后,說說Windows,Windows Time Service不支持閏秒通知,所以,當閏秒發生的時候,你的Windows上的時間會比實際時間快一秒鐘,這需要等下一次的時鐘同步才會完成修正。你可以查看這篇文章:http://support.microsoft.com/kb/909614/en-us
本文轉載自:酷殼 – CoolShell.cn