成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

linux系統里的時間

系統 Linux
一提到時間,大家就會提到身邊事物、概念等,如:手表、時鐘等等。在本文就給大家介紹下linux系統里的時間是如何構成和運行的。

通常,linux操作系統可以使用三種方法來表示系統的當前時間與日期:
①最簡單的一種方法就是直接用一個64位的計數器來對時鐘滴答進行計數。
②第二種方法就是用一個32位計數器來對秒進行計數,同時還用一個32位的輔助計數器對時鐘滴答計數,之子累積到一秒為止。因為232超過136年,因此這種方法直至22世紀都可以讓系統工作得很好。
③第三種方法也是按時鐘滴答進行計數,但是是相對于系統啟動以來的滴答次數,而不是相對于相對于某個確定的外部時刻;當讀外部后備時鐘(如RTC)或用戶輸入實際時間時,根據當前的滴答次數計算系統當前時間。
UNIX類操作系統通常都采用第三種方法來維護系統的時間與日期。

1 基本概念
首先,有必要明確一些Linux內核時鐘驅動中的基本概念。
(1)時鐘周期(clock cycle)的頻率:8253/8254 PIT的本質就是對由晶體振蕩器產生的時鐘周期進行計數,晶體振蕩器在1秒時間內產生的時鐘脈沖個數就是時鐘周期的頻率。
Linux用宏CLOCK_TICK_RATE來表示8254 PIT的輸入時鐘脈沖的頻率(在PC機中這個值通常是1193180HZ),該宏定義在include/asm-i386/timex.h頭文件中: 

  1. #define CLOCK_TICK_RATE 1193180 /* Underlying HZ */ 


(2)時鐘滴答(clock tick):我們知道,當PIT通道0的計數器減到0值時,它就在IRQ0上產生一次時鐘中斷,也即一次時鐘滴答。PIT通道0的計數器的初始值決定了要過多少時鐘周期才產生一次時鐘中斷,因此也就決定了一次時鐘滴答的時間間隔長度。
(3)時鐘滴答的頻率(HZ):也即1秒時間內PIT所產生的時鐘滴答次數。類似地,這個值也是由PIT通道0的計數器初值決定的(反過來說, 確定了時鐘滴答的頻率值后也就可以確定8254 PIT通道0的計數器初值)。Linux內核用宏HZ來表示時鐘滴答的頻率,而且在不同的平臺上HZ有不同的定義值。對于ALPHA和IA62平臺HZ的 值是1024,對于SPARC、MIPS、ARM和i386等平臺HZ的值都是100。該宏在i386平臺上的定義如下(include/asm- i386/param.h):

  1. #ifndef HZ   
  2. #define HZ 100   
  3. #endif   

根據HZ的值,我們也可以知道一次時鐘滴答的具體時間間隔應該是(1000ms/HZ)=10ms。
(4)時鐘滴答的時間間隔:Linux用全局變量tick來表示時鐘滴答的時間間隔長度,該變量定義在kernel/timer.c文件中,如下:
long tick = (1000000 + HZ/2) / HZ; /* timer interrupt period */
tick變量的單位是微妙(μs),由于在不同平臺上宏HZ的值會有所不同,因此方程式tick=1000000÷HZ的結果可能會是個小數, 因此將其進行四舍五入成一個整數,所以Linux將tick定義成(1000000+HZ/2)/HZ,其中被除數表達式中的HZ/2的作用就是用來將 tick值向上圓整成一個整型數。
另外,Linux還用宏TICK_SIZE來作為tick變量的引用別名(alias),其定義如下(arch/i386/kernel/time.c):

  1. #define TICK_SIZE tick   

(5)宏LATCH:Linux用宏LATCH來定義要寫到PIT通道0的計數器中的值,它表示PIT將沒隔多少個時鐘周期產生一次時鐘中斷。顯然LATCH應該由下列公式計算:
LATCH=(1秒之內的時鐘周期個數)÷(1秒之內的時鐘中斷次數)=(CLOCK_TICK_RATE)÷(HZ)
類似地,上述公式的結果可能會是個小數,應該對其進行四舍五入。所以,Linux將LATCH定義為(include/linux/timex.h):

  1. /* LATCH is used in the interval timer and ftape setup. */   
  2. #define LATCH ((CLOCK_TICK_RATE + HZ/2) / HZ) /* For divider */   

類似地,被除數表達式中的HZ/2也是用來將LATCH向上圓整成一個整數。

2 表示系統當前時間的內核數據結構
作為一種UNIX類操作系統,Linux內核顯然采用本節一開始所述的第三種方法來表示系統的當前時間。Linux內核在表示系統當前時間時用到了三個重要的數據結構:
①全局變量jiffies:這是一個32位的無符號整數,用來表示自內核上一次啟動以來的時鐘滴答次數。每發生一次時鐘滴答,內核的時鐘中斷處 理函數timer_interrupt()都要將該全局變量jiffies加1。該變量定義在kernel/timer.c源文件中,如下所示:

  1. unsigned long volatile jiffies;   

