來源:陳皓
為了讓“原子時”與“世界時”協調一致,北京時間7月1日全球將增加一秒,屆時,將出現7:59:60的特殊現象。也就今天晚上,時間會多出現一秒,也就是我們所說的閏秒(leap second)。我不知道大家對閏秒的瞭解有多少,所以寫下這篇文章。
背景知識
閏秒是在UTC(中文“世界標準時間”或“世界協調時間”/英文“Coordinated Universal Time”/法文“Temps Universel Cordonné”)向Atomic Clock(原子時鐘)對齊的一種方法,因為UTC是民用時間,其精確值是毫秒,而Atomic Clock精確值是納秒,所以,1972年制定的UTC為了確保其時間相對於Atomic Clock的時間誤差不能超過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