版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、Linux操作系統(tǒng)分析,中國科學技術大學計算機系 陳香蘭(051287161312) Autumn 2010,Linux中的時鐘和定時測量,2020/8/14,Linux OS Analysis,3/49,定時測量,Linux內(nèi)核提供兩種主要的定時測量 獲得當前的時間和日期 系統(tǒng)調(diào)用:time(), ftime()以及gettimeofday() 維持定時器 settimer(), alarm() 定時測量是由基于固定頻率振蕩器和計數(shù)器的幾個硬件電路完成的,2020/8/14,Linux OS Analysis,4/49,主要內(nèi)容,定時的硬件設備 Linux內(nèi)核中與時間有關的程序 實現(xiàn)CPU分
2、時、更新系統(tǒng)時間、維護軟定時器 與定時測量相關的系統(tǒng)調(diào)用及相關服務例程,2020/8/14,Linux OS Analysis,5/49,硬時鐘,80 x86體系結(jié)構(gòu)上,內(nèi)核必須顯式的與四種時鐘打交道 實時時鐘Real time clock,RTC 時間戳計數(shù)器Time stamp counter,TSC 可編程間隔定時器Programmable interval timer, PIT CPU本地定時器 高精度事件定時器 ACPI電源管理定時器,用于跟蹤 當前時間,產(chǎn)生周期性的時鐘中斷, 用于計時,2020/8/14,Linux OS Analysis,6/49,實時時鐘RTC,基本上所有的P
3、C都包含實時時鐘 獨立于CPU與所有其他芯片 依靠一個獨立的小電池供電給RTC中的振蕩器 即使關閉PC電源,還會繼續(xù)運轉(zhuǎn) 與CMOS RAM往往集成在一個芯片內(nèi) 例如:Motorala 146818 能在IRQ8上發(fā)出周期性的中斷,頻率在2HZ8192之間 可以對其編程實現(xiàn)一個鬧鐘,2020/8/14,Linux OS Analysis,7/49,Linux本身只使用RTC獲得時間和日期 對應的設備文件為/dev/rtc 可以通過設備文件對其編程 內(nèi)核通過0 x70和0 x71兩個端口訪問RTC 系統(tǒng)管理員可以通過執(zhí)行時鐘程序設置時鐘,2020/8/14,Linux OS Analysis,8
4、/49,時間戳計數(shù)器TSC,在80 x86微處理器中,有一個CLK輸入引線 接收外部振蕩器的時鐘信號 從pentium開始,很多80 x86微處理器都引入了一個TSC 一個64位的、用作時間戳計數(shù)器的寄存器 它在每個時鐘信號(CLK)到來時+1 例如時鐘頻率400MHz的微處理器,TSC每2.5ns就+1 rdtsc指令用于讀該寄存器,2020/8/14,Linux OS Analysis,9/49,與后面介紹的可編程間隔定時器相比,TSC可以獲得更精確的時鐘 為此,Linux在系統(tǒng)初始化的時候必須確定時鐘信號CLK的頻率(即CPU的實際頻率) tsc_calibrate 根據(jù)在一個相對較長的
5、時間間隔內(nèi)(約5ms)所發(fā)生的TSC計數(shù)的個數(shù)進行計算 那個間隔由可編程間隔定時器給出 由于只在系統(tǒng)初始化的時候運行一次,因此本程序可以執(zhí)行較長時間,而不會引起問題,2020/8/14,Linux OS Analysis,10/49,可編程間隔定時器PIT,經(jīng)過適當編程后,可以周期性的給出時鐘中斷 通常是8254 CMOS芯片 使用I/O端口0 x400 x43 Linux將PIT編程為: 100Hz、1000Hz 通過IRQ0發(fā)出時鐘中斷 每若干毫秒(100Hz為10ms)產(chǎn)生一次時鐘中斷,即一個tick,2020/8/14,Linux OS Analysis,11/49,Tick的長短,短
6、 優(yōu)點:分辨率高 缺點:需要較多的CPU時間處理,會導致用戶程序運行變慢 適用于非常強大的機器,這種機器能夠承擔較大的系統(tǒng)開銷 Tick的設置是一個折中,例如 在大多數(shù)惠普的Alpha和Intel的IA-64上約1ms產(chǎn)生一個tick(每秒1024個時鐘中斷) Rawhide Alpha工作站采用更高(1200tick/秒),2020/8/14,Linux OS Analysis,12/49,在Linux中,下列宏決定時鐘中斷頻率,對8254分頻,獲得HZ所需的時鐘,HZ:每秒鐘時鐘中斷的個數(shù),即每秒tick的個數(shù),8254芯片的內(nèi)部振蕩器頻率,每秒多少次,2020/8/14,Linux OS
7、 Analysis,13/49,在init_pit_timer ()中初始化時鐘中斷頻率,此后,只要允許處理時鐘中斷,約每10ms就會產(chǎn)生一個時鐘中斷 1tick約為10ms (當HZ=100),2020/8/14,Linux OS Analysis,14/49,Linux的計時體系結(jié)構(gòu),更新自系統(tǒng)啟動以來所經(jīng)過的時間 更新時間和日期 確定當前進程的執(zhí)行時間,考慮是否要搶占 更新資源使用統(tǒng)計計數(shù) 檢查到期的軟定時器,2020/8/14,Linux OS Analysis,15/49,在單處理器系統(tǒng)中,所有定時活動都由IRQ0上的時鐘中斷觸發(fā),包括 在中斷中立即執(zhí)行的部分,和 作為下半部分延遲執(zhí)
8、行的部分,2020/8/14,Linux OS Analysis,16/49,計時體系結(jié)構(gòu)中的關鍵數(shù)據(jù)結(jié)構(gòu)和變量,系統(tǒng)時鐘system timer 時鐘中斷發(fā)生源 Jiffies變量 計時時鐘源 Xtime變量,2020/8/14,嵌入式OS,17/49,Jiffies變量,記錄系統(tǒng)自啟動以來系統(tǒng)產(chǎn)生的tick數(shù) 每次時鐘中斷1 jiffies,32位 關于jiffies_64,約50天就溢出,數(shù)十億年才會溢出,2020/8/14,Linux OS Analysis,18/49,2020/8/14,Linux OS Analysis,19/49,2020/8/14,Linux OS Analy
9、sis,20/49,時鐘源,時鐘源抽象 參見數(shù)據(jù)結(jié)構(gòu)clocksource 是系統(tǒng)時鐘源,定義了系統(tǒng)時鐘源的接口 缺省時鐘源,kernel/time/jiffies.c,include/linux/clocksource.h,2020/8/14,Linux OS Analysis,21/49,注冊時鐘源: clocksource_register clocksource_list 按rating排序,kernel/time/clocksource.c,2020/8/14,Linux OS Analysis,22/49,Jiffies時鐘源(缺省時鐘源),2020/8/14,Linux OS A
10、nalysis,23/49,PIT時鐘源,2020/8/14,Linux OS Analysis,24/49,2020/8/14,Linux OS Analysis,25/49,2020/8/14,嵌入式OS,26/49,Xtime變量,存放當前時間和日期,kernel/time/timekeeping.c,2020/8/14,嵌入式OS,27/49,時間紀元 1970年1月1日(UTC)午夜,include/linux/time.h,2020/8/14,嵌入式OS,28/49,Xtime的更新,基本上每個tick更新一次 參見:update_wall_time 根據(jù)時鐘源來更新xtime的秒
11、數(shù)和納秒數(shù) 時鐘源,kernel/time/timekeeping.c,kernel/time/timekeeping.c,2020/8/14,Linux OS Analysis,29/49,X86中的時鐘源及其初始化,start_kernel,tick_init 注冊 tick_notifier,time_init,timekeeping_init 初始化xtime,read_persistent_clock,get_wallclock即 native_get_wallclock,mach_get_cmos_time,注冊 clocksource_tsc,tsc_init,choose_ti
12、me_init即 hpet_time_init,setup_pit_timer,注冊pit_clockevent 設置global_clock_event,time_init_hook,設置irq0,2020/8/14,Linux OS Analysis,30/49,時鐘中斷處理函數(shù),2020/8/14,Linux OS Analysis,31/49,global_clock_event 在setup_pit_timer中被初始化為pit_clockevent 其event_handler在注冊過程中,被初始化為tick_handle_periodic tick_handle_periodic
13、的關鍵是tick_periodic,該函數(shù) 調(diào)用do_timer和update_process_times,2020/8/14,Linux OS Analysis,32/49,do_timer,全局變量,存放自系統(tǒng)啟動 以來的時鐘節(jié)拍數(shù),2020/8/14,Linux OS Analysis,33/49,update_process_times,2020/8/14,Linux OS Analysis,34/49,軟定時器,定時器是一種軟件功能,它允許在將來的某個時刻調(diào)用某個函數(shù) 大多數(shù)設備驅(qū)動程序利用定時器完成一些特殊工作 軟盤驅(qū)動程序在軟盤暫時不被訪問時就關閉設備的發(fā)動機 并行打印機利用定時
14、器檢測錯誤的打印機情況,2020/8/14,Linux OS Analysis,35/49,Linux中存在兩類定時器: 動態(tài)定時器 內(nèi)核使用 間隔定時器 由進程在用戶態(tài)創(chuàng)建 注意:由于軟定時器在下半部分處理,內(nèi)核不能保證定時器正好在時鐘到期的時候被執(zhí)行,會存在延遲,不適用于實時應用 延遲函數(shù),2020/8/14,Linux OS Analysis,36/49,動態(tài)定時器,動態(tài)定時器被動態(tài)的創(chuàng)建和撤銷,當前活動的動態(tài)定時器個數(shù)沒有限制,include/linux/timer.h,2020/8/14,Linux OS Analysis,37/49,創(chuàng)建并激活一個動態(tài)定時器,創(chuàng)建一個新的timer
15、_list對象 調(diào)用init_timer初始化,并設置定時器要處理的函數(shù)和參數(shù) 設置定時時間 使用add_timer加入到合適的鏈表中 通常定時器只能執(zhí)行一次,如果要周期性的執(zhí)行,必須再次將其加入鏈表,2020/8/14,Linux OS Analysis,38/49,動態(tài)定時器的維護,2020/8/14,Linux OS Analysis,39/49,數(shù)據(jù)結(jié)構(gòu),kernel/timer.c,2020/8/14,Linux OS Analysis,40/49,處理,kernel/timer.c,kernel/timer.c,函數(shù)init_timers中,2020/8/14,Linux OS A
16、nalysis,41/49,kernel/timer.c,閱讀kernel/timer.c,2020/8/14,Linux OS Analysis,42/49,動態(tài)定時器應用之delayed work,kernel/workqueue.c,include/linux/workqueue.h,2020/8/14,Linux OS Analysis,43/49,動態(tài)定時器應用之schedule_timeout,kernel/timer.c,2020/8/14,Linux OS Analysis,44/49,延遲函數(shù),2020/8/14,Linux OS Analysis,45/49,2020/8/14,Linux OS Analysis,46/49,與定時測量相關的系統(tǒng)調(diào)用,time() 返回從1970年1月1日凌晨0點開始的秒數(shù) ftime() 返回從1970年1月1日凌晨0點開始的秒數(shù)以及最后一秒的毫秒數(shù) 數(shù)據(jù)結(jié)構(gòu)為timeb gettimeofday() 返回從1970年1月1日凌晨0點開始的秒數(shù) 對應于sys_gettimeofday(),2020/8/14,Linux OS Analysis,47/49,settimer() 間隔定時器 頻率:周期性的觸發(fā)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- ifix培訓教程教學課件
- 科技2025研發(fā)合作合同協(xié)議
- 腸炎病人的考試題及答案
- 現(xiàn)代教育考試題及答案
- 2025-2026人教版初中九年級語文期末復習卷
- 2025-2026七年級美術期末考試卷
- 鄉(xiāng)衛(wèi)生院月例會制度
- 民宿衛(wèi)生間管理制度
- 衛(wèi)生部檢查工作制度
- 足道館衛(wèi)生管理制度
- 2026中國電信四川公用信息產(chǎn)業(yè)有限責任公司社會成熟人才招聘備考題庫及答案詳解參考
- 南瑞9622型6kV變壓器差動保護原理及現(xiàn)場校驗實例培訓課件
- 統(tǒng)編版(2024)七年級上冊道德與法治期末復習必背知識點考點清單
- 2026年春節(jié)放假前員工安全培訓
- (2025版)成人肺功能檢查技術進展及臨床應用指南解讀課件
- 《春秋》講解課件
- 青少年抑郁障礙的護理與康復訓練
- 農(nóng)業(yè)養(yǎng)殖認養(yǎng)協(xié)議書
- T-CAPC 019-2025 零售藥店常見輕微病癥健康管理規(guī)范
- 康定情歌音樂鑒賞
- 2025年四川省解除(終止)勞動合同證明書模板
評論
0/150
提交評論