【问题标题】:Jiffies - how to calculate seconds elapsed?Jiffies - 如何计算经过的秒数?
【发布时间】:2012-06-08 18:50:01
【问题描述】:

我有一段代码,我想以秒为单位计算时间.. 虽然我的时间是以 jiffies 为单位的,但我如何才能以秒为单位进行转换?

这是我的内核代码:

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/jiffies.h>
#include <linux/timer.h>
unsigned long js, je, tet;
int netblock_init_module(void){
    js = jiffies;
    printk("\n[Jiffies start Time : %lu]\nModule Started.\n", js);
    return 0;
}

void netblock_cleanup_module(void) {
    je = jiffies;
    printk("\n[Jiffies End Time : %lu]\nModule Removed.\n", je);
    tet = je - js;
    printk("\nEnd Time [%lu] - Start Time [%lu]: \nTotlal elapsed Time [%lu]\n",js,je, tet);

}

module_init(netblock_init_module);
module_exit(netblock_cleanup_module);

MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("JIFFIES EXAMPLE");
MODULE_AUTHOR("RAHEEL");

我得到的输出是这样的:

$insmod jiffexample.ko

[Jiffies 开始时间:13363583]

模块启动

$rmmod jiffexample.ko

[Jiffies 结束时间:13361588]

模块已移除。

结束时间 13361588 - 开始时间 1336358

总经过时间 [1605]

现在我想以秒为单位获得转换时间..如何以秒为单位转换这个经过的时间 1605? 或者你能告诉我一秒钟有多少个 jiffies 吗?

【问题讨论】:

  • 所有必要的信息都在 /proc 文件系统 参见 perl 模块 Proc::Stat 中的方法,它只是几行代码,几乎可以适应任何其他语言,包括典型的 bash命令

标签: c performance time linux-kernel kernel


【解决方案1】:

对于您的用例,您可以使用:

jiffies_to_msecs 或 jiffies_to_usecs


以下所有转换例程:

来自 include/linux/jiffies.h

...
/*
 * Convert various time units to each other:
 */
extern unsigned int jiffies_to_msecs(const unsigned long j);
extern unsigned int jiffies_to_usecs(const unsigned long j);
extern unsigned long msecs_to_jiffies(const unsigned int m);
extern unsigned long usecs_to_jiffies(const unsigned int u);
extern unsigned long timespec_to_jiffies(const struct timespec *value);
extern void jiffies_to_timespec(const unsigned long jiffies,
                            struct timespec *value);
extern unsigned long timeval_to_jiffies(const struct timeval *value);
extern void jiffies_to_timeval(const unsigned long jiffies,
                           struct timeval *value);
extern clock_t jiffies_to_clock_t(unsigned long x);
extern unsigned long clock_t_to_jiffies(unsigned long x);
extern u64 jiffies_64_to_clock_t(u64 x);
extern u64 nsec_to_clock_t(u64 x);
extern u64 nsecs_to_jiffies64(u64 n);
extern unsigned long nsecs_to_jiffies(u64 n);
...

【讨论】:

    【解决方案2】:

    来自http://www.kernel.org/doc/man-pages/online/pages/man7/time.7.html

    jiffy 的大小由内核常数 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,这是一个可平均划分常见视频帧速率(PAL,25 HZ;NTSC,30 HZ)的数字。

    只需除以 HZ。

    【讨论】:

      【解决方案3】:

      除了除以HZ外,还可以使用函数jiffies_to_timeval
      它给出了具有秒和微秒的结构。
      微秒始终是1000000/HZ 的倍数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-01
        • 2020-08-31
        • 2021-06-07
        • 2012-03-12
        • 2011-04-22
        • 1970-01-01
        相关资源
        最近更新 更多