閱讀本文大約需要 13 分鐘。 大家好,
這篇文章我想和你聊一聊「時(shí)間」這個(gè)話題。 時(shí)間總是在不經(jīng)意間流逝,
我們?cè)趯懘a時(shí),也 經(jīng) 常會(huì)調(diào)用「時(shí)間 API」,你有思考過(guò)這背后的原理嗎? 關(guān)于時(shí)間的問(wèn)題還有很多,例如:
為什么計(jì)算機(jī) 的時(shí)間有時(shí)候「走不準(zhǔn)」? 計(jì)算機(jī)究竟是怎么「自動(dòng)校準(zhǔn)」時(shí)間的? 我們經(jīng)??吹降?UTC 時(shí)間,到底是什么? 我們?cè)谛侣勆峡吹降摹副本r(shí)間」,真的來(lái)自北京嗎? 這篇文章,我們就來(lái)揭秘時(shí)間背后的秘密。
這篇文章非常有意思,希望你可以耐心讀完。 時(shí)間為什么總是走“不準(zhǔn)”? 你肯定遇到過(guò)這樣的場(chǎng)景,家里買了一個(gè)鐘表,時(shí)間一長(zhǎng),就會(huì)發(fā)現(xiàn)它走得「不準(zhǔn)」了。又或者,一臺(tái)長(zhǎng)時(shí)間不使用的電腦,它的時(shí)間也會(huì)發(fā)生偏差。遇到這些情況,你可能會(huì)不以為然。時(shí)間不準(zhǔn),那我們就「人工」調(diào)準(zhǔn)它。但你有沒(méi)有停下來(lái)想一想,為什么它們的時(shí)間會(huì)越走越不準(zhǔn)呢?要回答這個(gè)問(wèn)題其實(shí)不難,我們只需要搞清楚,它們的時(shí)間是怎么來(lái)的。鐘表和計(jì)算機(jī)內(nèi)部都有一個(gè)叫做「晶體振蕩器」的東西,給它加上電壓,它就會(huì)以固定的頻率振動(dòng)。但這個(gè)振動(dòng)頻率的「穩(wěn)定性」,取決于它的制造工藝,以及外界環(huán)境的影響。出于成本的考慮,鐘表的制作工藝沒(méi)那么高,所以它更容易有誤差。而電腦制造工藝雖然比較高,但它內(nèi)部的晶體振蕩器也會(huì)受到「溫度」變化帶來(lái)的影響,在工作過(guò)程中,也會(huì)有產(chǎn)生誤差。雖然它們的誤差很小,但日積月累下來(lái),誤差就越來(lái)越明顯。因此,我們現(xiàn)在使用的計(jì)算機(jī),都有「自動(dòng)校準(zhǔn)」時(shí)間的功能。但是如何校準(zhǔn)呢?
如何校準(zhǔn)時(shí)間? 很簡(jiǎn)單,只要你把電腦連上了「網(wǎng)絡(luò)」,你會(huì)發(fā)現(xiàn),它會(huì)自動(dòng)與「網(wǎng)絡(luò)時(shí)間」保持同步。可問(wèn)題是,這個(gè)「網(wǎng)絡(luò)時(shí)間」哪兒來(lái)的?我猜你大腦的第一反應(yīng)是,每臺(tái)電腦肯定配置了一個(gè)「時(shí)間服務(wù)器」,之后這臺(tái)電腦會(huì)與服務(wù)器定時(shí)同步,自動(dòng)校準(zhǔn)。沒(méi)錯(cuò),確實(shí)是這樣,不光是電腦,我們平時(shí)使用的手機(jī)、平板、智能手表等電子設(shè)備,只要能連接網(wǎng)絡(luò),都會(huì)自動(dòng)同步網(wǎng)絡(luò)時(shí)間。那繼續(xù)追問(wèn),這個(gè)「時(shí)間服務(wù)器」的時(shí)間就一定是準(zhǔn)的嗎?理論來(lái)講,它應(yīng)該也是一臺(tái)計(jì)算機(jī),難道它不會(huì)遇到我們前面說(shuō)的問(wèn)題嗎?此外,這個(gè)網(wǎng)絡(luò)時(shí)間究竟是怎么「同步」到我們的電腦上的?你可能會(huì)說(shuō),那肯定是通過(guò)網(wǎng)絡(luò)數(shù)據(jù)包。問(wèn)題又來(lái)了,網(wǎng)絡(luò)傳輸數(shù)據(jù)也是有「延遲」的,同步服務(wù)器時(shí)間,不還是存在誤差嗎?環(huán)環(huán)相扣,像一個(gè)俄羅斯套娃,很難解釋清楚。要想徹底搞清楚這些問(wèn)題,就要深入到時(shí)間的「源頭」來(lái)尋找答案。
時(shí)間是怎么來(lái)的? 時(shí)間是一個(gè)非常抽象的概念,多少年來(lái),吸引著無(wú)數(shù)科學(xué)家、物理學(xué)家、甚至哲學(xué)家花費(fèi)畢生精力去解釋時(shí)間的本質(zhì)是什么,從宇宙大爆炸到時(shí)空相對(duì)論,從黑洞到量子力學(xué),都能看到關(guān)于時(shí)間這個(gè)問(wèn)題的身影。這里我們不探討高深莫測(cè)的學(xué)術(shù)知識(shí),只把目光放聚焦在計(jì)算機(jī)這個(gè)很小的范疇內(nèi)。但要想清楚解釋這個(gè)問(wèn)題,也并非想的那么簡(jiǎn)單。我們從最簡(jiǎn)單的開始說(shuō)起。想要知道時(shí)間是怎么被定義的,首先要知道「天」是怎么來(lái)的?答案是:
觀察太陽(yáng) 。由于地球的「自轉(zhuǎn)」,人們可以看到日出日落,人們?nèi)粘龆鳎章涠ⅲ跃桶堰@一周期現(xiàn)象定義為「天」。地球除了自轉(zhuǎn),還在圍繞太陽(yáng)公轉(zhuǎn),所以公轉(zhuǎn)一周就被定義為一「年」。從這些現(xiàn)象就能看出來(lái),很早之前的人們,是以「天文現(xiàn)象」來(lái)確定時(shí)間的。再后來(lái),人們?yōu)榱税褧r(shí)間定義得更「精確」,就把一天平均劃分為 24 等份,這就是「時(shí)」。同樣地,把 1 小時(shí)劃分 60「分鐘」,1 分鐘劃分為 60「秒」。這樣,時(shí)間的基本單位「秒」就被定義出來(lái)了。所以,秒與天的關(guān)系就是這樣的:
1 秒 = 1 / 24 * 60 * 60 = 1 / 86400 天 。這些定義,都與「地球自轉(zhuǎn)」和「太陽(yáng)」息息相關(guān)。但是,后來(lái)人們發(fā)現(xiàn),地球的公轉(zhuǎn)軌道并不是一個(gè)正圓,而是一個(gè)「橢圓」,也就是說(shuō)公轉(zhuǎn)速度是「不均勻」的,這意味著什么呢?這意味著每天的時(shí)間不是等長(zhǎng)的,那根據(jù)天推算出的秒,自然也不是「等長(zhǎng)」的。很明顯,這里的計(jì)算存在誤差。這怎么辦?聰明的人們就想到,把一年內(nèi)所有天的時(shí)長(zhǎng)加起來(lái),然后求「平均」,得到相對(duì)固定的「天」,然后再計(jì)算得出「相對(duì)平均」的秒,這樣就減小了誤差。確定了天文規(guī)律,人們開始制造「鐘表」,把時(shí)間表示出來(lái)。從擺鐘到機(jī)械鐘,再到現(xiàn)代廣泛使用的石英鐘,鐘表的制作工藝越來(lái)越高,時(shí)間精度也越來(lái)越高,現(xiàn)代石英鐘每天的計(jì)時(shí)誤差只有「千分之一秒」。所以,在 1927 年,
人們以基于「天文現(xiàn)象」 「鐘表計(jì)時(shí)」,確立了第一套時(shí)間標(biāo)準(zhǔn):世界時(shí)(Universal Time,簡(jiǎn)稱 UT)。 但是,隨著科技的發(fā)展,人類對(duì)太陽(yáng)的觀測(cè)越來(lái)越精準(zhǔn),有意思的事情發(fā)生了。人們發(fā)現(xiàn),地球每天的自轉(zhuǎn)速度也「不是勻速」的,地球的自轉(zhuǎn)受到潮汐、地殼運(yùn)動(dòng)、冰川融化、地震等自然現(xiàn)象的影響,越來(lái)越慢!這會(huì)導(dǎo)致什么問(wèn)題呢?這會(huì)導(dǎo)致之前規(guī)定的,每年平均下來(lái)一天的時(shí)間,現(xiàn)在來(lái)看,也是不一樣長(zhǎng)的。例如,第 1 年算出來(lái)平均一天的時(shí)間是 23.9997 小時(shí),第 2 年可能是 23.998 小時(shí),第 3 年可能是 23.999 小時(shí)...那按照 1 秒 = 1 / 86400 天的定義,每一年的「秒」,也是不一樣長(zhǎng)的。這就比較尷尬了,人們以地球自轉(zhuǎn)為依據(jù),定義出來(lái)的時(shí)間,還是不準(zhǔn)!你可能會(huì)想,時(shí)間有誤差會(huì)有什么問(wèn)題嗎?人們依賴不準(zhǔn)確的天文現(xiàn)象,不也生活了幾個(gè)世紀(jì)么?確實(shí),對(duì)于人們的基本生活影響其實(shí)并不大。但隨著人類活動(dòng)的發(fā)展,人們對(duì)于高精度的時(shí)間場(chǎng)景開始變得越來(lái)越多。例如,體育賽事中百分之一秒的差距就能決定勝負(fù),炮彈的發(fā)射要精確在千分之一秒內(nèi)發(fā)生,雷達(dá)技術(shù)甚至需要精確到百萬(wàn)分之一秒...尤其是衛(wèi)星發(fā)射、火箭試驗(yàn)等航天領(lǐng)域,對(duì)高精度的時(shí)間系統(tǒng)也提出了越來(lái)越高的要求!怎么辦?怎么徹底解決時(shí)間不準(zhǔn)的問(wèn)題?聰明的科學(xué)家們開始思考,既然觀測(cè)天文現(xiàn)象無(wú)法解決這個(gè)問(wèn)題,那在微觀層面能否找到比較好的解決方案嗎?這時(shí),他們開始把目光投向了「微觀世界」。
一秒到底有多長(zhǎng)? 讓我們梳理一下我們的需求。一直以來(lái),我們對(duì)于「秒」的定義需求,從本質(zhì)上講,就是想要一個(gè)「完全穩(wěn)定」的周期,也就是說(shuō),期望每一秒都是固定「等長(zhǎng)」的。而以天文觀測(cè)、地球自轉(zhuǎn)為基礎(chǔ)的時(shí)間測(cè)量,做不到這一點(diǎn)。那在微觀世界層面,是否存在一種元素,它的運(yùn)動(dòng)周期是「高度穩(wěn)定」,不受外界環(huán)境影響的呢?科學(xué)家們沿著這個(gè)思路開始探索...好,現(xiàn)在讓我們把視角下放,來(lái)到原子世界。一個(gè)原子雖然很小,但它內(nèi)部卻是一個(gè)很復(fù)雜的世界。每個(gè)原子都有一個(gè)原子核,核外分層排布著高速運(yùn)轉(zhuǎn)的電子,當(dāng)原子受電磁輻射時(shí),它的軌道電子可以從一個(gè)位置「跳」到另一個(gè)位置,物理學(xué)上稱此為「躍遷」。人們發(fā)現(xiàn),原子內(nèi)的電子發(fā)生躍遷時(shí),原子會(huì)吸收或放出一定能量的「電磁波」,這類電磁波就是一種「周期運(yùn)動(dòng)」,我們也可以把它看成原子內(nèi)部的「振蕩」。
基于這個(gè)原理,科學(xué)家們開始不斷地試驗(yàn)、研究,嘗試尋找一種運(yùn)動(dòng)「周期短、高度穩(wěn)定」的原子。終于,科學(xué)家們發(fā)現(xiàn)確實(shí)存在這樣一種原子:
銫原子 ,它內(nèi)部的振蕩周期比其它原子都要
更短、更穩(wěn)定 ,而且,這個(gè)過(guò)程基本不受環(huán)境因素的干擾。經(jīng)過(guò)層層試驗(yàn),科學(xué)家們認(rèn)為這是目前人類在地球上可測(cè)量到的,運(yùn)動(dòng)周期最短、周期最穩(wěn)定的元素!之后,科學(xué)家們就以之前定義的「秒」為基礎(chǔ),去測(cè)量一秒內(nèi)這個(gè)銫原子內(nèi)部電子周期運(yùn)動(dòng)的「次數(shù)」,測(cè)量出來(lái)的結(jié)果為 9192631770 次(91 億 次)。基于此,科學(xué)家們決定「拋棄」原來(lái)基于天文測(cè)量的秒,重新定義「秒」的時(shí)長(zhǎng),就是這個(gè)高度穩(wěn)定的運(yùn)動(dòng)周期。因此,在 1967 年,國(guó)際度量衡大會(huì)決定采用,
以銫原子躍遷 9192631770 個(gè)周期,所持續(xù)的時(shí)間長(zhǎng)度定義為 1 秒! 注:這個(gè)測(cè)量原理和測(cè)量過(guò)程比較復(fù)雜,這里把這些物理細(xì)節(jié)簡(jiǎn)化了。不用太過(guò)糾結(jié)這個(gè)數(shù)值是怎么測(cè)量出來(lái)的,你只需要理解,這個(gè)微觀原子內(nèi)部的振蕩周期是非常穩(wěn)定的,它比之前根據(jù)天文現(xiàn)象測(cè)量出來(lái)的秒,要精確多得多。 而基于這個(gè)銫原子振蕩制造出來(lái)的時(shí)鐘,我們就把它稱之為「原子鐘」。有了原子鐘,這就意味著,原子鐘輸出的每一秒,都是絕對(duì)「等長(zhǎng)」的,非常穩(wěn)定,這樣一來(lái),就實(shí)現(xiàn)了「精準(zhǔn)計(jì)時(shí)」!這個(gè)精確程度可以達(dá)到多高呢?2000 萬(wàn)年不差 1 秒!可見其精準(zhǔn)程度之高。
科研技術(shù)還在發(fā)展,精密設(shè)備和測(cè)量能力也越來(lái)越高,最新的原子鐘甚至可以達(dá)到 1 億年不差 1 秒! 有了原子鐘,
人們基于原子鐘又確立了一套新的時(shí)間標(biāo)準(zhǔn),叫做「國(guó)際原子時(shí)」(International Atomic Time,簡(jiǎn)稱 TAI)。 科學(xué)家們規(guī)定,從 1958-01-01 00:00:00 起,用原子時(shí)開始計(jì)時(shí),它每走的一秒,都是非常精確的一秒(固定等長(zhǎng)),實(shí)打?qū)嵉囊幻耄耆€(wěn)定的一秒。這個(gè)方案非常棒,至此終于解決了秒不固定長(zhǎng)的問(wèn)題。那有了這個(gè)國(guó)際原子時(shí),可否讓它直接取代掉前面說(shuō)的——以天文現(xiàn)象計(jì)時(shí)的「世界時(shí)」呢?答案是否定的,這個(gè)問(wèn)題遠(yuǎn)比想象的復(fù)雜得多,這是為什么呢?
世界標(biāo)準(zhǔn)時(shí)間是怎么來(lái)的? 現(xiàn)在,科學(xué)家制定出了兩套時(shí)間標(biāo)準(zhǔn):
世界時(shí) :基于天文現(xiàn)象 鐘表計(jì)時(shí),永遠(yuǎn)與地球自轉(zhuǎn)時(shí)間相匹配國(guó)際原子時(shí) :基于原子鐘計(jì)時(shí),每一秒的周期完全等長(zhǎng)且固定假設(shè)我們以
國(guó)際原子時(shí) 為時(shí)間標(biāo)準(zhǔn),那會(huì)發(fā)生什么現(xiàn)象呢?因?yàn)樵訒r(shí)非常穩(wěn)定,但世界時(shí)隨著地球自轉(zhuǎn)變慢,會(huì)越來(lái)越慢,就會(huì)發(fā)生這種現(xiàn)象:
原子時(shí)走得快,世界時(shí)走得慢,時(shí)間越久,兩者差距越來(lái)越大 日復(fù)一日,幾百年后,世界時(shí)的正午 12 點(diǎn)是太陽(yáng)高照的時(shí)刻,而原子時(shí)可能已經(jīng)走到了下午 2 點(diǎn)了 幾千年后,太陽(yáng)高照的時(shí)刻,原子時(shí)可能已經(jīng)走到了晚上 8 點(diǎn) ! 晚上 8 點(diǎn)是太陽(yáng)高照的時(shí)刻,你能想象這種情況嗎?這太顛覆我們的生活認(rèn)知了...基于天文測(cè)算的世界時(shí),已經(jīng)指導(dǎo)我們?nèi)祟惿盍松锨?,人類早已?xí)慣了這種時(shí)間標(biāo)準(zhǔn),直接被原子時(shí)取代,肯定是不能接受的。但我們又需要原子時(shí)這種高度穩(wěn)定的計(jì)時(shí)標(biāo)準(zhǔn),來(lái)發(fā)展科學(xué)研究,兩者發(fā)生矛盾,這怎么辦?科學(xué)家們又開始思考,終于想到一個(gè)互相兼容的解決方案。既然兩套時(shí)間標(biāo)準(zhǔn)都很重要,那兩者都保留,不會(huì)互相取代。我們可以再建立一套「新的時(shí)間標(biāo)準(zhǔn)」,這套時(shí)間以「原子時(shí)為基準(zhǔn)」,開始計(jì)時(shí),走的每一秒都是穩(wěn)定、精確的。同時(shí),為了兼顧基于天文測(cè)量的世界時(shí),人類會(huì)「持續(xù)觀測(cè)」世界時(shí)與這個(gè)新時(shí)鐘的差距。如果發(fā)現(xiàn)兩者相差過(guò)大時(shí),我們就「人為」地調(diào)整一下這個(gè)時(shí)鐘(加一秒或減一秒),讓兩者相差不超過(guò) 0.9 秒。例如,這個(gè)時(shí)鐘本身比世界時(shí)走得快,經(jīng)過(guò)一段時(shí)間后,如果發(fā)現(xiàn)兩者相差越來(lái)越大,那就給這個(gè)時(shí)鐘「加一秒」,讓這個(gè)時(shí)鐘在 23:59:59 的下一秒變?yōu)?23:59:60 秒,讓它與世界時(shí)差距控制在 0.9 秒以內(nèi),這個(gè)操作過(guò)程,相當(dāng)于讓快的時(shí)鐘稍微「等」一下走得慢的世界時(shí)。
而加的這一秒,科學(xué)家把它定義為「閏秒」。 是不是挺有意思?聽說(shuō)過(guò)閏年,沒(méi)想到還有閏秒!
當(dāng)然,當(dāng)?shù)厍蜃赞D(zhuǎn)速度變快時(shí),這里也有可能是減一秒,即從 23:59:58 直接跳到 00:00:00。但這種情況比較少,大部分情況下,地球自轉(zhuǎn)速度是越來(lái)越慢的。 這么做的好處在于,這個(gè)時(shí)鐘的每一秒的計(jì)時(shí)依舊是精確的,而且還兼顧了日常生活使用的世界時(shí),一舉兩得!
由于這個(gè)時(shí)鐘是基于原子時(shí) 世界時(shí)「協(xié)調(diào)」得出的,所以科學(xué)家們把它定義為協(xié)調(diào)世界時(shí)(Coordinated Universal Time,簡(jiǎn)稱 UTC)。 看到了么?我們?cè)陂_發(fā)時(shí)經(jīng)??吹降?UTC,原來(lái)是這樣來(lái)的! 有了這個(gè)研究成果,有技術(shù)能力的國(guó)家都紛紛制造自己的原子鐘,然后計(jì)算協(xié)調(diào)世界時(shí)。同時(shí),為了進(jìn)一步降低原子鐘的測(cè)量誤差,每個(gè)國(guó)家會(huì)在每個(gè)月,統(tǒng)一上報(bào)自己計(jì)算的世界協(xié)調(diào)時(shí)到一個(gè)權(quán)威機(jī)構(gòu),然后這個(gè)權(quán)威機(jī)構(gòu)會(huì)根據(jù)各國(guó)實(shí)驗(yàn)室的精度,進(jìn)行加權(quán)計(jì)算,算出「最終」的協(xié)調(diào)世界時(shí)。之后,再把這個(gè)最終的時(shí)間下發(fā)到各個(gè)國(guó)家,讓各個(gè)國(guó)家進(jìn)行「對(duì)表」校準(zhǔn),保證全世界的時(shí)間誤差在
100 納秒 以內(nèi)。至此,科學(xué)家們建立的這套時(shí)間標(biāo)準(zhǔn),就是我們現(xiàn)在沿用至今的「
標(biāo) 準(zhǔn) 時(shí) 間 」!值得一提的是,配合計(jì)算世界協(xié)調(diào)時(shí)的國(guó)家,也有中國(guó),這個(gè)實(shí)驗(yàn)室就是「中國(guó)科學(xué)院國(guó)家授時(shí)中心」,它位于中國(guó)的陜西省渭南市蒲城縣,持續(xù)維護(hù)中國(guó)的標(biāo)準(zhǔn)時(shí)間。
為什么國(guó)家授時(shí)中心會(huì)設(shè)立在陜西???因?yàn)殛兾魇〉牡乩砦恢锰幱谥袊?guó)的中部,從這個(gè)位置向各地廣播時(shí)間時(shí),對(duì)全國(guó)每個(gè)地區(qū)距離都是相對(duì)平均的。 之后,中國(guó)會(huì)在自己算出的世界協(xié)調(diào)時(shí)的基礎(chǔ)上,再加 8 個(gè)小時(shí)(中國(guó)在東八區(qū)),最終得出來(lái)的時(shí)間,就是「
北 京 時(shí) 間 」!沒(méi)錯(cuò),就是我們經(jīng)常在新聞播報(bào)上聽到的,北京時(shí)間。
是不是挺有意思?北京時(shí)間并不是在北京產(chǎn)生的,而是在陜西省,并與參與世界時(shí)間的制定和校準(zhǔn)。 至此,全新的世界標(biāo)準(zhǔn)時(shí)間確立了,這套時(shí)間標(biāo)準(zhǔn)于 1972 年正式確定,一致沿用至今。有了標(biāo)準(zhǔn)時(shí)間,那么接下來(lái)的問(wèn)題就是,這個(gè)標(biāo)準(zhǔn)時(shí)間到底是如何同步到我們的電腦、手機(jī)、電子設(shè)備上的呢?這就是下面要講的「
授時(shí) 」。
計(jì)算機(jī)如何同步時(shí)間? 到現(xiàn)在我們知道,世界標(biāo)準(zhǔn)時(shí)間和北京時(shí)間是怎么來(lái)的,但北京時(shí)間的產(chǎn)生是在陜西省,難道校準(zhǔn)一次時(shí)間需要跑到這里嗎?很顯然是不需要的。位于陜西省的中國(guó)科學(xué)院國(guó)家授時(shí)中心,產(chǎn)生北京時(shí)間后,會(huì)通過(guò)一系列方式,把這個(gè)時(shí)間廣播出去,這個(gè)過(guò)程,就叫做「授時(shí)」。具體怎么做呢?國(guó)家授時(shí)中心提供很多授時(shí)方式,例如
無(wú)線電波、網(wǎng)絡(luò)、電話 ,都可以把時(shí)間廣播出去。
通常來(lái)說(shuō),無(wú)線電波的傳播速度更快、傳播誤差小,所以授時(shí)中心會(huì)通過(guò)這種方式,把時(shí)間發(fā)送給全國(guó)各地的「時(shí)間服務(wù)器」。時(shí)間服務(wù)器有了準(zhǔn)確的時(shí)間后,再通過(guò)其它方式(例如網(wǎng)絡(luò))廣播到下一層的終端用戶使用。經(jīng)過(guò)這么一番研究,到這里我們就可以解釋文章開頭的問(wèn)題了。一個(gè)時(shí)間服務(wù)器,原來(lái)是通過(guò)國(guó)家授時(shí)中心同步時(shí)間,然后再給其它終端提供時(shí)間同步服務(wù)的。那我們的計(jì)算機(jī)如何和它保持同步呢?你可能會(huì)想,最簡(jiǎn)單的方式就是,客戶端向服務(wù)端「請(qǐng)求獲取」標(biāo)準(zhǔn)時(shí)間,服務(wù)端響應(yīng)時(shí)間數(shù)據(jù),客戶端修改自己的「本機(jī)時(shí)間」即可。但事情沒(méi)你想的這么簡(jiǎn)單。因?yàn)閿?shù)據(jù)在網(wǎng)絡(luò)傳輸過(guò)程中,也是需要時(shí)間的,這個(gè)時(shí)間也會(huì)影響到時(shí)間的準(zhǔn)確性。這怎么辦呢?于是人們想了一種方案,當(dāng)計(jì)算機(jī)在做時(shí)間校準(zhǔn)時(shí),也需要把網(wǎng)絡(luò)延遲計(jì)算進(jìn)去,最后「修正」這個(gè)同步過(guò)來(lái)的時(shí)間,降低誤差。現(xiàn)在,已經(jīng)有個(gè)軟件已經(jīng)把這一切都做好了,如果你了解一些運(yùn)維相關(guān)的工作,就會(huì)知道,我們部署應(yīng)用程序的服務(wù)器上,都會(huì)啟動(dòng)一個(gè)「自動(dòng)校準(zhǔn)」時(shí)間的服務(wù),這個(gè)服務(wù)就是 NTP(Network Time Protocol),它可以保證每臺(tái)機(jī)器的時(shí)間與時(shí)間服務(wù)器保持同步。那 NTP 是怎么同步服務(wù)器時(shí)間的呢?這里就涉及到 2 個(gè)重點(diǎn):
NTP 如何同步時(shí)間? 同步時(shí)間時(shí),對(duì)正在運(yùn)行的程序有沒(méi)有影響? 先來(lái)看第一個(gè)問(wèn)題:
NTP 如何同步時(shí)間? 簡(jiǎn)單來(lái)講,它是通過(guò)在網(wǎng)絡(luò)報(bào)文上打「時(shí)間戳」的方式,然后配合計(jì)算網(wǎng)絡(luò)延遲,從而修正本機(jī)的時(shí)間。
根據(jù)圖示可以計(jì)算出網(wǎng)絡(luò)「?jìng)鬏斞舆t」,以及客戶端與服務(wù)端的「時(shí)間差」:
網(wǎng)絡(luò)延時(shí) = (t4 - t1) - (t3 - t2) 時(shí)間差 = t2 - t1 - 網(wǎng)絡(luò)延時(shí) / 2 = ((t2 - t1) (t3 - t4)) / 2 這個(gè)計(jì)算過(guò)程假設(shè)網(wǎng)絡(luò)來(lái)回路徑是對(duì)稱的,并且時(shí)延相同。 這樣一來(lái),客戶端就可以「校準(zhǔn)」自己的本機(jī)時(shí)間了,與服務(wù)端保持同步,這個(gè)時(shí)間誤差在廣域網(wǎng)下是 10ms - 500ms,在局域網(wǎng)下通常可以小于 1ms。再來(lái)看第二個(gè)問(wèn)題:
同步時(shí)間時(shí),對(duì)正在運(yùn)行的程序有沒(méi)有影響? 例如,我們很多時(shí)候?qū)懙某绦虼a是這樣的:
t1?=?time.now() //?時(shí)間發(fā)生校準(zhǔn) t2?=?time.now() // t2比t1小怎么辦? elapsed?=?t2?-?t1
t2 的時(shí)間真的會(huì)比 t1 小嗎?這里就牽涉出 2 個(gè)概念:墻上時(shí)鐘、單調(diào)時(shí)鐘,它們之間有什么區(qū)別呢?
墻上時(shí)鐘 :通常就是指前面講到的世界協(xié)調(diào)時(shí) UTC,校準(zhǔn)時(shí)間后,可能發(fā)生回?fù)?/li>單調(diào)時(shí)鐘 :計(jì)算機(jī)自啟動(dòng)以后經(jīng)歷的納秒數(shù),不會(huì)回?fù)?/li>一般我們寫的代碼,像上面程序調(diào)用的「時(shí)間 API」,通常獲取的時(shí)間是
墻上時(shí)鐘 ,所以,如果時(shí)間發(fā)生校準(zhǔn),就可能會(huì)發(fā)生「時(shí)光倒流」的情況。這必然對(duì)程序產(chǎn)生很大的影響,怎么解決這個(gè)問(wèn)題呢?幸運(yùn)的是,NTP 在校準(zhǔn)時(shí)間時(shí),提供了 2 種方式:
ntpdate :一切以服務(wù)端時(shí)間為準(zhǔn),「強(qiáng)制修改」本機(jī)時(shí)間ntpd :采用「潤(rùn)物細(xì)無(wú)聲」的方式修改本機(jī)時(shí)間,把時(shí)間差均攤到每次小的調(diào)整上也就是說(shuō),ntpd 當(dāng)接收到需要「回?fù)堋沟臅r(shí)間時(shí),會(huì)讓本機(jī)時(shí)間走得「慢」一點(diǎn),小步調(diào)整,逐漸與服務(wù)端的時(shí)鐘「對(duì)齊」,這樣一來(lái),本機(jī)時(shí)間依舊是遞增的,避免發(fā)生「倒流」。當(dāng)我們?cè)谂渲?ntp 服務(wù)時(shí),需要格外注意這種情況。另外,在編寫程序時(shí),也要注意調(diào)用的時(shí)間 API 獲取的是哪個(gè)時(shí)間,避免業(yè)務(wù)邏輯發(fā)生異常。至此,我們從看似簡(jiǎn)單的時(shí)間問(wèn)題,一步步深挖到時(shí)間的定義,再到時(shí)間是如何同步到計(jì)算機(jī)和終端設(shè)備的,怎么樣,有沒(méi)有解答了你心中的很多疑惑?
總結(jié) 好了,總結(jié)一下。這篇文章我們講了非常多的概念,這里我們?cè)僦匦率崂硪槐椤?/p>1、人類的早期生活,依靠觀測(cè)「天文現(xiàn)象」來(lái)測(cè)量時(shí)間,基于地球自轉(zhuǎn)規(guī)律,定義了一套時(shí)間標(biāo)準(zhǔn):「世界時(shí)」。2、后來(lái)人們發(fā)現(xiàn),由于地球公轉(zhuǎn)軌道是一個(gè)橢圓,并且地球自轉(zhuǎn)還受到地球內(nèi)部的影響,自轉(zhuǎn)速度越來(lái)越慢,人們發(fā)現(xiàn)世界時(shí)測(cè)算出的時(shí)間「不準(zhǔn)」。3、科學(xué)家們開始從「微觀世界」尋找更穩(wěn)定的周期運(yùn)動(dòng),最終確定以「銫原子」的振動(dòng)頻率為基準(zhǔn),制造出了「原子鐘」,確立了「世界原子時(shí)」,并重新定義了「秒」長(zhǎng)度,時(shí)長(zhǎng)高度精確。4、但由于人類社會(huì)活動(dòng)已高度依賴「世界時(shí)」,所以科學(xué)家們基于「原子時(shí)」和「世界時(shí)」,最終確立出新的時(shí)間標(biāo)準(zhǔn):「世界協(xié)調(diào)時(shí)」,把它定義成了全球的時(shí)間標(biāo)準(zhǔn),至此,世界標(biāo)準(zhǔn)時(shí)間誕生。5、中國(guó)基于「世界協(xié)調(diào)時(shí)」再加上 8 小時(shí)時(shí)區(qū)之差,確立了「北京時(shí)間」,并廣播給整個(gè)中國(guó)大地使用。6、「國(guó)家授時(shí)中心」把北京時(shí)間廣播給全國(guó)的「時(shí)間服務(wù)器」,我們生活中使用的時(shí)間,例如計(jì)算機(jī),就是通過(guò)時(shí)間服務(wù)器自動(dòng)同步校準(zhǔn)的。7、計(jì)算機(jī)通過(guò) NTP 完成和時(shí)間服務(wù)器的「自動(dòng)校準(zhǔn)」,我們的應(yīng)用程序基于此,才得以獲取到準(zhǔn)確的時(shí)間。8、NTP 服務(wù)應(yīng)該采用潤(rùn)物細(xì)無(wú)聲的方式同步時(shí)間,避免時(shí)間發(fā)生「倒流」。
后記 這篇文章是我有史以來(lái),最難寫的一篇,因?yàn)槠渲杏写罅靠破疹愔R(shí),涉及范圍之廣遠(yuǎn)超我的想象。在寫這篇文章時(shí),我至少閱讀了 30 篇以上的資料,很多時(shí)候會(huì)因?yàn)橐粋€(gè)很小的細(xì)節(jié),又深挖出更多相關(guān)的領(lǐng)域的知識(shí),讓我目不暇接。例如,銫原子的振動(dòng)頻率是怎么測(cè)量的?為什么能測(cè)量得這么精確?各個(gè)國(guó)家的原子鐘為什么會(huì)有差異?
計(jì)算機(jī) 是如何處理閏秒的?時(shí)區(qū)是怎么來(lái)的?本初子午線是什么?...很多細(xì)節(jié)我其實(shí)并沒(méi)有展開來(lái)講,我已盡力避開講那些晦澀難懂的物理知識(shí),只保留了重要的理論概念,希望你理解了這其中的原理。如果有些細(xì)節(jié)你沒(méi)有讀懂,可以先嘗試多讀幾遍,也可以與我進(jìn)一步交流。同時(shí),在查閱資料過(guò)程中,真切地感嘆人類研究成果之偉大,能把時(shí)間的誤差,縮小到幾億年的精度,敬佩之情無(wú)以言表。我們?cè)趯懘a時(shí),看似調(diào)用了一個(gè)簡(jiǎn)單的時(shí)間 API,可曾想過(guò),背后卻是人類多少年來(lái)的智慧結(jié)晶。希望這篇文章能解答你對(duì)時(shí)間的種種疑惑。
如果我的文章對(duì)你有所幫助,還請(qǐng)幫忙點(diǎn)贊、在看、轉(zhuǎn)發(fā) 一下,你的支持會(huì)激勵(lì)我輸出更高質(zhì)量的文章,非常感謝!