【发布时间】:2011-04-22 00:09:53
【问题描述】:
我有一段用户空间代码正在解析 /proc/PID/task/TID/stat 以获取 cpu 使用率。我可以使用 HZ 每秒获取 jiffies,但此代码可能会移动到另一台具有不同配置值的机器上。有没有办法在运行时从用户空间获取 HZ 的值?
【问题讨论】:
-
这不是重复的,因为我不能使用 HZ 定义。
标签: linux linux-kernel
我有一段用户空间代码正在解析 /proc/PID/task/TID/stat 以获取 cpu 使用率。我可以使用 HZ 每秒获取 jiffies,但此代码可能会移动到另一台具有不同配置值的机器上。有没有办法在运行时从用户空间获取 HZ 的值?
【问题讨论】:
标签: linux linux-kernel
你将它除以你从 sysconf(_SC_CLK_TCK) 得到的数字。
但是,我认为在 Linux 下这可能总是 100,无论实际时钟滴答声如何,它总是以 100 的形式呈现给用户空间。
参见 man proc(5)。
【讨论】:
澄清MarkR's 背后的数学答案:
sysconf(_SC_CLK_TCK) 会得到你jiffies per second。将jiffies 除以从sysconf(_SC_CLK_TCK) 得到的数字,得到总秒数。
jiffies jiffies seconds
-------------------- = ----------------- = ------- = seconds
sysconf(_SC_CLK_TCK) (jiffies/second) 1
【讨论】:
“ps”命令的来源包括文件<linux/param.h> 以获取HZ 的值。
他们还寻找编号为 17 的“ELF 笔记”来查找 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 注释是在编译期间定义的部分。
【讨论】:
对于 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,但允许你用一个环境变量覆盖它,可以用上面的命令设置。
【讨论】: