linux - 这些获取资源使用情况的方法有什么区别?

标签 linux time getrusage

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

最佳答案

当您使用类似 time(1) 的命令时它必须使用系统调用,例如 getrusage(2)通过其 system library wrapper .这是建立一个正确的请求 system call number和结构来表明它想要进程的子进程的使用信息。

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

time's case它更愿意分组等待 child 并将其用于调用 wait3反过来,它被实现为更复杂的 wait4 的包装器,它有它的 own systemcall number .

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

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

  • getrusage 有另一个参数,允许进程到目前为止查看自身。
  • wait4 可以只针对一个直系 child 和那个 child 的后代。
  • wait3 是 wait4 或使用 wait();getrusage() 的简化这不像两者那样通用,但对于 time(1) 命令的实现来说已经足够了。 (因此,wait3 是在可用的操作系统上使用时间的最简单和最安全的选项。)

  • 要验证它们是否相同,可以更改 time到替代版本,重新编译并比较:
      while ((caught = wait3 (&status, 0, NULL)) != pid)
        {
          if (caught == -1) {
             getrusage(RUSAGE_CHILDREN, &resp->ru);
             return 0;
          }
        }
    

    关于linux - 这些获取资源使用情况的方法有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60827029/

    相关文章:

    python - 使用 CPU 的已失效进程

    java - 如何从 Java 中的字符串中获取日期和时间?

    c++ - 如何以编程方式从工作线程获取父线程和兄弟线程的 CPU 利用率?

    c++ - 嵌入式 linux 上的 getrusage 函数

    javascript - Intl.DateTimeFormat() 返回不正确的 UTC 日期

    c - 连续两次调用 getrusage 是否保证产生越来越多的结果?

    重定向 stdio 时 Linux BASH 内存泄漏

    c++ - 在 C++ 中使用为 C 制作的 Linux API header

    linux - 在 CentOS 7 (PC) 上安装 OpenCV-2.4.9

    Python:strptime() 格式时区字段未按预期工作