日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 嵌入式 > 嵌入式分享
[導(dǎo)讀]如果Linux也是一個普通人的話,那么她的手腕上應(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也是一個普通人的話,那么她的手腕上應(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分類的基礎(chǔ)

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

1、如何度量時間

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

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

2、Epoch

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

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

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

3、時間調(diào)整

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

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

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

4、閏秒(leap second)

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

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

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

5、計時范圍

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

6、時間精度

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

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

7、睡覺的時候時間會停止運(yùn)作嗎?

在現(xiàn)實(shí)世界提出這個問題會稍顯可笑,魯迅同學(xué)有一句名言:時間永是流逝,街市依舊太平。但是對于Linux系統(tǒng)中的clock,這個就有現(xiàn)實(shí)的意義了。比如說clock的一個重要的派生功能是創(chuàng)建timer(也就是說timer總是基于一個特定的clock運(yùn)作)。在一個5秒的timer超期之前,系統(tǒng)先進(jìn)入了suspend或者關(guān)機(jī)狀態(tài),這時候,5秒時間到達(dá)的時候,一般的timer都不會觸發(fā),因為底層的clock可能是基于一個free running counter的,在suspend或者關(guān)機(jī)狀態(tài)的時候,這個HW counter都不再運(yùn)作了,你如何期盼它能喚醒系統(tǒng),來執(zhí)行timer expired handler?但是用戶還是有這方面的實(shí)際需求的,最簡單的就是關(guān)機(jī)鬧鈴。怎么辦?這就需要一個特別的clock,能夠在suspend或者關(guān)機(jī)的時候,仍然可以運(yùn)作,推動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這兩個clock是專門用來計算進(jìn)程或者線程的執(zhí)行時間的(用于性能剖析),一旦進(jìn)程(線程)被切換出去,那么該進(jìn)程(線程)的clock就會停下來。因此,這兩種的clock都是per-process或者per-thread的,而其他的clock都是系統(tǒng)級別的。


  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)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動力設(shè)備,其驅(qū)動電源的性能直接關(guān)系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護(hù)是驅(qū)動電源設(shè)計中至關(guān)重要的兩個環(huán)節(jié),集成化方案的設(shè)計成為提升電機(jī)驅(qū)動性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗。要解決這一問題,需從設(shè)計、生...

關(guān)鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術(shù)之一是電機(jī)驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動汽車的動力性能和...

關(guān)鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設(shè)計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關(guān)鍵字: LED 驅(qū)動電源 開關(guān)電源

LED驅(qū)動電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動電源
關(guān)閉