Ответ 1
Существует USER_HZ
>>> import os
>>> os.sysconf_names['SC_CLK_TCK']
2
>>> os.sysconf(2)
100
что ядро использует для сообщения времени в /proc
.
На странице руководства time(7)
:
Программные часы, HZ и Jiffies
Точность различных системных вызовов, устанавливающих таймауты (например, выберите (2), sigtimedwait (2)) и измерьте время процессора (например, getrusage (2)) ограничено разрешением программных часов, поддерживаемых часов ядром, которое измеряет время в jiffies. Размер jiffy равен определяемый значением постоянной ядра HZ.
Значение HZ зависит от версий ядра и аппаратных платформ. На i386 ситуация складывается так: на ядрах вплоть до 2.4.x, HZ составляло 100, давая значение в 0,01 секунды; начиная с 2.6.0, HZ был увеличен до 1000, что дало бы 0,011 секунды. поскольку ядро 2.6.13, значение HZ является параметром конфигурации ядра и может 100, 250 (по умолчанию) или 1000, что дает значение jiffies, 0,01, 0,004 или 0,001 секунды. Начиная с ядра 2.6.20, частота доступна: 300, число, которое равномерно распределяется для ком- (частота PAL, 25 Гц, NTSC, 30 Гц).
Временной (2) системный вызов является частным случаем. Он сообщает времена с гранулярность, определяемая константой ядра USER_HZ. Пользовательское пространство могут определять значение этой константы, используя sysconf (_SC_CLK_TCK).
Если вы абсолютно должны знать SYSTEM_HZ:
>>> from ctypes import *
>>> rt = CDLL('librt.so')
>>> CLOCK_REALTIME = 0
>>> class timespec(Structure):
... _fields_ = [("tv_sec", c_long), ("tv_nsec", c_long)]
...
>>> res = timespec()
>>> rt.clock_getres(CLOCK_REALTIME, byref(res))
0
>>> res.tv_sec, res.tv_nsec
(0, 4000250)
>>> SYSTEM_HZ = round(1/(res.tv_sec + (res.tv_nsec/10.0**9)))
Дает 250 на моем ноутбуке (который звучит примерно правильно) и 1000000000 в VM...