呵呵呵呵呵

萝莉有三好,柔体 轻音 易推倒。女神有三宝,干嘛 呵呵 去洗澡。宅男有三好:Dota 基友 破电脑。


linux中使用getrusage获取系统资源的占用信息

linux中使用getrusage获取系统资源的占用信息

使用getrusage的方法:

getrusage得到的是程序对系统资源的占用信息。只要指定了RUSAGE_SELF,就可以得到程序本身运行所占用的系统时间。

getrusage函数来自BSD系统,其函数原型声明在sys/resource.h头文件中:

声明:int getrusage(int who, struct rusage *usage);

该函数获取当前进程或其所有已终止的子进程的资源使用信息,并将其存入指针usage所指结构体。

getrusage 函数返回当前的资源使用情况。当who 参数为 RUSAGE_SELF 时,返回当前进程的资源使用情况;为 RUSAGE_CHILDREN 时,返回状态为终止或者等待的子进程使用的资源情况。

返回的结果存在结构体 struct rusage 中:

    struct rusage {  
        struct timeval ru_utime; /* user time used 用户态使用的时间 */  
        struct timeval ru_stime; /* system 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 */  
        long   ru_majflt;        /* page faults */  
        long   ru_nswap;         /* swaps */  
        long   ru_inblock;       /* block input operations */  
        long   ru_oublock;       /* block output operations */  
        long   ru_msgsnd;        /* messages sent */  
        long   ru_msgrcv;        /* messages received */  
        long   ru_nsignals;      /* signals received */  
        long   ru_nvcsw;         /* voluntary context switches */  
        long   ru_nivcsw;        /* involuntary context switches */  
    };  

用法:
   #include <sys/types.h>
   #include <sys/time.h>
   #include <sys/resource.h>

   #define   RUSAGE_SELF     0
   #define   RUSAGE_CHILDREN     -1
   
   int getrusage(int who, struct rusage *usage);
    当调用成功后,返回0,否则-1; 
 
参数:
    who:可能选择有
    RUSAGE_SELF:获取当前进程的资源使用信息。以当前进程的相关信息来填充rusage(数据)结构
    RUSAGE_CHILDREN:获取子进程的资源使用信息。rusage结构中的数据都将是当前进程的子进程的信息
    usage:指向存放资源使用信息的结构指针。

举个例子:
int who = RUSAGE_SELF;
struct rusage usage;
int ret;
ret = getrusage(who, &usage);
这样你就可以用usage获取你想要的东西了;
同样wait3()和wait4()两个函数也可以得到进程资源信息.

得到CPU使用时间的用法:
struct rusage rup;
getrusage(RUSAGE_SELF, &rup);
long sec = rup.ru_utime.tv_sec + rup.ru_stime.tv_sec;
long usec = rup.ru_utime.tv_usec + rup.ru_stime.tv_usec;
sec += usec/1000000;
usec %= 1000000;


在rusage结构体中,Linux仅维护ru_utime/ru_stime/ru_minflt/ru_majflt/ru_nswap等字段。其中,用户时间(ru_utime)和系统时间(ru_stime)与times函数tms结构体内容相似,但由结构体timeval来保存(而不是含义模糊的clock_t)。在Linux中,getrusage使用的时钟频率由正在运行的内核决定。clock_t时间间隔可能是10ms,而getrusage获得的tick时间间隔可能是1ms(Linux 2.6内核tick频率为1000Hz,而用户频率却为100Hz)。因此,getrusage函数的计时精度将比times函数更高。

参数who的取值可为RUSAGE_SELF(获取当前进程的资源使用信息)或RUSAGE_CHILDREN(获取子进程的资源使用信息),根据该值将当前进程或其子进程的信息填入rusage结构。

若函数执行成功,则返回0;否则返回-1,并设置全局变量errno以指示相关错误。

测量某程序执行时间时,可在待计时程序段起始和结束处分别调用getrusage函数,用后一次获取的当前时间减去前一次获取的当前时间得到运行该程序所消耗的秒或微秒数。如:

 #include <sys/resource.h>
 void GetRusageTiming(void){
     struct rusage tBeginResource, tEndResource;
     getrusage(RUSAGE_SELF, &tBeginResource);
     TimingFunc();
     getrusage(RUSAGE_SELF, &tEndResource);
     unsigned dwCostSec = (tEndResource.ru_utime.tv_sec-tBeginResource.ru_utime.tv_sec) +
                          (tEndResource.ru_stime.tv_sec-tBeginResource.ru_stime.tv_sec);
     unsigned dwCostUsec = (tEndResource.ru_utime.tv_usec-tBeginResource.ru_utime.tv_usec) +
                           (tEndResource.ru_stime.tv_usec-tBeginResource.ru_stime.tv_usec);
     printf("[getrusage]Cost Time = %dSec, %dUsec\n", dwCostSec, dwCostUsec);
 }

计时方式    通用性        精度        计时范围

time命令    Linux        10毫秒(ms)    /

clock函数    ANSI C        10毫秒(ms)    (231-1)/1000000/60≈35分

times函数    ANSI C        10毫秒(ms)    (231-1)/100/3600/24≈243天

rdtsc指令    I386        1纳秒(ns)    取决于CPU主频(主频为1GHz时约583年)

time函数    ANSI C        1秒(s)        (231-1)/3600/24/365≈68年

gettimeofday函数ANSI C        1微秒(μs)    ((231-1)+(231-1)/1000000)/3600/24/365≈68年

clock_gettime函数POSIX        1纳秒(ns)    约同gettimeofday函数

getrusage函数    POSIX        1微秒(μs)    同gettimeofday函数

1秒(second) = 1,000毫秒(millisecond) = 1,000,000微秒(microsecond) = 1,000,000,000纳秒(nanosecond)
 

更多内容:

fopen mode中a与a+区别
linux ubuntu下解压缩tar.xz文件
Source Insight最新版3.50.0082下载与注册码
Windows 10无线网卡无法启动承载网络
Win10系统电脑开启了防火墙就不能Ping通解决办法

本文链接地址:http://www.hehehehehe.cn/i/815.html