C語言限定符volatile表示jiffies是一個易該變的變量,因此編譯器將使對該變量的訪問從不通過CPU內部cache來進行。
②全局變量xtime:它是一個timeval結構類型的變量,用來表示當前時間距UNIX時間基準1970-01-01 00:00:00的相對秒數值。結構timeval是Linux內核表示時間的一種格式(Linux內核對時間的表示有多種格式,每種格式都有不同的時間 精度),其時間精度是微秒。該結構是內核表示時間時最常用的一種格式,它定義在頭文件include/linux/time.h中,如下所示:

  1. struct timeval {   
  2. time_t tv_sec; /* seconds */   
  3. suseconds_t tv_usec; /* microseconds */   
  4. };   

其中,成員tv_sec表示當前時間距UNIX時間基準的秒數值,而成員tv_usec則表示一秒之內的微秒值,且1000000>tv_usec>=0。
Linux內核通過timeval結構類型的全局變量xtime來維持當前時間,該變量定義在kernel/timer.c文件中,如下所示:

  1. /* The current time */   
  2. volatile struct timeval xtime __attribute__ ((aligned (16)));   

    但是,全局變量xtime所維持的當前時間通常是供用戶來檢索和設置的,而其他內核模塊通常很少使用它(其他內核模塊用得最多的是 jiffies),因此對xtime的更新并不是一項緊迫的任務,所以這一工作通常被延遲到時鐘中斷的底半部分(bottom half)中來進行。由于bottom half的執行時間帶有不確定性,因此為了記住內核上一次更新xtime是什么時候,Linux內核定義了一個類似于jiffies的全局變量 wall_jiffies,來保存內核上一次更新xtime時的jiffies值。時鐘中斷的底半部分每一次更新xtime的時侯都會將 wall_jiffies更新為當時的jiffies值。全局變量wall_jiffies定義在kernel/timer.c文件中:
/* jiffies at the most recent update of wall time */
unsigned long wall_jiffies;
③全局變量sys_tz:它是一個timezone結構類型的全局變量,表示系統當前的時區信息。結構類型timezone定義在include/linux/time.h頭文件中,如下所示:

  1. struct timezone {   
  2. int tz_minuteswest; /* minutes west of Greenwich */   
  3. int tz_dsttime; /* type of dst correction */   
  4. };   

基于上述結構,Linux在kernel/time.c文件中定義了全局變量sys_tz表示系統當前所處的時區信息,如下所示:

  1. struct timezone sys_tz;  

通過對上面文章的了解,大家對Linux系統下的時間管理有了深一步的認識,對Linux系統下時間的構成和運行有了自己的心得。

【編輯推薦】

  1. 1996-2010:那些重要的Linux系統病毒們
  2. 在主流linux系統上運行MeeGo SDK
  3. 在Linux系統中安裝系統日志服務器
  4. 安裝linux系統可以用的5種方法
  5. 嵌入式linux系統開發總結
  6. Linux系統移植
責任編輯:趙鵬
相關推薦

2014-02-17 15:27:19

Linux系統

2011-06-29 09:32:05

Linux

2009-11-11 10:22:15

linux系統時間操作系統

2010-02-25 14:30:14

Linux php

2019-06-28 11:26:31

LinuxWindowsTcping

2009-12-14 15:35:41

Linux操作系統

2017-04-12 14:30:45

Linux內核DebugFS

2011-02-17 10:14:44

LinuxCPU負載

2017-12-11 09:04:53

LinuxScrot截屏

2009-12-11 14:25:42

Linux查看系統時間

2021-08-09 11:31:54

Linux重復相片刪除

2018-04-08 14:27:45

Linuxuptime系統運行時間

2009-06-10 08:49:05

LinuxExt3恢復

2016-12-01 18:39:58

Linux識別USB設備

2009-12-25 17:05:50

Linux操作系統

2024-02-21 21:28:29

Linux系統

2022-03-28 19:19:45

Linux時間子系統

2009-06-10 08:41:15

Linux腳本語言

2020-08-23 21:45:18

Linux終端文件

2015-07-27 11:34:03

Linux內核指針
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩中文一区二区 | 久久精品视频9 | 中文字幕在线看 | 国产特一级黄色片 | 精品国产不卡一区二区三区 | 国产小视频在线观看 | 久久综合婷婷 | 亚洲国产一区二区三区, | 在线观看视频h | 国产精品久久一区 | 日韩一区二区久久 | 中文字幕伊人 | 午夜二区 | 在线看国产 | 日韩欧美二区 | 91精品国产综合久久婷婷香蕉 | 国产一区二区三区精品久久久 | 日韩成人在线观看 | 国产精品久久久久国产a级 欧美日本韩国一区二区 | 欧美性视频在线播放 | 国产精品女人久久久 | 在线观看亚洲一区二区 | 久久九九色 | 91麻豆精品一区二区三区 | 国产亚洲黄色片 | 欧美一区二区三区在线 | 久久久久久久久中文字幕 | 福利社午夜影院 | 日本高清视频在线播放 | 免费观看一级特黄欧美大片 | 黄色大片免费网站 | 欧美爱爱视频网站 | 日本不卡视频在线播放 | 欧美亚洲一区二区三区 | 日韩精品视频在线 | 欧美一区二区三区在线观看视频 | 激情毛片| 91精品久久久久久久久 | 欧美一区二区免费 | www一级片| 大乳boobs巨大吃奶挤奶 |