конвертировать jiffies в секунды - PullRequest
10 голосов
/ 06 октября 2010

У меня есть фрагмент кода пользовательского пространства, который анализирует / proc / PID / task / TID / stat для получения загрузки процессора. Я могу использовать HZ, чтобы получить jiffies в секунду, но этот код может перейти на другую машину, которая имеет другое настроенное значение. Есть ли способ получить значение HZ из пространства пользователя во время выполнения?

Ответы [ 4 ]

6 голосов
/ 07 октября 2010

Вы делите его на число, полученное из sysconf (_SC_CLK_TCK).

Тем не менее, я думаю, что в Linux это, вероятно, всегда 100, независимо от фактического тактового сигнала, оно всегда отображается в пространстве пользователя как 100.

См. Man proc (5).

2 голосов
/ 24 мая 2013

Чтобы уточнить математику за 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
0 голосов
/ 26 августа 2016

Для сценариев оболочки и т. Д. Используйте getconf CLK_TCK из командной строки. Use может использовать это для передачи этого параметра в качестве переменной среды или в командной строке.

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

При этом используется sysconf, как указано выше, но вы можете переопределить его с помощью переменной окружения, которую можно установить с помощью приведенной выше команды.

0 голосов
/ 22 июля 2011

Источник команды "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это раздел, определенный во время компиляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...