如何計算時間間隔 2014 2 20

2021-08-20 12:45:47 字數 2091 閱讀 3004

在進行重要的時間運算的時候,比如自己實現定時器,不能夠使用time/gettimeofday,建議使用tsc或jiffies。

應用(epdg)中有許多的定時器,這些定時器通過乙個佇列和乙個執行緒進行管理。定時器加入到佇列時,用time/gettimeofday獲取當前時間(記為timer_start),加上使用者傳入的延時引數(delay)會,得到定時器應該被觸發的時間(timer_start+delay)。執行緒每隔10ms,用time/gettimeofday獲取當前時間(curr_time),檢查佇列上的定時器的觸發時間是否小於當前時間,即滿足如下條件的定時器應該被觸發

(timer_start+delay)在系統執行過程中,用date命令修改os時間後,發現定時器不會在指定的時間內被觸發。

由於time/gettimeofday函式獲取的是os wall時間,即我們看到的系統時間。如果修改wall 時間,time/gettimeofday函式獲取到的時間是會隨之變化的。所以,在不同的時間點呼叫time/gettimeofday函式獲得當前時間,然後相減獲得時間間隔的方法是不對的。

使用tsc或jiffies來計算時間間隔。

實際時間(牆上時間)定義在檔案kernel/timer.c中:

struct timespec xtime;

timespec資料結構定義在檔案中,形式如下:

structtimespec;
其中,xtime.tv_sec以秒為單位,存放著自2023年7月1日以來經過的時間。xtime.tv_nsec記錄了自上一秒開始經過的納秒數。xtime是用過time interrupt來更新的。從使用者空間取得牆上時間的主要介面是gettimeofday/time。

實時時鐘(rtc)是用來持久存放系統時間的裝置,即便系統關閉後,它可以靠主機板上的微型電池提供的電力保持系統的計時。系統啟動時,核心通過讀取

rtc來初始化

walltime,

並存放在

xtime

變數中,這是

rtc最主要的作用

。我們可以通過date命令修改實時時鐘。

hz

linux核心每隔固定週期會發出timerinterrupt (irq 0),即每隔固定時間間隔呼叫一次時間中斷。hz是用來定義每一秒有幾次timer interrupts。可以通過/proc/hz檢視hz的值。

tick

tick是hz

的倒數,意即

timerinterrupt

每發生一次中斷的時間。如hz為

250時,

tick為4

毫秒(millisecond)

jiffies

在,定義了

jiffies

為linux

核心變數

(32位元變數,

unsignedlong)

,它被用來紀錄系統自開機以來,已經過多少的

tick

,在linux

核心中jiffies

遠比xtime

重要。每發生一次

timer interrupt

,jiffies

變數會被加一。

由於時間中斷是通過底層的硬體實現的,所以通過

jiffies

獲取時間間隔不會隨著

wall

時間改變而改變。

tsc(time stamp counter)

記錄自啟動以來處理器消耗的時鐘週期數,它是

intel cpu

提供的乙個計數器。它在每個時鐘週期到來時,該計數器自動加一。因為

tsc

隨著處理器週期速率的變化而變化,所以它提供了非常高的精確度。它經常被用來分析和檢測**。

tsc

的值可以通過

rdtsc

指令來讀取。

tsc

的節拍還可以轉換為秒,轉換方法是將其除以

cpu

的時鐘速率

(可以從核心變數

cpu_khz 獲取)

如何計算系統時間間隔。

1 當然是最基本的,用程式自己寫,如下 calculate time include time.h include stdio.h include conio.h main struct time int timeinterval time a,time b int allday time a in...

計算時間間隔

time t 獲得時間只能精確到 秒,clock t 獲得時間能夠精確到毫秒 include clock t start,ends start clock system pause ends clock cout code highlighting produced by actipro codeh...

計算時間間隔

題目描述 讀入兩個用 時 分 秒 表示的時間點,計算以秒為單位的時間間隔。輸入輸入有兩行,每行是乙個用 時 分 秒 表示的時間點。測試資料保證第二個時間點晚於第乙個時間點。輸出輸出乙個整數,表示時間間隔的秒數。樣例輸入 08 00 0009 00 00樣例輸出 3600解題思路 直接兩個時間的時分秒...