2010-07-27 14 views
6

Udało mi się zaimplementować kod na tym listing, aby uzyskać listę wszystkich uruchomionych procesów i ich identyfikatorów. Teraz potrzebuję wyodrębnić ile czasu każdy proces wykorzystuje procesor.Procesor czasu użyty przez proces

Próbowałem już odnieść się do kluczy w kodzie, ale kiedy próbuję wydrukować "Ticks of CPU Time" otrzymuję wartość zero dla wszystkich procesów. Ponadto, nawet jeśli uzyskałem wartość, nie jestem pewien, czy "Ticks of CPU Time" jest dokładnie tym, czego szukam.

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 */ 

W rzeczywistości próbowałem również wydrukować uśrednioną wartość czasu p_cpticks i kilka innych i nigdy nie otrzymałem ciekawych wartości. Oto mój kod, który drukuje pobrane informacje (otrzymałem je od 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]; 
} 

Dzięki!

EDYTOWANIE: Właśnie zaproponowałem nagrodę za to pytanie. To, czego szukam, to uzyskać ilość czasu, jaką każdy proces spędza w CPU.

Jeśli oprócz tego możesz podać% procesora używany przez proces, byłoby to fantastyczne.

Kod powinien być optymalny, ponieważ będzie wywoływany co sekundę, a metoda będzie wywoływana we wszystkich działających procesach. Cel-C preferowany.

Jeszcze raz dziękuję!

EDIT 2

Również żadnych komentarzy co do tego, dlaczego ludzie ignorują to pytanie byłoby również pomocne :)

+1

Nie sądzę że ludzie ignorują twoje pytanie. Po prostu programowanie na niskim poziomie dla komputerów Mac to bardzo specjalistyczny temat. Pomiar prawdziwego czasu, jaki proces spędza w CPU, jest również tematem dyskusyjnym. – kazanaki

+0

Dzięki za opinię. Przez chwilę czułem, że zagubiłem się w cyberprzestrzeni. Mamy nadzieję, że wkrótce będziemy mogli uzyskać odpowiedzi. –

+0

to ci nie pomoże, ale wydaje się, że w powyższym kodzie drukujesz dwa razy pid – rano

Odpowiedz

3

Wystarczy popatrzeć na źródło Darwin libtop.c a szczególnie libtop_pinfo_update_cpu_usage function() . Należy pamiętać, że:

  1. Musisz podstawową wiedzę na temat podstaw programowania Mach do sensu tego kodu, ponieważ wykorzystuje porty zadaniowych itp
  2. Jeśli chcesz po prostu użyć libtop, musisz aby pobrać źródło i skompilować je samodzielnie.
  3. Twój proces będzie wymagał uprawnień do uzyskania portów zadań dla innych procesów.

Jeśli to wszystko brzmi dość trudne, dobrze ... Nie jest sposób, który wykorzystuje mniej ezoterycznych API: Just tarło górną proces i analizować swoje standardowe wyjście. Szybki rzut oka na górnej (1) strony man pojawił się ten mały klejnot:

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

to znaczy próbkę co sekundę przez 3600 sekund (godzina) oraz wyjście na standardowe wyjście w postaci dziennika tylko statystyki dla pid, użycie procesora i czas.

Tarło i zarządzanie procesem potomnym, a następnie przetwarzanie jego wyników są prostymi ćwiczeniami programistycznymi Unix.

+0

Czy jest jakiś sposób, aby uzyskać trochę kodu przykładowego, aby zobaczyć, jak to zaimplementować? Nie wiem nawet, jakie argumenty przejść tą metodą :( –

+0

Edytowałem swoją odpowiedź, by zaoferować nieco mniej ezoteryczną alternatywę :-) Istnieje wiele materiałów do samouczka na temat używania NSTask do zarządzania procesami potomnymi ... Poleciłbym to i NSScannera do analizowania wyników top. –

+0

Dziękuję bardzo! Zdecydowanie zbliżamy się do czegoś, co uda mi się zrobić. Dobra robota! :) –

1

Czy obejrzałeś strukturę rusage?Została ona wymieniona i skomentowana jako "Informacje o wyjściu", ale wiem, że zawiera zasoby faktycznie używane przez proces. Spójrz na this page. Pamiętam, że użyłem getrusage() do obliczenia dokładnej ilości czasu procesora używanej w moich obliczeniach naukowych dla mojego obecnego procesu, więc musisz tylko wiedzieć, jak zapytać tę strukturę dla każdego procesu na twojej liście, tak myślę, że

+1

Funkcja getrusage() działa tylko w procesie wywołującym i jego elementach podrzędnych. –

+0

Wiem, podałem to powyżej, ale uważam, że istnieje sposób na zapytanie o inne procesy w podobny sposób: – rano

+0

@rano. Wydaje się, że to się opłaca i teraz gram z tym. Jakiś przykładowy kod byłby fantastyczny;) –

Powiązane problemy