當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式分享
[導(dǎo)讀]如果Linux也是一個(gè)普通人的話,那么她的手腕上應(yīng)該有十幾塊手表,包括:CLOCK_REALTIME、CLOCK_MONOTONIC、CLOCK_PROCESS_CPUTIME_ID、CLOCK_THREAD_CPUTIME_ID、CLOCK_MONOTONIC_RAW、CLOCK_REALTIME_COARSE、CLOCK_MONOTONIC_COARSE、CLOCK_BOOTTIME、CLOCK_REALTIME_ALARM、CLOCK_BOOTTIME_ALARM、CLOCK_TAI。本文主要就是介紹Linux內(nèi)核中的形形色色的“鐘表”。

如果Linux也是一個(gè)普通人的話,那么她的手腕上應(yīng)該有十幾塊手表,包括:CLOCK_REALTIME、CLOCK_MONOTONIC、CLOCK_PROCESS_CPUTIME_ID、CLOCK_THREAD_CPUTIME_ID、CLOCK_MONOTONIC_RAW、CLOCK_REALTIME_COARSE、CLOCK_MONOTONIC_COARSE、CLOCK_BOOTTIME、CLOCK_REALTIME_ALARM、CLOCK_BOOTTIME_ALARM、CLOCK_TAI。本文主要就是介紹Linux內(nèi)核中的形形色色的“鐘表”。

二、理解Linux中各種clock分類(lèi)的基礎(chǔ)

既然本文講Linux中的計(jì)時(shí)工具,那么我們首先面對(duì)的就是“什么是時(shí)間?”,這個(gè)問(wèn)題實(shí)在是太難回答了,因此我們這里就不正面回答了,我們只是從幾個(gè)側(cè)面來(lái)窺探時(shí)間的特性,而時(shí)間的本質(zhì)就留給物理學(xué)家和哲學(xué)家思考吧。

1、如何度量時(shí)間

時(shí)間往往是和變化相關(guān),因此人們往往喜歡使用有固定周期變化規(guī)律的運(yùn)動(dòng)行為來(lái)定義時(shí)間,于是人們把地球圍自轉(zhuǎn)一周的時(shí)間分成24份,每一份定義為一個(gè)小時(shí),而一個(gè)小時(shí)被平均分成3600份,每一份就是1秒。然而,地球的運(yùn)動(dòng)周期不是那么穩(wěn)定,怎么辦?多測(cè)量幾個(gè),平均一下嘛。

雖然通過(guò)天體的運(yùn)動(dòng)定義了秒這樣的基本的時(shí)間度量單位,但是,要想精確的表示時(shí)間,我們依賴(lài)一種有穩(wěn)定的周期變化的現(xiàn)象。上一節(jié)我們說(shuō)過(guò)了:地球圍繞太陽(yáng)運(yùn)轉(zhuǎn)不是一個(gè)穩(wěn)定的周期現(xiàn)象,因此每次觀察到的周期不是固定的(當(dāng)然都大約是24小時(shí)的樣子),用它來(lái)定義秒多少顯得不是那么精準(zhǔn)??茖W(xué)家們發(fā)現(xiàn)銫133原子在能量躍遷時(shí)候輻射的電磁波的振蕩頻率非常的穩(wěn)定(不要問(wèn)我這是什么原理,我也不知道),因此被用來(lái)定義時(shí)間的基本單位:秒(或者稱(chēng)之為原子秒)。

2、Epoch

定義了時(shí)間單位,等于時(shí)間軸上有了刻度,雖然這條代表時(shí)間的直線我們不知道從何開(kāi)始,最終去向何方,我們終歸是可以把一個(gè)時(shí)間點(diǎn)映射到這條直線上了。甚至如果定義了原點(diǎn),那么我們可以用一個(gè)數(shù)字(到原點(diǎn)的距離)來(lái)表示時(shí)間。

