美文网首页
linux手册翻译——getrusage(2)

linux手册翻译——getrusage(2)

作者: 蟹蟹宁 | 来源:发表于2021-07-03 22:38 被阅读0次

\color{#A00000}{NAME}
getrusage - get resource usage

\color{#A00000}{SYNOPSIS}

#include <sys/resource.h>
int getrusage(int who, struct rusage *usage);

\color{#A00000}{DESCRIPTION}
getrusage() 用于返回 who 的资源使用量,其中who可以是:

  • RUSAGE_SELF
    返回调用进程的资源使用统计,即进程中所有线程使用的资源总和。
  • RUSAGE_CHILDREN
    返回调用该函数进程所有已终止且被回收子进程(即执行了wait())的资源用量统计。如果进程有孙子进程或更远的后代进程,且这些后代进程和这些后代进程与调用进程之间的中间进程也已终止且被回收,那么这些后代进程的资源用量也会被统计。(此翻译参考了:linux的getrusage函数说明和测试
    Return resource usage statistics for all children of the calling process that have terminated and been waited for. These statistics will include the resources used by grandchildren, and further removed descendants, if all of the intervening descendants waited on their terminated children.
    如下图所示的进程中,如果A是调用进程,那么将统计B、C、E以及F的资源使用信息。
    进程继承关系以及运行状态图,蓝色表示正在运行,灰色表示已经终止
  • RUSAGE_THREAD
    返回调用线程的资源使用统计信息。 _GNU_SOURCE 特性测试宏必须被定义(在包含任何头文件之前),以便从 <sys/resource.h> 获得这个常量的定义。

资源使用情况返回在 usage 指向的结构中,其形式如下:

struct rusage {
    struct timeval ru_utime; /* user CPU time used */
    struct timeval ru_stime; /* system CPU time used */
    long   ru_maxrss;        /* maximum resident set size */
    long   ru_ixrss;         /* integral shared memory size */
    long   ru_idrss;         /* integral unshared data size */
    long   ru_isrss;         /* integral unshared stack size */
    long   ru_minflt;        /* page reclaims (soft page faults) */
    long   ru_majflt;        /* page faults (hard page faults) */
    long   ru_nswap;         /* swaps */
    long   ru_inblock;       /* block input operations */
    long   ru_oublock;       /* block output operations */
    long   ru_msgsnd;        /* IPC messages sent */
    long   ru_msgrcv;        /* IPC messages received */
    long   ru_nsignals;      /* signals received */
    long   ru_nvcsw;         /* voluntary context switches */
    long   ru_nivcsw;        /* involuntary context switches */
};

并非所有字段都已完成; 内核将未维护的字段设置为零。 (提供未维护的字段是为了与其他系统兼容,并且因为有一天它们可能会在 Linux 上得到支持。)这些字段解释如下:

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

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

  • ru_maxrss (since Linux 2.6.32)
    使用的最大驻留集大小(以千字节为单位)。 对于 RUSAGE_CHILDREN,这是最大子进程的常驻集大小,而不是进程树的最大常驻集大小。
    This is the maximum resident set size used (in kilobytes). For RUSAGE_CHILDREN, this is the resident set size of the largest child, not the maximum resident set size of the process tree.
    关于驻留集:当一个进程在运行的时候,操作系统不会一次性加载进程的所有数据到内存,只会加载一部分正在用,以及预期要用的数据。其他数据可能存储在虚拟内存,交换区和硬盘文件系统上。被加载到内存的部分就是resident set。

  • ru_ixrss (unmaintained)
    Linux 未使用。

  • ru_idrss (unmaintained)
    Linux 未使用。

  • ru_isrss (unmaintained)
    Linux 未使用。

  • ru_minflt
    The number of page faults serviced without any I/O activity; here I/O activity is avoided by “reclaiming” a page frame from the list of pages awaiting reallocation.
    在没有任何 I/O 活动的情况下服务的页面错误数; 这里通过从等待重新分配的页面列表中“回收”一个页面框架来避免 I/O 活动。

  • ru_majflt
    The number of page faults serviced that required I/O activity.
    需要 I/O 活动的情况下,服务发生页面错误的次数。

  • ru_nswap (unmaintained)
    Linux 未使用。

  • ru_inblock (since Linux 2.6.22)
    文件系统必须执行输入的次数。
    The number of times the filesystem had to perform input.

  • ru_oublock (since Linux 2.6.22)
    文件系统必须执行输出的次数。
    The number of times the filesystem had to perform output.

  • ru_msgsnd (unmaintained)
    Linux 未使用。

  • ru_msgrcv (unmaintained)
    Linux 未使用。

  • ru_nsignals (unmaintained)
    Linux 未使用。

  • ru_nvcsw (since Linux 2.6)
    由于进程在其时间片完成之前自愿放弃处理器(通常是为了等待资源可用)而导致上下文切换的次数。
    The number of times a context switch resulted due to a process voluntarily giving up the processor before its time slice was completed (usually to await availability of a resource).

  • ru_nivcsw (since Linux 2.6)
    由于更高优先级的进程变得可运行或当前进程超过其时间片而导致上下文切换的次数。
    The number of times a context switch resulted due to a higher priority process becoming runnable or because the current process exceeded its time slice.

\color{#A00000}{RETURN VALUE}
成功时,返回零。 出错时,返回 -1,并设置 errno 以指示错误。

\color{#A00000}{ERRORS}

  • EFAULT
    usage points outside the accessible address space.

  • EINVAL
    who is invalid.

\color{#A00000}{ATTRIBUTES}

Interface Attribute Value
getrusage() Thread safety MT-Safe

\color{#A00000}{CONFORMING TO}
POSIX.1-2001, POSIX.1-2008, SVr4, 4.3BSD. POSIX.1 specifies getrusage(), but specifies only the fields ru_utime and ru_stime.
RUSAGE_THREAD is Linux-specific.

\color{#A00000}{NOTES}
资源使用的统计信息,会在execve(2)中保留。

在 2.6.9 之前的 Linux 内核版本中,如果 SIGCHLD 的处置设置为 SIG_IGN,则子进程的资源使用情况会自动包含在 RUSAGE_CHILDREN 返回的值中,尽管 POSIX.1-2001 明确禁止这样做。 这种不符合在 Linux 2.6.9 及更高版本中得到纠正。

本页开头显示的结构定义来自 4.3BSD Reno。

古代系统提供了一个 vtimes() 函数,其目的与 getrusage() 类似。 为了向后兼容,glibc(直到版本 2.32)还提供了 vtimes()。 所有新应用程序都应该使用 getrusage() 编写。 (从 2.33 版开始,glibc 不再提供 vtimes() 实现。)

另请参阅 proc(5) 中 /proc/[pid]/stat 的说明。

相关文章

网友评论

      本文标题:linux手册翻译——getrusage(2)

      本文链接:https://www.haomeiwen.com/subject/clipultx.html