【问题标题】:Python: How to get number of mili seconds per jiffyPython:如何获得每瞬间的毫秒数
【发布时间】:2010-11-15 21:46:19
【问题描述】:

我想知道系统的 HZ,即 Python 代码的一瞬间是多少毫秒。

【问题讨论】:

  • 定时器中断间隔,决定所有线程休眠操作等的准确性
  • @knitti,“我会马上为你搞定的”。我认为它等于“真正的快速”。
  • antique_chinese_email_message.decode('hz')有什么关系?
  • Python 是一种高级语言,它让你得到的任何数字都变得毫无意义。那么......您需要它来做什么具体的事情吗?
  • @MarkR:通过使用 Python 从/proc 读取每毫秒的 jiffies 来检测挂起的任务?我建议您阅读有关如何在现代计算机上定义 jiffies 的内容。我认为您的定义要么不正确,要么已经过时。

标签: python linux


【解决方案1】:

有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 为单位测量时间的内核。一瞬间的大小是 由核常数 HZ 的值决定。

HZ 的值因内核版本和硬件平台而异。 在 i386 上,情况如下:在内核高达并包括 2.4.x,HZ 为 100,给出的 jiffy 值为 0.01 秒;从...开始 2.6.0,HZ 提升到 1000,一瞬间 0.001 秒。自从 内核 2.6.13,HZ 值是内核配置参数,可以 为 100、250(默认值)或 1000,分别生成 jiffies 值 略为 0.01、0.004 或 0.001 秒。从内核 2.6.20 开始,进一步 频率可用: 300,一个为 com- 均分的数字 mon 视频帧速率(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……

【讨论】:

  • 我正在尝试根据 jiffies 计算一些东西,这些东西实际上应该以毫秒为单位。因此,如果知道 HZ 等效项,则 jiffies * 1000/os.sysconf(2) = ms。至少我是这么认为的。
  • 你的 jiffies 是从哪里来的?另外,你的方程式很奇怪。
  • jiffies 来自 /proc/stat 和类似文件中的 stime、utime 和其他与时间相关的属性。方程来自 unixtop.org。经过 = timediff.tv_sec * HZ + (timediff.tv_usec * HZ) / 1000000;由于 HZ 在 Python 中不可用,我一直在寻找替代方案。
  • @Murgh:这些都是在 USER_HZ 报告的,所以你还缺少什么?
  • @hop:嗯,是的,它们在 jiffies 中,但是要获得从 timeA 到 timeB 的 jiffies 时间,我需要将 ms 乘以 HZ。所以我需要知道 HZ 才能计算它。
【解决方案2】:

sysconf(SC_CLK_TCK) 没有给出 Linux 中定时器中断的频率。它给出了用户空间可见的 jiffies 频率,例如 /proc 中各个目录中的计数器

故意对用户空间隐藏实际频率。事实上,有些系统使用动态滴答或“无滴答”系统,所以根本没有。

所有用户空间接口都使用来自 SC_CLK_TCK 的值,据我所知,在 Linux 下它总是 100。

【讨论】:

  • 是的,它依赖于架构,并且在最近的内核中的大多数(但可能不是全部)架构中硬编码为 100。
  • 好吧,让他们保守秘密。我只是想知道,我需要将 /proc/stat/proc/<pid>/stat 的值相乘以获得 CPU 时间。我猜 10 毫秒就足够了……
【解决方案3】:

这是我写的:

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类

【讨论】:

    猜你喜欢
    • 2010-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    • 1970-01-01
    • 2019-08-29
    • 2011-04-13
    相关资源
    最近更新 更多