如果你看完這篇文章還不懂計(jì)算機(jī)時(shí)間,那就掐死我吧
時(shí)間總是在不經(jīng)意間流逝,我們?cè)趯?xiě)代碼時(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)自北京嗎?
這篇文章非常有意思,希望你可以耐心讀完。
時(shí)間為什么總是走“不準(zhǔn)”?
你肯定遇到過(guò)這樣的場(chǎng)景,家里買(mǎi)了一個(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)單的開(kāi)始說(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ī)律,人們開(kāi)始制造「鐘表」,把時(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)景開(kāi)始變得越來(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é)家們開(kāi)始思考,既然觀測(cè)天文現(xiàn)象無(wú)法解決這個(gè)問(wèn)題,那在微觀層面能否找到比較好的解決方案嗎?
這時(shí),他們開(kāi)始把目光投向了「微觀世界」。
一秒到底有多長(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è)思路開(kāi)始探索...
好,現(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é)家們開(kāi)始不斷地試驗(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 秒!可見(jiàn)其精準(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í)開(kāi)始計(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)且固定
因?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é)家們又開(kāi)始思考,終于想到一個(gè)互相兼容的解決方案。
既然兩套時(shí)間標(biāo)準(zhǔn)都很重要,那兩者都保留,不會(huì)互相取代。
我們可以再建立一套「新的時(shí)間標(biāo)準(zhǔn)」,這套時(shí)間以「原子時(shí)為基準(zhǔn)」,開(kāi)始計(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é)家把它定義為「閏秒」。
是不是挺有意思?聽(tīng)說(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è)陂_(kāi)發(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)上聽(tīng)到的,北京時(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ò)這么一番研究,到這里我們就可以解釋文章開(kāi)頭的問(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)看第二個(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ù)?/span>
- 單調(diào)時(shí)鐘:計(jì)算機(jī)自啟動(dòng)以后經(jīng)歷的納秒數(shù),不會(huì)回?fù)?/span>
這必然對(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)整上
當(dāng)我們?cè)谂渲?ntp 服務(wù)時(shí),需要格外注意這種情況。另外,在編寫(xiě)程序時(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è)僦匦率崂硪槐椤?br /> 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é)家們開(kāi)始從「微觀世界」尋找更穩(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ā)生「倒流」。