如果說(shuō)定義時(shí)間的度量單位是技術(shù)活,那么定義時(shí)間軸的原點(diǎn)則完全是一個(gè)習(xí)慣問(wèn)題。拿出你的手表,上面可以讀出2017年5月10,23時(shí)17分28秒07毫秒……作為一個(gè)地球人,你選擇了耶穌誕辰日做原點(diǎn),講真,這弱爆了。作為linuxer,你應(yīng)該擁有這樣的一塊手表,從這個(gè)手表上只能看到一個(gè)從當(dāng)前時(shí)間點(diǎn)到linux epoch的秒數(shù)和毫秒數(shù)。Linux epoch定義為1970-01-01 00:00:00 +0000 (UTC),后面的這個(gè)UTC非常非常重要,我們后面會(huì)描述。

除了wall time,linux系統(tǒng)中也需要了解系統(tǒng)自啟動(dòng)以來(lái)過(guò)去了多少的時(shí)間,這時(shí)候,我們可以把鐘表的epoch調(diào)整成系統(tǒng)的啟動(dòng)時(shí)間點(diǎn),這時(shí)候獲取系統(tǒng)啟動(dòng)時(shí)間就很容易了,直接看這塊鐘表的讀數(shù)即可。

3、時(shí)間調(diào)整

記得小的時(shí)候,每隔一段時(shí)間,老爸的手表總會(huì)慢上一分鐘左右的時(shí)間,也是他總是在7點(diǎn)鐘,新聞聯(lián)播之前等待那校時(shí)的最后一響。一聽(tīng)到“剛才最后一響是北京時(shí)間7點(diǎn)整”中那最后“滴”的一聲,老爸也把自己的手表調(diào)整成為7點(diǎn)整。對(duì)于linux系統(tǒng),這個(gè)操作類(lèi)似clock_set接口函數(shù)。

類(lèi)似老爸機(jī)械表的時(shí)間調(diào)整,linux的時(shí)間也需要調(diào)整,機(jī)械表的發(fā)條和齒輪結(jié)構(gòu)沒(méi)有那么精準(zhǔn),計(jì)算機(jī)的晶振亦然。前面講了,UTC的計(jì)時(shí)是基于原子鐘的,但是來(lái)到Linux內(nèi)核這個(gè)場(chǎng)景,我們難道要為我們的計(jì)算機(jī)安裝一個(gè)原子鐘來(lái)計(jì)時(shí)嗎?當(dāng)然可以,如果你足夠有錢(qián)的話。我們一般人的計(jì)算機(jī)還是基于系統(tǒng)中的本地振蕩器來(lái)計(jì)時(shí)的,雖然精度不理想,但是短時(shí)間內(nèi)你也不會(huì)有太多的感覺(jué)。當(dāng)然,人們往往是向往更精確的計(jì)時(shí)(有些場(chǎng)合也需要),因此就有了時(shí)間同步的概念(例如NTP(Network Time Protocol))。

所謂時(shí)間同步其實(shí)就是用一個(gè)精準(zhǔn)的時(shí)間來(lái)調(diào)整本地的時(shí)間,具體的調(diào)整方式有兩種,一種就是直接設(shè)定當(dāng)前時(shí)間值,另外一種是采用了潤(rùn)物細(xì)無(wú)聲的形式,對(duì)本地振蕩器的輸出進(jìn)行矯正。第一種方法會(huì)導(dǎo)致時(shí)間軸上的時(shí)間會(huì)向前或者向后的跳躍,無(wú)法保證時(shí)間的連續(xù)性和單調(diào)性。第二種方法是對(duì)時(shí)間軸緩慢的調(diào)整(而不是直接設(shè)定),從而保證了連續(xù)性和單調(diào)性。

4、閏秒(leap second)

