天天看點

計算機時鐘是如何運作的?

計算機時鐘是如何運作的?

文章目錄

  • 時間為什麼總是走“不準”?
  • 自動校準網絡時間
  • 國際時間标準
  • 計算機如何同步時間?
  • 參考文獻

在網上看到這個問題,這是個好問題。在分布式鎖的學習過程中看到馬丁博士指出計算機時鐘不可信的觀點的時候,我也曾疑慮過,我認同這個觀點,但是我不知道為什麼計算機時鐘不可信。

今天有個大佬把這個問題解答了,我學習總結一下。

時間為什麼總是走“不準”?

小時候,家裡的牆上總是挂着一個大時鐘。每過一段時間,我就要去手動調整一下,因為它不準了。那時候小,以為是指針向上走的時候比較難,向下走的時候有慣性,是以走着走着就有了偏差。

後來有電腦了,但是由于經常的高三,電腦就一直處于關機狀态。當聯考完想打開電腦打遊戲的時候,發現它的時鐘也不準了。當時覺得是因為長時間斷電導緻的。

後來我明白,鐘表和計算機内部都有一個叫做「晶體振蕩器」的東西,給它加上電壓,它就會以固定的頻率振動。但這個振動頻率的「穩定性」,取決于它的制造技術,以及外界環境的影響。雖然它們的誤差很小,但日積月累下來,誤差就越來越明顯。

原來牆上的鐘表不準是時間的傑作呀,原來那個電腦時鐘不準真的是因為斷電呀。。

自動校準網絡時間

現在的計算機都有自動校準網絡時間的功能了,但是問題來了,這個網絡時間?哪兒來的?可靠?可控?

為什麼我電腦上的網絡時間和你電腦上的網絡時間會是一緻的呢?

首先我們排除一下我們的電腦通過網絡互通有無的可能性哈,網絡都是有延遲的。

其實最早接觸計算機時間的時候,我是這樣想的:國際上有某個管理計算機時鐘的組織,我們的每台電腦向該組織校準我們的時間,再通過一定的技術消除這個網絡延遲。

看到我這句話學實體的朋友估計要沖出來揍我了:​誤差隻能減少,不可能消除​。

雖然我實體不咋地,但是這句話我還是有深刻印象的。

是以,我電腦上的時間,跟你電腦上的時間,肯定是不一樣的,隻不過這個差距可以通過技術手段使得它小的可憐。

我看的那篇回答中還介紹了時間是怎麼來的,以及人類對時間認知的發展。這裡我就不多說了,文末附上原文,感興趣的朋友或者覺得我說的理論不通的朋友可自行檢視。

國際時間标準

現在,科學家制定出了兩套時間标準:

1、世界時:基于天文現象 + 鐘表計時,永遠與地球自轉時間相比對。(如果對天文學有感興趣的朋友會知道,地球的自轉是越來越慢的,每年都要少那麼幾分鐘。)

2、國際原子時:基于原子鐘計時,每一秒的周期完全等長且固定(以铯原子躍遷 9192631770 個周期,所持續的時間長度定義為 1 秒!)

這個铯原子非常之穩定,計時上億年誤差不會超過一秒。

為了協調二者,出現了閏秒的概念。(這裡主要是要說一聲兒:雖然一個慢,一個穩,但是會通過人為手段使二者基本一緻。我們的計算機使用的自然是原子時間了。)

同時,為了進一步降低原子鐘的測量誤差,每個國家會在每個月,統一上報自己計算的協調世界時到一個權威機構,然後這個權威機構會根據各國實驗室的精度,進行權重計算,算出「最終」的協調世界時。

之後,再把這個最終的時間下發到各個國家,讓各個國家進行對表校準,保證全世界的時間誤差在 100 納秒以内。

之後,中國會在自己算出的協調世界時的基礎上,再加 8 個小時(中國在東八區),最終得出來的時間,就是「中原標準時間」!

計算機如何同步時間?

通常來說,無線電波的傳播速度更快、傳播誤差小,是以授時中心會通過這種方式,把時間發送給全國各地的「時間伺服器」。

時間伺服器有了準确的時間後,再通過其它方式(例如網絡)廣播到下一層的終端使用者使用。

現在知道我們的網絡時間是這麼來的了,就又回到開頭的問題了:消除誤差(啊呸,減少誤差)。

資料在網絡傳輸過程中,也是需要時間的,這個時間也會影響到時間的準确性。

于是人們想了一種方案,當計算機在做時間校準時,也需要把網絡延遲計算進去,最後「修正」這個同步過來的時間,降低誤差。

具體怎麼做呢?空話誰都會說。

現在,已經有個軟體已經把這一切都做好了。我們部署應用程式的伺服器上,都會啟動一個「自動校準」時間的服務,這個服務就是 NTP(Network Time Protocol),它可以保證每台機器的時間與時間伺服器保持同步。

簡單來講,它是通過在網絡封包上打「時間戳」的方式,然後配合計算網絡延遲,進而修正本機的時間。

計算機時鐘是如何運作的?
網絡延時 = (t4 - t1) - (t3 - t2)
時間差 = t2 - t1 - 網絡延時 / 2 = ((t2 - t1) + (t3 - t4)) / 2      

這個計算過程​假設​網絡來回路徑是對稱的,并且時延相同。

這樣一來,用戶端就可以「校準」自己的本機時間了,與服務端保持同步,這個時間誤差在廣域網下是 10ms - 500ms,在區域網路下通常可以小于 1ms。

​同步時間時,對正在運作的程式有沒有影響?​

可大可小,萬一出現“時間倒流”的情況,對某些使用時間戳的系統的影響就,嗯。對于無所謂時間的系統那另當别論。

我想這裡需要解釋一下為什麼會出現“時光倒流”的情況:

我們的計算機是每隔一段時間向時間伺服器請求時間的,不可能說時時刻刻都在校準哈,校準之後還是要依靠自身電磁振蕩來維系的。是以在後面校準的時候可能會出現偏差。

NTP 在校準時間時,提供了 2 種方式:

1、ntpdate:一切以服務端時間為準,「強制修改」本機時間

2、ntpd:采用「潤物細無聲」的方式修改本機時間,把時間差均攤到每次小的調整上

也就是說,ntpd 當接收到需要「回撥」的時間時,會讓本機時間走得「慢」一點,小步調整,逐漸與服務端的時鐘「對齊」,這樣一來,本機時間依舊是遞增的,避免發生「倒流」。

當我們在配置 ntp 服務時,需要格外注意這種情況。另外,在編寫程式時,也要注意調用的時間 API 擷取的是哪個時間,避免業務邏輯發生異常。

參考文獻

計算機時鐘是如何運作的?時針硬體、時針軟體、NTP與計算機時鐘都有什麼聯系?怎樣才能清楚的描述出來?