1. 程式人生 > >3.3 Linux獲取系統資訊(1、2節)

3.3 Linux獲取系統資訊(1、2節)

3.3.1.關於時間的概念

3.3.1.1、GMT時間

(1)GMT是格林尼治時間,也就是格林尼治地區的當地之間。
(2)GMT時間的意義?用格林尼治的當地時間作為全球國際時間,用以描述全球性的事件的時間,方便大家記憶。
(3)一般為了方便,一個國家都統一使用一個當地時間。

3.3.1.2、UTC時間

(1)GMT時間是以前使用的,近些年來越來越多的使用UTC時間。
(2)關於北京時間,可以參考:http://www.cnblogs.com/qiuyi21/archive/2008/03/04/1089456.html

3.3.1.3、計算機中與時間有關的部件

(1)點時間和段時間。段時間=點時間-點時間

(2)定時器和實時時鐘。定時器(timer)定的時間就是段時間,實時時鐘(RTC)就是和點時間有關的一個器件。


3.3.2.linux系統中的時間

3.3.2.1、jiffies的引入

(1)jiffies是linux核心中的一個全域性變數,這個變數用來記錄以核心的節拍時間為單位時間長度的一個數值。
(2)核心配置的時候定義了一個節拍時間,實際上linux核心的排程系統工作時就是以這個節拍時間為時間片的。
(3)jiffies變數開機時有一個基準值,然後核心每過一個節拍時間jiffies就會加1,然後到了系統的任意一個時間我們當前時間就被jiffies這個變數所標註。

3.3.2.2、linux系統如何記錄時間

(1)核心在開機啟動的時候會讀取RTC硬體獲取一個時間作為初始基準時間,這個基準時間對應一個jiffies值(這個基準時間換算成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的2次開機之間進行時間的儲存。
(3)理解時一定要點時間和段時間結合起來理解。jiffies這個變數記錄的其實是段時間(其實就是當前時間和1970-01-01 00:00:00 +0000(UTC)這個時間的差值)
(4)一個時間節拍的時間取決於作業系統的配置,現代linux系統一般是10ms或者1ms。這個時間其實就是排程時間,在核心中用HZ來記錄和表示。如果HZ定義成1000難麼時鐘節拍就是1/HZ,也就是1ms。這些在學習驅動時會用到。

3.3.2.3、linux中時間相關的系統呼叫

(1)常用的時間相關的API和C庫函式有9個:time/ctime/localtime/gmtime/mktime/asctime/strftime/gettimeofday/settimeofday有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是用來設定當前的時間和時區的。
(6)總結:不管用哪個系統呼叫,最終得到的時間本質上都是一個時間(這個時間最終都是從kernel中記錄的jiffies中計算得來的),只不過不同的函式返回的時間的格式不同,精度不同。