通過(guò)原子秒延展出來(lái)的時(shí)間軸就是TAI(International Atomic Time)clock。這塊“表”不管日出、日落,機(jī)械的按照ce原子定義的那個(gè)秒在推進(jìn)時(shí)間。冷冰冰的TAI clock雖然精準(zhǔn),但是對(duì)人類(lèi)而言是不友好的,畢竟人還是生活在這顆藍(lán)色星球上。而那些基于地球自轉(zhuǎn),公轉(zhuǎn)周期的時(shí)間(例如GMT)雖然符合人類(lèi)習(xí)慣,但是又不夠精確。在這樣的背景下,UTC(Coordinated Universal Time)被提出來(lái)了,它是TAI clock的基因(使用原子秒),但是又會(huì)適當(dāng)?shù)恼{(diào)整(leap second),滿(mǎn)足人類(lèi)生產(chǎn)和生活的需要。

OK,至此,我們了解了TAI和UTC兩塊表的情況,這兩塊表的發(fā)條是一樣的,按照同樣的時(shí)間滴答(tick,精準(zhǔn)的根據(jù)原子頻率定義的那個(gè)秒)來(lái)推動(dòng)鐘表的秒針的轉(zhuǎn)動(dòng),唯一不同的是,UTC clock有一個(gè)調(diào)節(jié)器,在適當(dāng)?shù)臅r(shí)間,可以把秒針向前或者向后調(diào)整一秒。

TAI clock和UTC clock在1972年進(jìn)行了對(duì)準(zhǔn)(相差10秒),此后就各自獨(dú)立運(yùn)行了。在大部分的時(shí)間里,UTC clock跟隨TAI clock,除了在適當(dāng)?shù)臅r(shí)間點(diǎn),realtime clock會(huì)進(jìn)行l(wèi)eap second的補(bǔ)償。從1972年到2017年,已經(jīng)有了27次leap second,因此TAI clock的讀數(shù)已經(jīng)比realtime clock(UTC時(shí)間)快了37秒。換句話說(shuō),TAI和UTC兩塊表其實(shí)可以抽象成一個(gè)時(shí)間軸,只不過(guò)它們之間有一個(gè)固定的偏移。在1972年,它們之間的offset是10秒,經(jīng)過(guò)多年的運(yùn)轉(zhuǎn),到了2017年,offset累計(jì)到37秒,讓我靜靜等待下一個(gè)leap second到了的時(shí)刻吧。

5、計(jì)時(shí)范圍

有一類(lèi)特殊的clock稱(chēng)作秒表,啟動(dòng)后開(kāi)始計(jì)時(shí),中間可以暫停,可以恢復(fù)。我們可以通過(guò)這樣的秒表來(lái)記錄一個(gè)人睡眠的時(shí)間,當(dāng)進(jìn)入睡眠狀態(tài)的時(shí)候,按下start按鍵開(kāi)始計(jì)時(shí),一旦醒來(lái)則按下stop,暫停計(jì)時(shí)。linux中也有這樣的計(jì)時(shí)工具,用來(lái)計(jì)算一個(gè)進(jìn)程或者線程的執(zhí)行時(shí)間。

6、時(shí)間精度

時(shí)間是連續(xù)的嗎?你眼中的世界是連續(xù)的嗎?看到窗外清風(fēng)吹拂的樹(shù)葉的時(shí)候,你感覺(jué)每一個(gè)樹(shù)葉的形態(tài)都被你捕捉到了。然而,未必,你看急速前進(jìn)的汽車(chē)的輪胎的時(shí)候,感覺(jué)車(chē)輪是倒轉(zhuǎn)的。為什么?其實(shí)這僅僅是因?yàn)槲覀兊难劬Υ蠹s是每秒15~20幀的速度在采樣這個(gè)世界,你看到的世界是離散的。算了,扯遠(yuǎn)了,我們姑且認(rèn)為時(shí)間的連續(xù)的,但是Linux中的時(shí)間記錄卻不是連續(xù)的,我們可以用下面的圖片表示:

系統(tǒng)在每個(gè)tick到來(lái)的時(shí)候都會(huì)更新系統(tǒng)時(shí)間(到linux epoch的秒以及納秒值記錄),當(dāng)然,也有其他場(chǎng)景進(jìn)行系統(tǒng)時(shí)間的更新,這里就不贅述了。因此,對(duì)于linux的時(shí)間而言,它是一些離散值,是一些時(shí)間采樣點(diǎn)的值而已。當(dāng)用戶(hù)請(qǐng)求時(shí)間服務(wù)的時(shí)候,例如獲取當(dāng)前時(shí)間(上圖中的紅線),那么最近的那個(gè)Tick對(duì)應(yīng)的時(shí)間采樣點(diǎn)值再加上一個(gè)當(dāng)前時(shí)間點(diǎn)到上一個(gè)tick的delta值就精準(zhǔn)的定位了當(dāng)前時(shí)間。不過(guò),有些場(chǎng)合下,時(shí)間精度沒(méi)有那么重要,直接獲取上一個(gè)tick的時(shí)間值也基本是OK的,不需要校準(zhǔn)那個(gè)delta也能滿(mǎn)足需求。而且粗粒度的clock會(huì)帶來(lái)performance的優(yōu)勢(shì)。

7、睡覺(jué)的時(shí)候時(shí)間會(huì)停止運(yùn)作嗎?

在現(xiàn)實(shí)世界提出這個(gè)問(wèn)題會(huì)稍顯可笑,魯迅同學(xué)有一句名言:時(shí)間永是流逝,街市依舊太平。但是對(duì)于Linux系統(tǒng)中的clock,這個(gè)就有現(xiàn)實(shí)的意義了。比如說(shuō)clock的一個(gè)重要的派生功能是創(chuàng)建timer(也就是說(shuō)timer總是基于一個(gè)特定的clock運(yùn)作)。在一個(gè)5秒的timer超期之前,系統(tǒng)先進(jìn)入了suspend或者關(guān)機(jī)狀態(tài),這時(shí)候,5秒時(shí)間到達(dá)的時(shí)候,一般的timer都不會(huì)觸發(fā),因?yàn)榈讓拥腸lock可能是基于一個(gè)free running counter的,在suspend或者關(guān)機(jī)狀態(tài)的時(shí)候,這個(gè)HW counter都不再運(yùn)作了,你如何期盼它能喚醒系統(tǒng),來(lái)執(zhí)行timer expired handler?但是用戶(hù)還是有這方面的實(shí)際需求的,最簡(jiǎn)單的就是關(guān)機(jī)鬧鈴。怎么辦?這就需要一個(gè)特別的clock,能夠在suspend或者關(guān)機(jī)的時(shí)候,仍然可以運(yùn)作,推動(dòng)timer到期觸發(fā)。

三、Linux下的各種clock總結(jié)

在linux系統(tǒng)中定義了如下的clock id:

#define CLOCK_REALTIME 0

#define CLOCK_MONOTONIC 1

#define CLOCK_PROCESS_CPUTIME_ID 2

#define CLOCK_THREAD_CPUTIME_ID 3

#define CLOCK_MONOTONIC_RAW 4

#define CLOCK_REALTIME_COARSE 5

#define CLOCK_MONOTONIC_COARSE 6

#define CLOCK_BOOTTIME 7

#define CLOCK_REALTIME_ALARM 8

#define CLOCK_BOOTTIME_ALARM 9

#define CLOCK_SGI_CYCLE 10 /* Hardware specific */

#define CLOCK_TAI 11

CLOCK_PROCESS_CPUTIME_ID和CLOCK_THREAD_CPUTIME_ID這兩個(gè)clock是專(zhuān)門(mén)用來(lái)計(jì)算進(jìn)程或者線程的執(zhí)行時(shí)間的(用于性能剖析),一旦進(jìn)程(線程)被切換出去,那么該進(jìn)程(線程)的clock就會(huì)停下來(lái)。因此,這兩種的clock都是per-process或者per-thread的,而其他的clock都是系統(tǒng)級(jí)別的。


  leap second? clock set? clock tunning? original point resolution active in suspend?
realtime yes yes yes Linux epoch ns no
monotonic yes no yes Linux epoch ns no
monotonic raw yes no no Linux epoch ns no
realtime coarse yes yes yes Linux epoch tick no
monotonic coarse yes no yes Linux epoch tick no
boot time yes no yes machine start ns no
realtime alarm yes yes yes Linux epoch ns yes
boottime alarm yes no yes machine start ns yes
tai no no no Linux epoch ns no
本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車(chē)的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車(chē)技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車(chē)工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車(chē)。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車(chē) 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶(hù)希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱(chēng),數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱(chēng)"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