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 :)
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
Dzięki za opinię. Przez chwilę czułem, że zagubiłem się w cyberprzestrzeni. Mamy nadzieję, że wkrótce będziemy mogli uzyskać odpowiedzi. –
to ci nie pomoże, ale wydaje się, że w powyższym kodzie drukujesz dwa razy pid – rano