跟濤哥一起學嵌入式 28:Linux下的時間管理和定時器編程

時間是我們生活中非常重要的一個概念,我們的生活處處離不開時間:你跟朋友定在晚上7點去吃火鍋;你老闆讓你半個小時後去他辦公室;還有一週就要放假過年了...。在現代社會中,沒有時間的度量,我們的生活將寸步難行。除非你去終南山隱居,去過日出而作,日落而息的生活。

計算機中處處需要時間

在計算機系統中,也是處處需要時間,離開時間寸步難行:你的電影播放時間、系統日誌log、QQ 微信聊天記錄、電腦每週一次的殺毒、清理垃圾、軟件更新,都需要時間。包括操作系統的任務調度,給每個進程分配運行時長,也需要時間。

生活中的時間可分爲絕對時間和相對時間:公元2020年1月24日,你的電腦開機時間,這些可以算是絕對時間;萬曆15年、昨天今天和明天,則是相對時間。其實,相對時間和絕對時間並沒有一個清晰的劃分概念,一切時間可能都要以某一個時刻爲起點,都是相對時間。絕對時間也是一種特殊的相對時間,因爲大家都使用默認的參考起點,所以一般就看做絕對時間了。

你沐浴在溫暖在陽光裏,我在漆黑的夜裏沉睡。由於地球自轉的原因,世界各地的日落日出時間不一樣,因此也引出了時區的概念:全球劃分爲24個時區,以倫敦的本初子午線爲準,往東叫東X區,往西叫西X區。如倫敦時間凌晨0點,因爲我們在東八區,太陽比倫敦早8個小時升起,所以我們的時間就是早上八點。

 

v2-c71fc94944961937829c48f1753624c7_b.jpg

倫敦的時間,也就是子午線0時區的時間,一般稱爲格林威治時間(GMT,Greenwich Mean Time),又稱作世界協調時間( UTC,Coordinated Universal Time)。計算機中一般保存的就是這種世界標準時間,以1970年1月1日零時零分0秒爲起點,記錄到現在的秒數。但是世界各地的電腦顯示的一般是本地時間,會將世界標準時間結合你本地電腦設置的時區,轉換爲本地時間並顯示在電腦桌面的右下角。

 

時間的計量

戴過手錶的同學可能都有過這種經歷:每過一段時間就會發現自己的手錶時間不準了,需要校準。爲什麼不準了呢?很簡單,計時出現了誤差。到哪裏校準呢?很簡單,每天晚上7點的新聞聯播,很多人開始掏出自己的手錶開始調時。爲什麼要以新聞聯播爲準呢?還得從計時器的發展歷程說起。

古時候科技不發達,古人只能觀天計時:日出日落、月圓月缺、春夏交替、四季輪迴,發明了陽曆和陰曆。這種計時的精度只能以天來計算。後來古人發明了各種計時設備:日晷、沙漏、刻漏等,將計時精度推進了小時級別。但是這種計時器誤差很大,四季太陽高度的變化、冬天夏天刻漏的滴水口的熱脹冷縮,都會影響計時的精度。

 

v2-3b6bb96f1553d0b5a3a29b08600e0a49_b.jpg

後來歐洲人發明了機械鐘,使用發條或單擺作爲動力,把計時的精度推進到了秒級。比較有代表性的就是瑞士手錶,可以說是機械鐘的巔峯之作,風靡了幾個世紀。

 

v2-e016642732155b75edf3e17869ee6084_b.jpg

電的出現和電子技術的發展,將計時器又推向了一個高度:採用晶振計時。給適應振盪器兩邊加電壓,晶振就會發出規律的正弦波,再經過整形就可生成周期頻率的方波,方波再講過分頻或倍頻,就可以引入到CPU或SOC的內部,作爲計時的時鐘之源。

 

v2-711d8c1de5085dcea95c9b6d404be1b3_b.jpg

採用晶振計時的電子設備,一般精度可以達到微秒級別,多少年的計時誤差可能只差1秒。現在的計算機或電子設備一般都採用這種晶振計時,給晶振兩端加電壓就可以讓他永遠振盪下去,唯一的缺陷就是當電腦或手機關機時就無法計時了。因此現在的計算機一般都有兩個計時器,其中一個單獨供電,比如我們電腦上的主板上就有一個CMOS電池給實時時鐘供電,當電腦關機時,實時時鐘仍可以繼續計時。等你下次開機,你會發現時間一直很準確,這裏面就有主板上的CMOS實時時鐘的功勞。

隨着時間流逝,不同計算機的計時也會出現或快或慢的誤差。尤其是互聯網時代,不同計算機之間進行通信,更需要時間同步。那該如何是好?不用擔心,一種更精密的計時器出來了:銫原子鐘。它是根據銫原子的原子躍遷產生振動磁場的振盪週期來作爲原子時間的標準,誤差是千萬分之一秒。世界上第一個原子鐘由美國國家物理實驗室建造,作爲世界標準標準時間之源。後來世界各地的實驗室紛紛建立自己的實驗室,作爲本國的授時中心。如我國位於西安的中科院國家授時中心,新聞聯播的實時報時就是以此爲時間之源的。

 

v2-de70ad146231f8ddc74327f96734ea26_b.jpg

除了銫原子鐘外,還有氫原子鐘、銣原子鐘等計時設備。在一些對時間要求比較高的航空航天、軍事科研領域,一般會購買這種精密的計時設備,作爲時間之源。

 

v2-17cece6c963d14f010d4ba815b4cf3f7_b.jpg

Linux中的時間管理

想對時間進行管理,光有硬件還不行,還需要軟件的配合。在Linux系統中,內核中會對這些定時器進行設置,一般每隔 10ms 來一個時鐘中斷,即時鐘節拍。每一次時鐘到期產生中斷後,內核中有一個叫jiffies的全局變量,用來記錄系統啓動以來發生中斷的次數,因爲時鐘發生中斷是週期性的,因此可以用來計時。

 

v2-5d2fe4ba5057aad9a878b325b483a275_b.jpg

爲了計時準確,內核中使用另外一個全局變量 xtime 來記錄實時時間:當系統啓動後,內核會從CMOS上的實時時鐘讀取實時時間,保存到 xtime 變量中,隨後隨着時鐘中斷,不斷更新 xtime 和 jiffies這兩個值。關機時,內核再把實時時間 xtime 保存到CMOS主板上的實時時鐘內,這樣斷電後,計算機仍可以使用獨立電源實時計時。

 

時間管理和定時器編程

用戶通過Linux操作系統提供的系統調用 或 C標準庫函數的 API,可以方便的獲取系統時間、設置系統時間,以及使用計算機的定時器進行編程,週期性地去做一些事情:比如定期殺毒、垃圾清理、軟件升級等。

《Linux系統編程》第08期:時間管理和定時器編程,視頻教程已經發布,將會給大家介紹Linux系統下關於時間的獲取、設置、定時器編程的各種 API 接口的使用。CSDN學院搜課程名稱或講師名字“王利濤”即可。

 

發佈了92 篇原創文章 · 獲贊 38 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章