Linux 将jiffies转换为秒
我有一段用户空间代码,正在解析/proc/PID/task/TID/stat以获取cpu使用率。我可以使用HZ获得每秒的jiffies,但此代码可能会移动到另一台具有不同配置值的机器。有没有办法在运行时从用户空间获取HZ的值?将其除以从sysconf(\u SC\u CLK\u TCK)获取的数字 然而,我认为在Linux下,不管实际的时钟节拍是多少,这个值可能总是100,它总是以100的形式呈现给用户空间 参见man proc(5)。源“ps”命令包括文件Linux 将jiffies转换为秒,linux,linux-kernel,Linux,Linux Kernel,我有一段用户空间代码,正在解析/proc/PID/task/TID/stat以获取cpu使用率。我可以使用HZ获得每秒的jiffies,但此代码可能会移动到另一台具有不同配置值的机器。有没有办法在运行时从用户空间获取HZ的值?将其除以从sysconf(\u SC\u CLK\u TCK)获取的数字 然而,我认为在Linux下,不管实际的时钟节拍是多少,这个值可能总是100,它总是以100的形式呈现给用户空间 参见man proc(5)。源“ps”命令包括文件,以获取HZ值 他们还寻找编号为17的
,以获取HZ值
他们还寻找编号为17的“ELF注释”,以查找HZ的值(sysinfo.c):
我不得不承认,这对我来说很奇怪,因为ELF notes是在编译过程中定义的一个部分。为了澄清答案背后的数学原理:
sysconf(\u SC\u CLK\u TCK)
将每秒为您提供jiffies
。将jiffies
除以从sysconf(\u SC\u CLK\u TCK)
获得的数字,以获得总秒数
jiffies jiffies seconds
-------------------- = ----------------- = ------- = seconds
sysconf(_SC_CLK_TCK) (jiffies/second) 1
对于shell脚本等,从命令行使用
getconf CLK\u TCK
。Use可以使用它作为环境变量或在命令行上传递该参数
main(int argc, char **argv) {
unsigned long clk_tck = atol(
getenv("CLK_TCK") || "0"
) || sysconf(_SC_CLK_TCK) ;
... /* your code */
这使用了如上所述的sysconf,但允许您使用一个环境变量覆盖它,该变量可以通过上述命令进行设置。Duplicate:这不是一个副本,因为我不能使用HZ define。我确实读到100总是呈现给用户空间。。。但不确定/proc是否算作用户空间:)我不确定我是否理解:这是否意味着HZ实际上不是提问者想要的数字?HZ是我想要的数字。。。但它是一个编译中的常量。只要我在我为之编译的同一台机器上运行。。。一切都很好。但是如果我移动到另一台机器而不重新编译,那么它可能有错误的值。
main(int argc, char **argv) {
unsigned long clk_tck = atol(
getenv("CLK_TCK") || "0"
) || sysconf(_SC_CLK_TCK) ;
... /* your code */