C получить использование процессора на Linux и Windows - PullRequest
2 голосов
/ 11 марта 2011

Я использую приведенные ниже программы на Linux и Windows, чтобы получить процессор использования текущих процессов.

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") не выполняла циклы ЦП? Как получить точные циклы процессора, используемые любой командой или программой?

У меня похожие проблемы с окнами. для приведенного ниже кода.

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

Не могли бы вы сообщить мне, как мы можем получить правильное использование процессора для вышеуказанных программ? Также есть ли способ узнать об использовании ввода-вывода или количестве символов, читаемых и записываемых на диск / память? Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 11 марта 2011

В версии для Linux вы запросили RUSAGE_SELF, который является всеми потоками родительского процесса, а не RUSAGE_CHILDREN для дочерних процессов.Для использования ввода-вывода под Linux вам понадобится ядро ​​после 2.6.20 и посмотрите в /proc/[pid]/io.

Я думаю, у вас похожая проблема в Windows.Вам нужно будет использовать CreateProcess вместо system, чтобы вы могли получить дескриптор дочернего процесса и записать его время.Для использования ввода-вывода в Windows, я думаю, вам нужно использовать WMI, который является большой темой.

0 голосов
/ 31 января 2014

Вы сделали несколько ошибок в версии для Linux здесь.

  1. Как указал Адриан, вы должны использовать RUSAGE_CHILDREN для подсчета ресурсов, потребляемых дочерним процессом.
  2. Вы больше не звонили getrusage() после того, как вызвали system().
  3. В вашем printf() не следует использовать %lf, представляющий длинный двойной тип.tv_sec относится к типу time_t, а tv_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);
    
0 голосов
/ 11 марта 2011

Это правильный вывод.ls не текущий процесс;пока ls выполняется, процессорное время не тратится на ваш процесс.

Кстати, Dev-C ++ - это просто [плохая, не поддерживаемая] IDE, а не компилятор.Вы, вероятно, хотели сказать MinGW.

...