C在Linux和Windows上获得cpu使用率

时间:2011-03-11 11:44:47

标签: c windows linux io cpu

我在linux和windows上使用以下程序来获取当前进程的cpu利用率。

Linux的:

int main()
{
      int ret;
      char *buf;
      int i=0;
      int who= RUSAGE_SELF;
      struct rusage usage;
      struct rusage *p=&usage;

      ret=getrusage(who,p);
      printf("user time used: %16lf  %16lf\n",p->ru_utime.tv_sec,p->ru_utime.tv_usec);
    printf("system time used: %16lf  %16lf\n",p->ru_stime.tv_sec,p->ru_stime.tv_usec);

      system("ls");
      printf("user time used: %16lf  %16lf\n",p->ru_utime.tv_sec,p->ru_utime.tv_usec);
    printf("system time used: %16lf  %16lf\n", p->ru_stime.tv_sec,p->ru_stime.tv_usec);    

    return 0;
}

linux上的输出:

user time used: 0.000000 -1.999568
system time used: 0.000000 -1.999568
a.out check.c
user time used: 0.000000 -1.999568
system time used: 0.000000 -1.999568

这是否意味着系统(“ls”)命令没有执行任何cpu周期?如何获得任何命令或程序使用的确切cpu周期?

我在Windows上遇到类似的问题。对于以下代码。

窗:

int main()
{
    int i=0;
    HANDLE hProcess = GetCurrentProcess();
    FILETIME ftCreation, ftExit, ftKernel, ftUser;
    SYSTEMTIME stKernel;
    SYSTEMTIME stUser;

    GetProcessTimes(hProcess, &ftCreation, &ftExit, &ftKernel, &ftUser);
    FileTimeToSystemTime(&ftKernel, &stKernel);
    FileTimeToSystemTime(&ftUser, &stUser);

    printf("\nTime in kernel mode = %uh %um %us %ums", stKernel.wHour,stKernel.wMinute, stKernel.wSecond, stKernel.wMilliseconds);
    printf("\nTime in user mode = %uh %um %us %ums \n", stUser.wHour,stUser.wMinute, stUser.wSecond, stUser.wMilliseconds);

    system("dir");

    GetProcessTimes(hProcess, &ftCreation, &ftExit, &ftKernel, &ftUser);
    FileTimeToSystemTime(&ftKernel, &stKernel);
    FileTimeToSystemTime(&ftUser, &stUser);

    printf("\nTime in kernel mode = %uh %um %us %ums", stKernel.wHour,stKernel.wMinute, stKernel.wSecond, stKernel.wMilliseconds);
    printf("\nTime in user mode = %uh %um %us %ums \n", stUser.wHour,stUser.wMinute, stUser.wSecond, stUser.wMilliseconds);
    system("PAUSE");
    return 0;
}

以上程序在Windows上输出 dev c ++:

Time in kernel mode: 0h 0m 0s 15ms
Time in user mode: 0h 0m 0s 15ms
<directory listing>
Time in kernel mode: 0h 0m 0s 15ms
Time in user mode: 0h 0m 0s 15ms

您能否告诉我们如何才能获得上述程序的正确CPU使用率?还有办法了解IO使用情况或读写磁盘/内存的字符数吗? 提前谢谢。

3 个答案:

答案 0 :(得分:2)

在Linux版本中,您要求RUSAGE_SELF,这是父进程的所有线程,而不是RUSAGE_CHILDREN子进程。对于Linux下的IO使用,您需要在2.6.20之后使用内核,并查看/proc/[pid]/io

我认为你在Windows上有类似的问题。您需要使用CreateProcess而不是system,这样您才能获得子进程的句柄并记录其时间。对于Windows上的IO使用,我认为你需要使用WMI,这是一个很大的主题。

答案 1 :(得分:0)

这是正确的输出。 ls不是当前的流程;当ls正在执行时,没有CPU时间花在您的流程上。

BTW Dev-C ++只是一个[坏的,未维护的] IDE,而不是编译器。你可能想说MinGW。

答案 2 :(得分:0)

你在linux版本中犯了一些错误。

  1. 正如Adrian指出的那样,您应该使用RUSAGE_CHILDREN来计算子进程所消耗的资源。
  2. 在您调用getrusage()后,您没有再次致电system()
  3. printf()中,您不应使用代表long double类型的%lftv_sec的类型为time_ttv_usec的类型为susecond_t。在64位Linux中,它们都是signed long,与long double不兼容(请注意,此处有否定结果)。为了便于携带,您应该使用显式强制转换,例如:

    printf("user time used: %ld  %ld\n",(long)p->ru_utime.tv_sec,(long)p->ru_utime.tv_usec);