Время ЦП, используемое процессом - PullRequest
6 голосов
/ 27 июля 2010

Мне удалось реализовать код в этом списке , чтобы получить список всех запущенных процессов и их идентификаторы. Теперь мне нужно узнать, сколько времени каждый процесс использует ЦП.

Я пытался ссылаться на ключи в коде, но когда я пытаюсь напечатать «Ticks of CPU Time», я получаю нулевое значение для всех процессов. Кроме того, даже если я получил значение, я не уверен, что именно «Ticks of CPU Time» - именно то, что я ищу.

struct  vmspace *p_vmspace; /* Address space. */
struct  sigacts *p_sigacts; /* Signal actions, state (PROC ONLY). */
int p_flag;         /* P_* flags. */
char    p_stat;         /* S* process status. */
pid_t   p_pid;          /* Process identifier. */
pid_t   p_oppid;     /* Save parent pid during ptrace. XXX */
int p_dupfd;     /* Sideways return value from fdopen. XXX */
/* Mach related  */
caddr_t user_stack; /* where user stack was allocated */
void    *exit_thread;   /* XXX Which thread is exiting? */
int     p_debugger;     /* allow to debug */
boolean_t   sigwait;    /* indication to suspend */
/* scheduling */
u_int   p_estcpu;    /* Time averaged value of p_cpticks. */
int p_cpticks;   /* Ticks of cpu time. */
fixpt_t p_pctcpu;    /* %cpu for this process during p_swtime */
void    *p_wchan;    /* Sleep address. */
char    *p_wmesg;    /* Reason for sleep. */
u_int   p_swtime;    /* Time swapped in or out. */
u_int   p_slptime;   /* Time since last blocked. */
struct  itimerval p_realtimer;  /* Alarm timer. */
struct  timeval p_rtime;    /* Real time. */
u_quad_t p_uticks;      /* Statclock hits in user mode. */
u_quad_t p_sticks;      /* Statclock hits in system mode. */
u_quad_t p_iticks;      /* Statclock hits processing intr. */
int p_traceflag;        /* Kernel trace points. */
struct  vnode *p_tracep;    /* Trace to vnode. */
int p_siglist;      /* DEPRECATED */
struct  vnode *p_textvp;    /* Vnode of executable. */
int p_holdcnt;      /* If non-zero, don't swap. */
sigset_t p_sigmask; /* DEPRECATED. */
sigset_t p_sigignore;   /* Signals being ignored. */
sigset_t p_sigcatch;    /* Signals being caught by user. */
u_char  p_priority; /* Process priority. */
u_char  p_usrpri;   /* User-priority based on p_cpu and p_nice. */
char    p_nice;     /* Process "nice" value. */
char    p_comm[MAXCOMLEN+1];
struct  pgrp *p_pgrp;   /* Pointer to process group. */
struct  user *p_addr;   /* Kernel virtual addr of u-area (PROC ONLY). */
u_short p_xstat;    /* Exit status for wait; also stop signal. */
u_short p_acflag;   /* Accounting flags. */
struct  rusage *p_ru;   /* Exit information. XXX */

На самом деле я также пытался напечатать усредненное по времени значение p_cpticks и некоторых других и никогда не получал интересных значений. Вот мой код, который печатает полученную информацию (я получил ее с сайта cocoabuilder.com):

- (NSDictionary *) getProcessList {
    NSMutableDictionary *ProcList = [[NSMutableDictionary alloc] init];

    kinfo_proc *mylist;
    size_t mycount = 0;
    mylist = (kinfo_proc *)malloc(sizeof(kinfo_proc));
    GetBSDProcessList(&mylist, &mycount);
    printf("There are %d processes.\n", (int)mycount);

NSLog(@" = = = = = = = = = = =  = = = =");
    int k;
    for(k = 0; k < mycount; k++) {
        kinfo_proc *proc = NULL;
        proc = &mylist[k];
        // NSString *processName = [NSString stringWithFormat: @"%s",proc->kp_proc.p_comm];
         //[ ProcList setObject: processName forKey: processName ];
        //  [ ProcList setObject: proc->kp_proc.p_pid forKey: processName];
          // printf("ID: %d - NAME: %s\n", proc->kp_proc.p_pid, proc->kp_proc.p_comm);
           printf("ID: %d - NAME: %s  CPU TIME: %d     \n", proc->kp_proc.p_pid, proc->kp_proc.p_comm, proc->kp_proc.p_pid );
        // Right click on p_comm and select 'jump to definition' to find other values. 
    }


    free(mylist);

    return [ProcList autorelease];
}

Спасибо!

РЕДАКТИРОВАТЬ : Я только что предложил вознаграждение за этот вопрос. Что мне нужно, так это узнать, сколько времени каждый процесс тратит на процессор.

Если в дополнение к этому вы можете указать% CPU, используемый процессом, это было бы замечательно.

Код должен быть оптимальным в том смысле, что он будет вызываться каждую секунду, а метод вызывается во всех запущенных процессах. Objective-C предпочтительнее.

Еще раз спасибо!

РЕДАКТИРОВАТЬ 2

Кроме того, любые комментарии относительно того, почему люди игнорируют этот вопрос, также будут полезны:)

Ответы [ 2 ]

3 голосов
/ 19 августа 2010

Посмотрите на источник Дарвина для libtop.c и особенно для функции libtop_pinfo_update_cpu_usage (). Обратите внимание:

  1. Вам понадобится базовое понимание основ программирования Маха, чтобы разобраться в этом коде, так как он использует порты задач и т. Д.
  2. Если вы хотите просто использовать libtop, вам придется скачать исходный код и скомпилировать его самостоятельно.
  3. Вашему процессу потребуются привилегии для доступа к портам задач для других процессов.

Если все это звучит довольно устрашающе, хорошо ... Там - это способ, который использует менее эзотерические API: просто создайте топовый процесс и проанализируйте его стандартный вывод. Быстрый взгляд на верхнюю (1) справочную страницу обнаружил этот маленький драгоценный камень:

$ top -s 1 -l 3600 -stats pid,cpu,time

То есть, выборка один раз в секунду в течение 3600 секунд (один час) и вывод на стандартный вывод в форме журнала только статистики для pid, использования процессора и времени.

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

1 голос
/ 23 августа 2010

Вы смотрели на структуру rusage?Вы перечислили его и прокомментировали как «Выходная информация», но я знаю, что он содержит ресурсы , фактически , используемые процессом.Взгляните на эту страницу .Я помню, что использовал getrusage() для вычисления точного количества процессорного времени, используемого в моем научном расчете для моего текущего процесса, так что вы просто должны знать, как запросить эту структуру для каждого процесса в вашем списке, я думаю

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