2010-07-27 7 views
6

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

Я пробовал ссылаться на ключи в коде, но когда я пытаюсь напечатать «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]; 
} 

Спасибо!

EDIT: Я только что предложил щедрость за этот вопрос. То, что я ищу специально, - это время, затрачиваемое каждым процессом на процессор.

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

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

Еще раз спасибо! Функция

EDIT 2

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

+1

Я не думаю что люди игнорируют ваш вопрос. Просто низкоуровневое программирование ОС для Mac - очень специализированная тема. Измерение истинного времени процесс проводит в CPU также спорна тема. – kazanaki

+0

Спасибо за отзыв. Некоторое время я чувствовал, что потерялся в киберпространстве. Надеемся, что вскоре мы сможем получить ответы. –

+0

это вам не поможет, но похоже, что в приведенном выше коде вы печатаете два раза pid – rano

ответ

3

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

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

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

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

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

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

+0

Есть ли способ получить немного пример кода, чтобы узнать, как его реализовать? Я даже не понимаю, какие аргументы проходят через метод :( –

+0

Я отредактировал свой ответ, чтобы предложить несколько менее эзотерическую альтернативу. :-) Существует множество учебных материалов по использованию NSTask для управления дочерним процессом ... Я бы рекомендовал это, и NSScanner проанализировал вывод top. –

+0

Большое спасибо! Мы определенно приближаемся к чему-то, что я могу сделать. Отлично сработано! :) –

1

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

+1

getrusage() работает только для вызывающего процесса и его детей. –

+0

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

+0

@rano. Это кажется жизнеспособным, и я играю с ним прямо сейчас. Некоторые примеры кода были бы фантастическими, хотя;) –

Смежные вопросы