Измерение времени родительских и дочерних процессов - PullRequest
8 голосов
/ 10 апреля 2011

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

Моя цель - измерить пользовательское и системное время родительского процесса и всех его дочерних элементов отдельно.Я преуспел с родительским процессом, используя функцию times () и структуру tms.Удивительно, но тот же подход к дочерним процессам не работает.В чем ошибка, которую я делаю?Как измерить эти времена?

Я также пробовал getrusage (), и мне / ей это не удалось.

Мой код:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <sys/times.h>
#include <time.h>

#ifndef COUNT
#define COUNT 100000
#endif



int counter;


int main(){

struct tms time1,time2;
times(&time1);

int count = COUNT;
pid_t pid;
while(count--){
    if((pid=fork())<0){
        printf("fork error\n");
    } else if(pid==0){ /* child */
        counter++;
        _exit(0);
    } else {
        waitpid(pid,NULL,0); /*wait()*/
    }
}
printf("COUNTER: %d\n",counter);



times(&time2);

long double clktck=sysconf(_SC_CLK_TCK);
double user=(time2.tms_utime-time1.tms_utime)/(double)clktck;
double system=(time2.tms_stime-time1.tms_stime)/(double)clktck;
double cuser=(time2.tms_cutime-time1.tms_cutime)/(double)clktck;
double csystem=(time2.tms_cstime-time1.tms_cstime)/(double)clktck;

printf("USER:%lf\nSYSTEM:%lf\n",user,system);
printf("CUSER:%lf\nCSYSTEM:%lf\n",cuser,csystem);



return 0;
}

Ответы [ 2 ]

6 голосов
/ 10 апреля 2011

Я думаю, проблема в том, что ваши дети исполняют слишком быстро ; они не занимают достаточно времени для выполнения, поэтому сумма их времени - это множество нулей. Чтобы проверить эту теорию, я немного изменил вашу программу:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <sys/times.h>
#include <time.h>

#ifndef COUNT
#define COUNT 100
#endif



int counter;


int main(){

struct tms time1,time2;
times(&time1);

int count = COUNT;
pid_t pid;
while(count--){
    if((pid=fork())<0){
        printf("fork error\n");
    } else if(pid==0){ /* child */
        int i;
        for (i=0; i<10000; i++) {
            printf("in child %i\n", getpid());
        }
        exit(0);
    } else {
        waitpid(pid,NULL,0); /*wait()*/
    }
}
printf("COUNTER: %d\n",counter);



times(&time2);

printf("%lu %lu %lu %lu\n", time2.tms_utime, time2.tms_stime, time2.tms_cutime, time2.tms_cstime);

long double clktck=sysconf(_SC_CLK_TCK);
double user=(time2.tms_utime-time1.tms_utime)/(double)clktck;
double system=(time2.tms_stime-time1.tms_stime)/(double)clktck;
double cuser=(time2.tms_cutime-time1.tms_cutime)/(double)clktck;
double csystem=(time2.tms_cstime-time1.tms_cstime)/(double)clktck;

printf("USER:%lf\nSYSTEM:%lf\n",user,system);
printf("CUSER:%lf\nCSYSTEM:%lf\n",cuser,csystem);



return 0;
}

Вы увидите, что я резко сократил количество детей и заставил детей выполнять настоящую работу; 10_000 printf(... getpid()) операций. Теперь время равно чему-то:

$ time ./times
...
in child 16181
COUNTER: 0
1 0 24 95
USER:0.010000
SYSTEM:0.000000
CUSER:0.240000
CSYSTEM:0.950000

real    0m2.234s
user    0m0.250s
sys 0m0.950s

Боюсь, вашим детям просто не хватило работы, чтобы что-то сделать. (Странно, звучит как совет для родителей.)

2 голосов
/ 10 апреля 2011

Каждый ребенок получает свое собственное адресное пространство. Код не будет работать, потому что он увеличит свою собственную локальную копию counter и выйдет, оставив версию в родительском процессе / всех остальных дочерних элементах без изменений.

Кроме того, вы, скорее всего, получите несколько ошибок с таким количеством детей.

Извините, я мог помочь только с половиной программы: (.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...