【问题标题】:convert jiffies to seconds将 jiffies 转换为秒
【发布时间】:2011-04-22 00:09:53
【问题描述】:

我有一段用户空间代码正在解析 /proc/PID/task/TID/stat 以获取 cpu 使用率。我可以使用 HZ 每秒获取 jiffies,但此代码可能会移动到另一台具有不同配置值的机器上。有没有办法在运行时从用户空间获取 HZ 的值?

【问题讨论】:

标签: linux linux-kernel


【解决方案1】:

你将它除以你从 sysconf(_SC_CLK_TCK) 得到的数字。

但是,我认为在 Linux 下这可能总是 100,无论实际时钟滴答声如何,它总是以 100 的形式呈现给用户空间。

参见 man proc(5)。

【讨论】:

  • 我确实读过 100 总是呈现给用户空间...但不确定 /proc 是否算作用户空间 :)
  • 我不确定我是否理解:这是否意味着 HZ 实际上不是提问者想要的数字?
  • HZ 是我想要的数字......但它是一个编译常数。只要我在我编译的同一台机器上运行......一切都很好。但是,如果我在不重新编译的情况下转移到另一台机器,那么它可能具有错误的值。
【解决方案2】:

澄清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

【讨论】:

    【解决方案3】:

    “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 注释是在编译期间定义的部分。

    【讨论】:

      【解决方案4】:

      对于 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,但允许你用一个环境变量覆盖它,可以用上面的命令设置。

      【讨论】:

        猜你喜欢
        • 2011-02-13
        • 1970-01-01
        • 1970-01-01
        • 2015-03-01
        • 2011-03-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多