Unix/Linux编程:获取进程资源信息------getrusage()
getrusage
getrusage()系统调用返回调用进程或其子进程用掉的各类系统资源的统计信息。
NAME
getrusage - 获取资源使用情况
SYNOPSIS
#include <sys/time.h>
#include <sys/resource.h>
int getrusage(int who, struct rusage *usage);
DESCRIPTION
getrusage() 返回 who 的资源使用度量,可以是以下之一 :
RUSAGE_SELF
返回调用进程的资源使用统计,即进程中所有线程使用的资源总和。
RUSAGE_CHILDREN
返回调用进程的所有被终止和处于等待状态的子(孙子...)进程相关的信息。
RUSAGE_THREAD (since Linux 2.6.26)
返回调用线程相关的信息。这个值是 Linux 特有的。
usage 参数是一个指向 rusage 结构的指针,其定义
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
进程在用户模式下消耗的 CPU 的秒数和毫秒数
ru_stime
进程在内核模式下消耗的 CPU 的秒数和毫秒数
ru_maxrss (since Linux 2.6.32)
这是使用的最大驻留集大小(以千字节为单位)。在 RUSAGE_CHILDREN 操作中,ru_maxrss 字段返回
调用进程的所有子孙进程中最大驻留集大小(不是所有子孙进程之和)
ru_ixrss (unmaintained)
This field is currently unused on Linux.
ru_idrss (unmaintained)
This field is currently unused on Linux.
ru_isrss (unmaintained)
This field is currently unused on Linux.
ru_minflt
在没有任何 I/O 活动的情况下服务的页面错误数; 这里通过从等待重新分配的页面列表中“回收”一个页
面框架来避免 I/O 活动。
ru_majflt
需要 I/O 活动的页面错误服务数。
ru_nswap (unmaintained)
This field is currently unused on Linux.
RETURN VALUE
On success, zero is returned. On error, -1 is returned, and errno is set appropriately.
Linux 特有的/proc/PID/stat 文件提供了系统中所有进程的某些资源使用信息(CPU 时间和页面错误),更多信息可参考 proc(5)手册。
getrusage() RUSAGE_CHILDREN 操作返回的 rusage 结构中包含了调用进程的所有子孙进程的资源使用统计信息。如假设三个进程之间的关系为父进程、子进程和孙子进程,那么当子进程在 wait()孙子进程时,孙子进程的资源使用值就会被加到子进程的 RUSAGE_CHILDREN值上,当父进程执行了一个 wait()子进程的操作时,子进程和孙子进程的资源使用信息就会被加到父进程的 RUSAGE_CHILDREN 值上。而如果子进程没有 wait()孙子进程的话,孙子进程
的资源使用就不会被记录到父进程的 RUSAGE_CHILDREN 值中
总结
进程会消耗各种系统资源。getrusage()系统调用允许一个进程监控自己及其子进程所消耗的各种资源。
setrlimit()和 getrlimit()系统调用允许一个进程设置和获取自己在各种资源上的消耗限制。每个资源限制有两个组成部分:
- 一个是软限制,内核在检查进程的资源消耗时会应用这个限制;
- 另外一个是硬限制,它是软限制可取的最大值。
非特权进程能够将一个资源的软限制设置为 0 到硬限制之间的任意一个值,但只能降低硬限制值。
特权进程能够随意修改这两个限制值,只要软限制值小于或等于硬限制值即可。
当一个进程达到软限制时通常会通过接收一个信号或在调用试图超出这个限制的系统调用时得到一个错误来得知这个事实。
还没有评论,来说两句吧...