你真的理解计算机时间吗?
前言
對于計算機系統(tǒng)中的時間,如果你曾經(jīng)思考過下面的問題,但是沒有結(jié)論,那么通過本文將給你詳細(xì)的解答:
背景
時間是一個非常抽象的問題,吸引著許多偉大的神學(xué)家、哲學(xué)家和物理學(xué)家花畢生精力去解釋時間的本質(zhì)是什么,然而依然沒有定論。幸運的是我們只需要討論計算機系統(tǒng)中的時間相關(guān)的問題,可以不用關(guān)心宇宙、黑洞、相對論和量子力學(xué)等等繁復(fù)的課題。但雖然僅僅局限在計算機這一個很小的范疇中,這看似已經(jīng)不再復(fù)雜的主題,卻并也不會如此簡單。
計算機系統(tǒng)的時鐘
在計算機系統(tǒng)中主要有兩種時鐘:一種是墻上時鐘,一種是單調(diào)時鐘。它們都可以衡量時間,但卻有著本質(zhì)的區(qū)別,下面我們一一來分析。
墻上時鐘
墻上時鐘又稱為鐘表時間,顧名思義,和我們平時使用的鐘表的時間一樣,表示形式為日期與時間。在linux系統(tǒng)中墻上時鐘的表示形式為UTC時間,記錄的是自公元1970年1月1日0時0分0秒以來的秒數(shù)和毫秒數(shù)(不含閏秒),linux系統(tǒng)需要處理閏秒的邏輯就是由于linux系統(tǒng)使用UTC時間,但是系統(tǒng)中記錄的UTC時間是不含閏秒導(dǎo)致的,后面閏秒相關(guān)的部分會詳細(xì)的介紹。
時間同步
根據(jù)定義可以發(fā)現(xiàn),墻上時鐘的標(biāo)準(zhǔn)是在計算機外部定義的,所以需要確保墻上時鐘的準(zhǔn)確性就變成一個問題。計算機內(nèi)部的計時器為石英鐘,但是它不夠精確,存在過快或者過慢的問題,這主要取決于機器的溫度。所以依靠計算機自身來維持墻上時鐘的準(zhǔn)確性是不可能的。目前普遍采取的一種方式為計算機與NTP時間服務(wù)器進行定期通過網(wǎng)絡(luò)同步。當(dāng)然這個方式受限于網(wǎng)絡(luò)環(huán)境的影響,一般來說至少會有35毫秒的偏差,最大的時候可能會超過1秒。
對于一些對時間精度要求很高的系統(tǒng),通過NTP進行同步是遠(yuǎn)遠(yuǎn)不夠的,而通過GPS接收機接受標(biāo)準(zhǔn)的墻上時鐘,然后在機房內(nèi)部通過精確時間協(xié)議(PTP)進行同步。PTP是一種高精度時間同步協(xié)議,可以到達亞微秒級精度,有資料說可達到30納秒左右的偏差精度,但需要網(wǎng)絡(luò)的節(jié)點(交換機)支持PTP協(xié)議,才能實現(xiàn)納秒量級的同步。
對于時間同步,Google的做法更酷,通過GPS接收機接受標(biāo)準(zhǔn)的墻上時鐘,然后通過機房內(nèi)部部署原子鐘(精度可以達到每2000萬年才誤差1秒)來防止GPS接收機的故障。通過這些時間協(xié)調(diào)裝置會連接到特定數(shù)量的主服務(wù)器,然后再由主服務(wù)器向整個谷歌網(wǎng)絡(luò)中運行的其他計算機傳輸時間讀數(shù)(TrueTime API)。Google正是基于上面的時間精度保證,在此基礎(chǔ)上實現(xiàn)了第一個可擴展的、全球分布式的數(shù)據(jù)庫Spanner。
閏秒出現(xiàn)的原因
目前存在兩種時間計量系統(tǒng):基于地球自轉(zhuǎn)的世界時(UT1),它以地球自轉(zhuǎn)運動來計量時間,但由于地球自轉(zhuǎn)速率正在變慢,所以世界時的秒長會有微小的變化,每天達到千分之幾秒。原子時是取微觀世界的銫原子兩個超精細(xì)能級間躍遷輻射頻率來度量時間,精確度非常高,每天快慢不超過千萬分之一秒。從上面可以看出,原子時是度量時間均勻的尺度,但是與地球空間位置無關(guān);世界時度量時間的均勻性不好,但是它定義地球自轉(zhuǎn)一周為一天,繞太陽公轉(zhuǎn)一周為一年,這對人們的日常生產(chǎn)生活非常重要。
為了統(tǒng)一原子時與世界時直接的差距,就產(chǎn)生了協(xié)調(diào)世界時(UTC)。從1972年1月1日0時起,協(xié)調(diào)世界時秒長采用原子時秒長,時刻與世界時時刻之差保持在正負(fù)0.9秒之內(nèi),必要時用階躍1整秒的方式來調(diào)整。這個1整秒的調(diào)整,就稱為閏秒(增加1秒為正閏秒,較少1秒為負(fù)閏秒)。UTC從1972年1月正式成為國際標(biāo)準(zhǔn)時間,它是原子時和世界時這兩種時間尺度的結(jié)合。
閏秒的處理
由于linux系統(tǒng)記錄的是自公元1970年1月1日0時0分0秒以來的秒數(shù)和毫秒數(shù),但是不含閏秒,這表示在linux系統(tǒng)中每分鐘有60秒,每天有86400秒是系統(tǒng)定義死的。所以linux系統(tǒng)需要額外的邏輯來處理閏秒。
跳躍式調(diào)整
當(dāng)UTC時間插入一個正閏秒后,linux系統(tǒng)需要跳過1秒,因為閏秒的這一秒鐘在linux系統(tǒng)中不能被表示;當(dāng)UTC時間插入一個負(fù)閏秒后,linux系統(tǒng)需要插入1秒,因為閏秒的這一秒鐘在linux系統(tǒng)中不存在。目前l(fā)inux系統(tǒng)就是采用該方式來處理閏秒的。在2012年6月30日UTC時間插入一個正閏秒的時候,由于linux系統(tǒng)的某些版本的閏秒處理邏輯觸發(fā)了一個死鎖的bug,造成了大規(guī)模的linux服務(wù)器內(nèi)核死鎖而宕機。
NTP服務(wù)的slew模式
NTP服務(wù)的slew模式并不使用跳躍式修改時間,而是漸進式的調(diào)整。比如當(dāng)UTC時間需要插入一個正閏秒,NTP服務(wù)會每秒調(diào)整一定ms來緩慢修正時間。這樣linux系統(tǒng)從NTP服務(wù)同步時間的時候就不會感知閏秒的存在了,內(nèi)核也就不需要啟動閏秒相關(guān)的邏輯了。
單調(diào)時鐘
單調(diào)時鐘它總是保證時間是向前的,不會出現(xiàn)墻上時鐘的回?fù)軉栴}。它非常適合用來測量持續(xù)時間段,比如在一個時間點讀取單調(diào)時鐘的值,完成某項工作后再次獲得單調(diào)時鐘的值,時鐘值之差為兩次檢測之間的時間間隔。
但是單調(diào)時鐘的絕對值沒有任何意義,它可能是計算機自啟動以后經(jīng)歷的納秒數(shù)等等。因此比較不同節(jié)點上的單調(diào)時鐘的值是沒有意義的。
時間的管理
時間的概念對于計算機來說有些模糊,計算機必須在硬件的幫助下才能計算和管理時間。前面說的石英鐘就是用來做計算機的系統(tǒng)定時器的,系統(tǒng)定時器以某種固定的頻率自行觸發(fā)時鐘中斷。由于時鐘中斷的頻率是編程預(yù)定的,所以內(nèi)核知道連續(xù)兩次時鐘中斷的間隔時間(這個間隔時間就稱為節(jié)拍)。通過時鐘中斷,內(nèi)核周期性地更新系統(tǒng)的墻上時鐘和單調(diào)時鐘,從而計算和管理好時間。
時間的精度
目前系統(tǒng)定時器的中斷頻率為1000HZ,那么計算機能處理的時間精度為1ms。然而很多時候需要更加精確的時間,比如1微妙,計算機是怎么來解決這個問題的呢?
在每一次計算機啟動的時候,計算機都會計算一次BogoMIPS的值,這個值的意義是處理器在給定的時間內(nèi)執(zhí)行指令數(shù),通過BogoMIPS值,計算機就可以得到很小很小的精度了。比如1秒計算機執(zhí)行了N條指令,那么計算機的精度就可以達到N分之一秒。很明顯N是一個非常非常大的數(shù)目,因而計算機可以得到非常非常精確的時間。
總結(jié)
在本文中,我們討論了計算機系統(tǒng)時間同步的方式,同時分析了閏秒產(chǎn)生的原因,以及l(fā)inux系統(tǒng)應(yīng)對的辦法,然后概覽性的講了linux系統(tǒng)是怎么進行時間的計算與管理的,最后分析了linux系統(tǒng)可以提高高精度時間的方法。
參考
- 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
- Robert Love.Linux Kernel Development
- Martin Kleppmann.Designing Data-Intensive Applications
總結(jié)
以上是生活随笔為你收集整理的你真的理解计算机时间吗?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 程序猿炫起富来你们根本看不懂!
- 下一篇: 对口单招计算机电工试题答案,对口单招电子