Linux系統如何記錄時間


1、內核在開機啟動的時候會讀取RTC硬件獲取一個時間作為初始基准時間,這個基准時間對應一個jiiffies值(這個基准時間換算成jiffies值的方法是:用這個時間減去1970-01-01  00:00:00  +0000(UTC)),然后把這個時間換算成jiffies數值,這個jiffies值作為我們開機時的基准jiffies值存在。然后系統運行時每個時鍾節拍的末尾都會給jiffies這個全局變量加1,因此操作系統就使用jiffies這個全局變量記錄下來當前時間。當我們需要當前時間點時,就用jiffies這個時間點去計算(計算方法就是先把這個jiffies值對應的時間段計算出來,然后再加上1970-01-01   00:00:00  +0000(UTC)即可得到這個時間點)

2、其實操作系統只在開機的時候讀取一次RTC,整個系統運行過程中RTC是無作用的。RTC的真正作用其實是在操作系統OS的兩次開機之間進行時間的保存。

3、理解時一定要點時間和段時間結合起來理解。jiffies這個變量記錄的其實是段時間(其實就是當前時間和1970-01-01  00:00:00  +0000(UTC)這個時間的差值)。

4、一個時間節拍的時間取決於操作系統的配置,現代Linux系統一般是10ms或者是1ms。這個時間其實就是調度時間,在內核中用HZ來記錄和表示。如果HZ定義為1000,那么時鍾節拍就是1/HZ,也就是1ms。學習驅動會用到這些知識。

5、Linux中與時間相關的系統調用

(1)、常用的時間相關的API和C庫函數有9個:time、ctime、localtime、gmtime、mktime、asctime、strftime、gettimeofday、settimeofday

它們的關系如下圖:

 

(2)、time系統調用返回當前時間以秒為單位的距離1970-01-01  00:00:00  +0000(UTC)過去的秒數。這個time內部就是用jiffies換算得到的秒數。其他函數基本都是圍繞着time來工作的。

(3)、gmtime和localtime會把time得到的秒數變成一個struct tm結構體表示的時間。區別是gmtime得到的是國際時間,而localtime得到的是本地(指的是你運行localtime函數的程序所在的計算機所設置的時區對應的本地時間)時間。mktime用來完成相反方向的轉換(struct tm到time_t).

(4)、如果從struct tm出發想得到字符串格式的時間,可以用asctime或者strftime都可以。(如果從time_t出發想得到字符串格式的時間用ctime即可)。

(5)、gettimeofday返回的時間是由struct timeval和struct timezone這兩個結構體共同表示的,其中timeval表示時間,而timezone表示時區。settimeofday是用來設置當前的時間和時區的。

總結:不管是用哪一個系統調用,最終得到的時間本質上都是一個時間(這個時間最終都是從kernel中記錄的jiffies中計算得來的),只不過不同的函數返回的時間的格式不同,精度不同。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM