linux 系统时间是在哪里记录的,Linux系统如何记录时间
1、內(nèi)核在開(kāi)機(jī)啟動(dòng)的時(shí)候會(huì)讀取RTC硬件獲取一個(gè)時(shí)間作為初始基準(zhǔn)時(shí)間,這個(gè)基準(zhǔn)時(shí)間對(duì)應(yīng)一個(gè)jiiffies值(這個(gè)基準(zhǔn)時(shí)間換算成jiffies值的方法是:用這個(gè)時(shí)間減去1970-01-01? 00:00:00? +0000(UTC)),然后把這個(gè)時(shí)間換算成jiffies數(shù)值,這個(gè)jiffies值作為我們開(kāi)機(jī)時(shí)的基準(zhǔn)jiffies值存在。然后系統(tǒng)運(yùn)行時(shí)每個(gè)時(shí)鐘節(jié)拍的末尾都會(huì)給jiffies這個(gè)全局變量加1,因此操作系統(tǒng)就使用jiffies這個(gè)全局變量記錄下來(lái)當(dāng)前時(shí)間。當(dāng)我們需要當(dāng)前時(shí)間點(diǎn)時(shí),就用jiffies這個(gè)時(shí)間點(diǎn)去計(jì)算(計(jì)算方法就是先把這個(gè)jiffies值對(duì)應(yīng)的時(shí)間段計(jì)算出來(lái),然后再加上1970-01-01 ? 00:00:00? +0000(UTC)即可得到這個(gè)時(shí)間點(diǎn))
2、其實(shí)操作系統(tǒng)只在開(kāi)機(jī)的時(shí)候讀取一次RTC,整個(gè)系統(tǒng)運(yùn)行過(guò)程中RTC是無(wú)作用的。RTC的真正作用其實(shí)是在操作系統(tǒng)OS的兩次開(kāi)機(jī)之間進(jìn)行時(shí)間的保存。
3、理解時(shí)一定要點(diǎn)時(shí)間和段時(shí)間結(jié)合起來(lái)理解。jiffies這個(gè)變量記錄的其實(shí)是段時(shí)間(其實(shí)就是當(dāng)前時(shí)間和1970-01-01? 00:00:00? +0000(UTC)這個(gè)時(shí)間的差值)。
4、一個(gè)時(shí)間節(jié)拍的時(shí)間取決于操作系統(tǒng)的配置,現(xiàn)代Linux系統(tǒng)一般是10ms或者是1ms。這個(gè)時(shí)間其實(shí)就是調(diào)度時(shí)間,在內(nèi)核中用HZ來(lái)記錄和表示。如果HZ定義為1000,那么時(shí)鐘節(jié)拍就是1/HZ,也就是1ms。學(xué)習(xí)驅(qū)動(dòng)會(huì)用到這些知識(shí)。
5、Linux中與時(shí)間相關(guān)的系統(tǒng)調(diào)用
(1)、常用的時(shí)間相關(guān)的API和C庫(kù)函數(shù)有9個(gè):time、ctime、localtime、gmtime、mktime、asctime、strftime、gettimeofday、settimeofday
它們的關(guān)系如下圖:
(2)、time系統(tǒng)調(diào)用返回當(dāng)前時(shí)間以秒為單位的距離1970-01-01? 00:00:00? +0000(UTC)過(guò)去的秒數(shù)。這個(gè)time內(nèi)部就是用jiffies換算得到的秒數(shù)。其他函數(shù)基本都是圍繞著time來(lái)工作的。
(3)、gmtime和localtime會(huì)把time得到的秒數(shù)變成一個(gè)struct tm結(jié)構(gòu)體表示的時(shí)間。區(qū)別是gmtime得到的是國(guó)際時(shí)間,而localtime得到的是本地(指的是你運(yùn)行l(wèi)ocaltime函數(shù)的程序所在的計(jì)算機(jī)所設(shè)置的時(shí)區(qū)對(duì)應(yīng)的本地時(shí)間)時(shí)間。mktime用來(lái)完成相反方向的轉(zhuǎn)換(struct tm到time_t).
(4)、如果從struct tm出發(fā)想得到字符串格式的時(shí)間,可以用asctime或者strftime都可以。(如果從time_t出發(fā)想得到字符串格式的時(shí)間用ctime即可)。
(5)、gettimeofday返回的時(shí)間是由struct timeval和struct timezone這兩個(gè)結(jié)構(gòu)體共同表示的,其中timeval表示時(shí)間,而timezone表示時(shí)區(qū)。settimeofday是用來(lái)設(shè)置當(dāng)前的時(shí)間和時(shí)區(qū)的。
總結(jié):不管是用哪一個(gè)系統(tǒng)調(diào)用,最終得到的時(shí)間本質(zhì)上都是一個(gè)時(shí)間(這個(gè)時(shí)間最終都是從kernel中記錄的jiffies中計(jì)算得來(lái)的),只不過(guò)不同的函數(shù)返回的時(shí)間的格式不同,精度不同。
總結(jié)
以上是生活随笔為你收集整理的linux 系统时间是在哪里记录的,Linux系统如何记录时间的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux内核计算代码时间,完成一个简单
- 下一篇: linux用cat查看本机ip,linu