【问题标题】:How getrusage works and What is really inside the rusage struct?getrusage 的工作原理以及 rusage 结构中的真正内容是什么?
【发布时间】:2015-02-19 13:36:53
【问题描述】:

我试图了解如何

int getrusage(int who, struct rusage* usage)

工作是为了计算我的一个程序的运行时间。
我把手册页弄红了,可能 10 次,但仍然无法得到它。试图在网上找到一些东西,但除了关于这个函数的手册页什么都没有找到。
我不清楚的是存储在 rusage 结构中的内容 - 手册页不是很清楚 - 所以我试图使用调试器运行它并直接查看里面的内容,但仍然不明白,特别是这两个结构 - timeval ru_utime 和 timeval ru_stime - 是如何工作的。
它们里面的内容假设不同的值,有时为 0,有时为 2000 等。

我运行了一个带有 for 循环的简单程序,该循环不断分配和释放内存。我用秒表实际查看需要多少时间,花了 5.23 秒。但我在这些结构中看到的似乎完全不相关:

循环之前:
ru_utime = { tv_sec = 0, tv_usec = 1000}, ru_stime = { tv_sec = 0, tv_usec = 1000}
循环后:
ru_utime = { tv_sec = 4, tv_usec = 677000}, ru_stime = { tv_sec = 0, tv_usec = 2000}

所以,任何人都可以向我解释这个或提供一些好的链接在哪里这解释清楚了吗?
将不胜感激。

【问题讨论】:

    标签: c timeval getrusage rusage


    【解决方案1】:

    你感兴趣的两个子结构描述如下:

    ru_utime 这是在用户模式下执行所花费的总时间,以 timeval 结构表示(秒加微秒)。

    ru_stime 这是在内核模式下执行所花费的总时间,以 timeval 结构(秒加微秒)表示。

    为了防止你把内存弄得乱七八糟,你的系统有两个“特权级别”,分别称为内核模式和用户模式。为了保持快速和简单,您的用户模式无法查看所有内存,无法与 I/O 设备通信,只能真正进行数字运算。对于任何更复杂的事情(例如内存页面分配、文件系统读/写、将内容打印到屏幕上),它必须要求内核来代替它,它可以访问所有这些。这是通过一种称为“系统调用”的机制完成的;阅读这篇 wiki 文章以进一步阅读:http://en.wikipedia.org/wiki/System_call

    在高层次上,ru_utime 结构返回您的程序在执行实际计算时所花费的时间,ru_stime 结构返回您的程序在执行时等待内核响应的时间磁盘访问、打印到屏幕等。

    【讨论】:

    • (请看我的问题,以便看得更清楚,似乎 cmets 不允许使用 html 标签)我运行了一个简单的程序,其中有一个 for 循环,它不断地分配和释放内存。我用秒表实际查看需要多少时间,花了 5.23 秒。但我在这些结构中看到的似乎完全不相关:

      循环之前:
      ru_utime = { tv_sec = 0, tv_usec = 1000}, ru_stime = { tv_sec = 0, tv_usec = 1000}
      循环后
      { tv_sec = 4, tv_usec = 677000}, ru_stime = { tv_sec = 0, tv_usec = 2000}
    • 这有点道理。内存分配(通过malloc)实际上是在用户空间中完成的,如果内部缓冲区空间用完,它只会向内核请求更多,因此内核时间只有很小的变化。这意味着用户区(ish)需要 4.6 秒。其余的可能是因为您在测试时正在运行其他任务;您没有完全不间断地访问 CPU!
    • 所以,我只需要考虑 ru_utime 之前和之后的区别吗? ru_stime 好像没有关系?
    • ru_stime 之间的差异只有 1 毫秒,虽然很小,但我认为它可能会改变,所以,当我尝试计算循环的运行时间时,我应该这样做: ru_utime + 的差异ru_stime 的差异,对吧?
    猜你喜欢
    • 1970-01-01
    • 2011-11-08
    • 2018-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 1970-01-01
    相关资源
    最近更新 更多