title: jiffies溢位與時間先後比較
日期:2005-05-25
1. 概述
在linux核心中,tcp/ip協議棧在很多用到時間比較的地方都使用了jiffies?本文介紹了什麼是jiffies,jiffies溢位可能造成的問題,使用time_after等巨集來正確地比較時間及其背後的原理。
2. jiffies簡介
2.1 時鐘中斷
在linux核心中,tcp/ip協議棧在很多用到時間比較的地方都使用了jiffies。
那麼jiffies是什麼呢?我們知道,作業系統應該能夠在將來某個時刻準時排程某個任務,所以需要一種能保證任務準時排程執行的機制。希望支援每種作業系統的微處理器必須包含乙個可週期性中斷它的可程式設計間隔定時器。這個週期性中斷被稱為系統時鐘滴答(或system timer),它象節拍器一樣來組織系統任務,也稱為時鐘中斷。
時鐘中斷的發生頻率設定為hz,hz是乙個與體系結構無關的常數,在檔案中定義。至少從2.0版到2.1.43版,alpha平台上linux定義hz的值為1024,而其他平台上定義為100。時鐘中斷對作業系統是非常重要的,當時鐘中斷發生時,將周期性地執行一些功能,例如:
. 更新系統的uptime
. 更新time of day
. 檢查當前任務的時間片是否用光,如果是則需要重新排程任務
. 執行到期的dynamictimer
. 更新系統資源使用統計和任務所用的時間統計
2.2 jiffies及其溢位
全域性變數jiffies取值為自作業系統啟動以來的時鐘滴答的數目,在標頭檔案中定義,資料型別為unsigned long volatile (32位無符號長整型)。關於jiffies為什麼要採用volatile來限定,可參考《關於volatile和jiffies.txt》。
jiffies轉換為秒可採用公式:(jiffies/hz)計算,將秒轉換為jiffies可採用公式:(seconds*hz)計算。
當時鐘中斷發生時,jiffies值就加1。因此連續累加一年又四個多月後就會溢位(假定hz=100,1個jiffies等於1/100秒,jiffies可記錄的最大秒數為(2^32 -1)/100=42949672.95秒,約合497天或1.38年),即當取值到達最大值時繼續加1,就變為了0。
在vxworks作業系統中,定義hz的值為60,因此連續累加兩年又三個多月後也將溢位(jiffies可記錄的最大秒數為約合2.27年)。如果在vxworks作業系統上的應用程式對jiffies的溢位沒有加以充分考慮,那麼在連續執行兩年又三個多月後,這些應用程式還能夠穩定執行嗎?
下面我們來考慮jiffies的溢位,我們將從以下幾個方面來闡述:
. 無符號整型溢位的具體過程
. jiffies溢位造成程式邏輯出錯
. linux核心如何來防止jiffies溢位
. time_after等比較時間先/後的巨集背後的原理
. **中使用time_after等比較時間先/後的巨集
3. 無符號整型溢位的具體過程
我們首先來看看無符號長整型(unsignedlong)溢位的具體過程。實際上,無符號整型的溢位過程都很類似。為了更具體地描述無符號長整型溢位的過程,我們以8位無符號整型為例來加以說明。
8位無符號整型從0開始持續增長,當增長到最大值255時,繼續加1將變為0,然後該過程周而復始:
0, 1, 2, ..., 253, 254, 255,
0, 1, 2, ..., 253, 254, 255,
...
jiffies溢位與時間先後比較
1.概述 在linux核心中,tcp ip協議棧在很多用到時間比較的地方都使用了jiffies?本文介紹了什麼是jiffies,jiffies溢位可能造成的問題,使用time after等巨集來正確地比較時間及其背後的原理。2.jiffies簡介 2.1 時鐘中斷 在linux核心中,tcp ip協...
php mysql 溢位 mysql時間戳溢位問題
眾所周知,時間戳是自 1970 年 1 月 1 日 00 00 00 gmt 以來的秒數。它也被稱為 unix 時間戳 unix timestamp mysql也提供了時間戳方面的函式,如unix timestamp 和from unixtime 現在通用的時間戳貌是32位無符號整形,這也就標示著時...
timeval時間溢位問題
該結構體是linux系統中定義,struct timeval結構體在time.h中的定義為 struct timeval 在ndk中使用tv sec或者tv usec時,需先強制型別轉換,否則直接用於計算或者顯示會有溢位現象 如tv sec的值輸出為負數 例子如下 long long getcurr...