2

在 Linux 中,我们可以使用两种方法来查找使用的资源,例如时间、页面错误、页面交换、上下文切换。一种方法是使用getrusage()函数,另一种方法是使用命令/usr/bin/time -v [command to check usage]。这些查找资源使用情况的方法有什么区别?

4

1 回答 1

2

当您使用诸如time(1)之类的命令时,它必须通过其系统库包装器使用诸如getrusage(2)之类的系统调用。这是使用正确的系统调用号和结构构建一个请求,以表明它需要进程子进程的使用信息。

为了跨 UNIX/POSIX 操作系统的兼容性,选择哪些特定功能来构建命令是从选项层次结构中完成的,以充分覆盖命令运行的操作系统。(某些操作系统可能无法实现所有功能或有各种怪癖。)

这种情况下,它会更喜欢将等待子进程分组,并将它的用法用于调用wait3,而 wait3 又被实现为更复杂的 wait4 的包装器,它有自己的系统调用号

wait3/4 和 getrusage 都用信息填充相同的 rusage 结构,并且由于 time 只直接调用一个子进程,wait3()因此调用或将其分解为较少功能的调用wait();getrusage(RUSAGE_CHILDREN)本质上是相同的。因此,时间有效地显示了与 getrusage 提供的数据相同的数据(连同它从系统中收集的一些更通用的数据,例如使用对 的调用所经过的实时时间gettimeofday)。

系统调用包装函数之间的真正区别是:

  • getrusage 有另一个论点,允许一个进程到目前为止查看自己。
  • wait4 可以只针对一个直系子女和该子女的后代。
  • wait3 是 wait4 或 using 的简化wait();getrusage(),虽然没有任何一种通用性,但对于 time(1) 命令的实现来说已经足够了。(因此,wait3 是在可用的操作系统上使用时间的最简单和最安全的选项。)

要验证它们是否相同,可以更改time为替代版本,重新编译并比较:

  while ((caught = wait3 (&status, 0, NULL)) != pid)
    {
      if (caught == -1) {
         getrusage(RUSAGE_CHILDREN, &resp->ru);
         return 0;
      }
    }
于 2020-03-30T18:49:18.627 回答