Python: 如何获取每个时隙的毫秒数

15 投票
3 回答
11412 浏览
提问于 2025-04-16 07:07

我想知道系统的赫兹(HZ),也就是在Python代码中,一个“jiffy”有多少毫秒。

3 个回答

0

我写了这个:

https://github.com/peppelinux/xt_recent_parser

输出结果是这样的:

python3 xt_recent_parser.py 
XT_RECENT python parser
<giuseppe.demarco@unical.it>


114.241.108.160, last seen: 2017-03-25 18:21:42 after 13 Connections 
46.165.210.17, last seen: 2017-03-25 13:07:54 after 10 Connections 
61.53.219.162, last seen: 2017-03-25 17:39:17 after 20 Connections 
179.37.141.232, last seen: 2017-03-25 18:08:23 after 2 Connections 
114.42.117.39, last seen: 2017-03-25 13:22:14 after 18 Connections 
177.12.84.234, last seen: 2017-03-25 16:22:14 after 17 Connections 

我觉得如果你需要把时间转换成毫秒的话,修改起来会很简单,你只需要扩展一下 JiffyTimeConverter 这个 Python 类就可以了。

5

sysconf(SC_CLK_TCK) 并不是用来获取 Linux 中定时器中断的频率的。它返回的是 jiffies 的频率,这个值可以在 /proc 目录下的各种计数器中看到。

实际上,这个频率是故意对用户空间隐藏的。确实,有些系统使用动态滴答或者“无滴答”系统,所以根本就没有固定的滴答频率。

所有用户空间的接口都使用 SC_CLK_TCK 的值,而在 Linux 中,我看到的这个值总是 100。

25

这里提到的是 USER_HZ

>>> import os
>>> os.sysconf_names['SC_CLK_TCK']
2
>>> os.sysconf(2)
100

这是内核用来在 /proc 中报告时间的。

根据 time(7) 的手册:

软件时钟、HZ 和 Jiffies

一些系统调用,比如设置超时的(例如,select(2)、sigtimedwait(2))和测量 CPU 时间的(例如,getrusage(2)),它们的准确性受到软件时钟分辨率的限制。这个软件时钟是由内核维护的,用 jiffies 来测量时间。jiffy 的大小是由内核常量 HZ 的值决定的。

HZ 的值在不同的内核版本和硬件平台上是不同的。在 i386 平台上,情况如下:在 2.4.x 及之前的内核中,HZ 是 100,这样 jiffy 的值是 0.01 秒;从 2.6.0 开始,HZ 提高到了 1000,jiffy 的值变成了 0.001 秒。从 2.6.13 开始,HZ 的值可以通过内核配置来设置,可以是 100、250(默认值)或 1000,分别对应的 jiffies 值是 0.01、0.004 或 0.001 秒。从 2.6.20 开始,还可以使用一个新的频率:300,这个数字可以很好地适应常见的视频帧率(PAL,25 HZ;NTSC,30 HZ)。

times(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……

撰写回答