3

我试图了解如何

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}

所以,谁能给我解释一下或者给出一些很好的链接来解释这个?
我将不胜感激。

4

1 回答 1

4

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

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

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

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

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

于 2014-12-21T01:47:42.113 回答