Linux內核中的時間

時間在內核中佔有重要地位,操做系統必須隨時都能得到當前時間,其次操做系統必須提供一種計時器能夠通知內核某一段時間已通過去了。時間在內核中最 常見的應用就是進程調度,內核不但要爲每一個進程分配時間片,並且要週期性的對可運行隊列中的進程進行調整。Linux內核中的時間由兩種設備同時進行計 時:實時時鐘和系統定時器。linux

實時時鐘

實時時鐘(Real Time Clock)用來永久存放系統時間,即使系統關閉也能夠靠主板上的電池繼續進行計時。因爲RTC一般和CMOS被集成在一塊兒,所以RTC也稱爲CMOS時 鍾。雖然能夠經過操做/dev/rtc對RTC進行編程,可是通常Linux只用RTC來獲取當前的時間和日期。當系統啓動時,內核經過讀取RTC來初始 化牆上時間,該時間存放在xtime變量中。所謂牆上時間也就是當前的實際時間。編程

系統定時器

系統定時器是內核時間機制中最重要的一部分,它提供了一種週期性觸發中斷機制,即系統定時器以HZ(時鐘節拍率)爲頻率自行觸發時鐘中斷。當時鍾中斷髮生時,內核就經過時鐘中斷處理程序timer_interrupt()對其進行處理。
系統定時器徹底由操做系統管理,所以也成爲系統時鐘或者軟件時鐘。當系統啓動時,內核經過RTC初始化系統定時器,系統定時器接着由操做系統共掌管,進行 固定頻率的定時。能夠看到,系統時間並非傳統意義上的那種計時時鐘,而是經過定時這種特殊的方式來表現時間。在x86架構下,系統時鐘經過可編程間隔定 時器(PIT)這種設備產生定時。架構

內核定時器

內核定時器也稱爲動態定時器,它可使任務能在指定的時間點上執行。要使用定時器,必須先設置好定時器超時的時間,指定超時發生後應該執行的內核函 數,最後激活這個定時器實例。當定時器超時的時候,該內核函數將被自動執行(但不周期執行),執行完畢後自行銷燬,這也是內核定時器被稱爲動態定時器的原 因。函數

得到時間

內核經過xtime變量保存牆上時間,該變量是timespec類型的,在linux/time.h中定義以下:操作系統

1 struct timespec {
2         __kernel_time_t tv_sec;                 /* seconds */
3         long            tv_nsec;                /* nanoseconds */
4 };

其中,tv_sec是以秒爲單位時間,它保存着從1970年7月1日以來通過的時間,而tv_nsec記錄自上一秒開始通過的納秒數。code

在最新的內核中,xtime未導出所以不能在內核模塊中使用。不過內核提供了內核函數current_kernel_time()來獲取當前時間,該函數返回timespec類型的時間。隊列

相關文章
相關標籤/搜索