用rdtsc實現linux下的精確計時

2021-06-17 19:54:10 字數 1136 閱讀 1977

**:

在linux開發版最長問到的問題之一就是在linux下如何得到更精確的計時。其實有很多辦法,比如以前就有人用select。不過現在有更精確的實時時鐘可以用,這就是用clock_process_cputime_id做引數通過timer_create來建立timer。通過clock_getres可以得到系統的精度。

實際上,上述方法底層用的就是cpu的rdtsc指令。 在linux下,可以用到cpu的rdtsc指令(當然,windows下也是這樣。現在的cpu一般都支援這個指令)來得到乙個cpu的時間戳(time   stamp),這個值是每個指令週期都增加的,再根據cpu的頻率就可以計算出時間來。用這種方式,對於頻率高的cpu,甚至可以實現納秒級的時間控制。不過據說因為精度太高,這種方式資料抖動比較厲害,每次結果都不一樣,經常有幾百甚至上千的差距。不過在我的實驗中誤差並沒有這麼大,上下在1%左右,不過如果你的要求高的話,這1%也是很厲害的。不過sleep呼叫也是會有誤差的,這裡就不去研究了。

下面是原始碼:

<

stdio.h

>

intget_rdtsc() 

intmain() 

我的實驗環境:intel e6320/2g,使用vmware虛擬機器,系統是centos5-x86。下面是輸出結果。

t2 - t1 = 1865320163 (1865mhz)

t2 - t1 = 1865996702 (1865mhz)

t2 - t1 = 1862758710 (1862mhz)

t2 - t1 = 1865247214 (1865mhz)

t2 - t1 = 1863456686 (1863mhz)

t2 - t1 = 1865427930 (1865mhz)

t2 - t1 = 1865423429 (1865mhz)

t2 - t1 = 1863616999 (1863mhz)

t2 - t1 = 1865105795 (1865mhz)

t2 - t1 = 1867224090 (1867mhz) 

額外的rdtsc實現

static

inline

unsigned 

long

long

rdtsc(

void

)    

用expect(TCL)實現Linux下的互動

現代的shell對程式提供了最小限度的控制 開始,停止,等等 而把互動的特性留給了使用者。這意味著有些程式,你不能非互動的執行,比如說passwd。有一些程式可以非互動的執行,但在很大程度上喪失了靈活性,比如說su,ssh等。這表明linux的工具構造邏輯開始出現問題。expect恰恰填補了 其中的...

用Linux下的rsync命令實現多伺服器映象同步

用linux系統中的rsync命令實現當使用者在本地客戶端某目錄內建立 修改 刪除目錄或檔案 修改目錄或檔案的屬性,只要執行相同的shell 腳 本,rsync就會自動找出有改動或刪除的資料,將其傳送到伺服器上,使linux伺服器端某目錄內的資料跟本地客戶端某目錄內的資料保持一致。方式一 一 伺服器...

Linux下用UDP實現檔案傳輸

原文 udp程式設計框圖 udp協議中伺服器和客戶端的互動存在於資料的收發過程中。進行網路資料收發的時候,伺服器和客戶端的資料是對應的 客戶端傳送資料的動作,對伺服器來說是接收資料的動作 客戶端接收資料的動作,對伺服器來說是傳送資料的動作。實現檔案的傳輸大概分為這幾個步驟 客戶端讀檔案,將內容放在c...