2010-10-06 122 views
9

我有一段用戶空間代碼正在解析/ proc/PID/task/TID/stat以獲取cpu使用情況。我可以使用HZ來獲取每秒的jiffies,但是這段代碼可能會移動到具有不同配置值的另一臺機器上。在運行時有沒有辦法從用戶空間獲取HZ的價值?將jiffies轉換爲秒

+1

Duplicate:http://stackoverflow.com/questions/2731463/converting-jiffies-to-milli-seconds – Daenyth 2010-10-06 19:34:07

+2

這不是重複的,因爲我不能使用HZ定義。 – 2010-10-06 19:48:57

回答

6

將它除以從sysconf(_SC_CLK_TCK)中獲得的數字。

不過,我想這大概是100總是在Linux下,無論實際的時鐘滴答的,它總是呈現給用戶空間爲100

見人PROC(5)。

+0

我讀過,100總是提交給用戶空間......但不知道/ proc計爲用戶空間:) – 2010-10-06 22:43:14

+0

我不確定我明白:這是否意味着HZ實際上不是提問者想要的數字? – 2010-10-07 15:40:26

+1

HZ是我想要的數字......但它是一個常量編譯的。只要我在我編譯的同一臺機器上運行...一切都很好。但如果我移動到另一臺機器而無需重新編譯,那麼它可能會有錯誤的值。 – 2010-10-08 13:55:49

0

「ps」命令的來源包括文件<linux/param.h>以獲取HZ的值。

他們還尋找「ELF記」。與編號17找到HZ的值(sysinfo.c):

//extern char** environ; 

/* for ELF executables, notes are pushed before environment and args */ 
static unsigned long find_elf_note(unsigned long findme){ 
    unsigned long *ep = (unsigned long *)environ; 
    while(*ep++); 
    while(*ep){ 
    if(ep[0]==findme) return ep[1]; 
    ep+=2; 
    } 
    return NOTE_NOT_FOUND; 
} 
[...] 
hz = find_elf_note(17); 

我不得不承認這是怪異的我,因爲ELF指出是限定的區間編譯期間。

2

爲了澄清數學背後MarkR's答案:

sysconf(_SC_CLK_TCK)將讓你jiffies per second。用sysconf(_SC_CLK_TCK)得到的數字除以jiffies得到總秒數。

 jiffies      jiffies    seconds 
-------------------- =  ----------------- = ------- = seconds 
sysconf(_SC_CLK_TCK)   (jiffies/second)    1 
0

對於shell腳本等,請使用命令行中的getconf CLK_TCK。使用可以使用它作爲環境變量或命令行傳遞參數。

main(int argc, char **argv) { 
    unsigned long clk_tck = atol(
     getenv("CLK_TCK") || "0" 
    ) || sysconf(_SC_CLK_TCK) ; 
    ... /* your code */ 

這使用上面的sysconf,但允許您用環境變量覆蓋它,可以使用上面的命令設置環境變量。