關(guān)于閏秒leap second

Origin address:?http://coolshell.cn/articles/7804.html
生活中,大家都知道 閏年/閏月(閏年多出來的時間單位是月, 閏月多出的時間單位是天),閏日(天)都沒有聽說過, 還有閏秒嗎?
2012年6月30日,時間會多出現(xiàn)一秒,也就是我們所說的閏秒。
背景知識
閏秒是在在UTC(中文“世界標準時間”或“世界協(xié)調(diào)時間”/英文“Coordinated?Universal?Time”/法文“Temps?Universel?Cordonné”)是基于Atomic Clock(原子時鐘)的一種時間,向太陽時(Solar Time)對齊的一種方法,因為太陽時是根據(jù)地球公轉(zhuǎn)來計算的。所以,1972年制定的UTC為了確保其時間相對于UTC的時間誤差不能超過0.9秒,因此在過一段時間后需要加一秒。下圖是有UTC以來閏秒的調(diào)整表(來自Wikipedia閏秒的中文詞條)

從上表中我們可以看到,從1972年到現(xiàn)在,在這四十年里已經(jīng)進行過25次的閏秒調(diào)整。閏秒是在每年6月或12月的最后一天的最后一分鐘進行跳秒或不跳秒。是否加入閏秒由位于巴黎的國際地球自轉(zhuǎn)和參考坐標系統(tǒng)服務(wù)(IERS –?International Earth Rotation and Reference Systems Service)決定。如果決定加入閏秒,那么這一秒是被加在第二天的00:00:00前的,也就是說,時間會出現(xiàn)23:59:60的情況,然后才是第二天的00:00:00。如果是負閏秒的話,23:59:58的下一秒就直接跳到第二天的00:00:00了。現(xiàn)在,所有閏秒都是正閏秒。
計算機處理閏秒
那么,對于我們的電腦系統(tǒng)來說,怎么處理這個閏秒呢?一般來說,我們需要為我們的電腦系統(tǒng)配置UTC時鐘,并通過NTP (Network time protocol)來進行時間同步,NTP服務(wù)器會一級一級地下發(fā)閏秒事件通知直到最邊緣的NTP服務(wù)器,然后NTP服務(wù)器就會把閏秒通知發(fā)給客戶端的操作系統(tǒng),由操作系統(tǒng)來處理閏秒通知。
雖然閏秒調(diào)整對普通民眾的日常生活不會產(chǎn)生影響。不過,這個問題將影響部分開啟ntp服務(wù)的Linux操作系統(tǒng)——會導(dǎo)致Linux內(nèi)核Crash!
Linux kernel是在2.6.18-164.e15之后的版本中解決了這個問題。換句話說,Linux kernel低于2.6.18-164的Linux系統(tǒng),無論是什么公司的Linux都將受到影響。(大家可以查看一下你的Linux系統(tǒng)日志,看看閏秒有沒有發(fā)生)
可以參看下面的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
那么,我們的操作系統(tǒng)是怎么處理正閏秒通知的?通常來說有三種實現(xiàn):
后退一秒。
停止一秒。
真正的增加一秒。
懂編程的人一眼就能看出來,前兩種方式是以一種Workaround或Hack的方式解決這個問題。第一種方式會導(dǎo)致一些基于timestamp的消息通知亂序了,而第二種會導(dǎo)致出現(xiàn)兩個一模一樣的timestamp。最后一種不會出現(xiàn)timestamp的問題。
最后,說說Windows,Windows Time Service不支持閏秒通知,所以,當(dāng)閏秒發(fā)生的時候,你的Windows上的時間會比實際時間快一秒鐘,這需要等下一次的時鐘同步才會完成修正。你可以查看這篇文章:http://support.microsoft.com/kb/909614/en-us