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