2010-07-27 8 views
6

Ich habe es geschafft, den Code auf dieser listing zu implementieren, um eine Liste aller laufenden Prozesse und ihre IDs zu erhalten. Was ich jetzt brauche, ist zu extrahieren, wie viel Zeit jeder Prozess die CPU benutzt.Zeit CPU von Prozess

Ich habe versucht, auf die Schlüssel im Code zu beziehen, aber wenn ich versuche, "Ticks of CPU Time" zu drucken, bekomme ich einen Nullwert für alle Prozesse. Selbst wenn ich einen Wert bekommen habe, bin ich mir nicht sicher, ob "Zecken der CPU-Zeit" genau das ist, wonach ich suche.

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

In der Tat habe ich auch versucht, Zeit gemittelte Wert von p_cpticks und ein paar anderen zu drucken und bekam nie interessante Werte. Hier ist mein Code, der die abgerufenen Informationen druckt (ich habe es von cocoabuilder.com bekommen):

Vielen Dank!

EDIT: Ich habe gerade ein Kopfgeld für diese Frage angeboten. Ich suche speziell nach der Zeit, die jeder Prozess in der CPU verbringt.

Wenn Sie zusätzlich angeben können, dass% CPU von einem Prozess verwendet wird, wäre das fantastisch.

Der Code sollte optimal sein, da er jede Sekunde aufgerufen wird und die Methode bei allen laufenden Prozessen aufgerufen wird. Ziel-C vorzuziehen.

Danke nochmal!

EDIT 2

Auch die Kommentare, warum Menschen diese Frage ignorieren auch hilfreich sein würde :)

+1

Ich denke nicht dass Leute deine Frage ignorieren. Es ist nur so, dass Low-Level-OS-Programmierung für Mac ein sehr spezielles Thema ist. Die Messung der tatsächlichen Zeit, die ein Prozess in der CPU verbringt, ist ebenfalls ein strittiges Thema. – kazanaki

+0

Danke für die Rückmeldung. Eine Zeitlang fühlte ich mich im Cyberspace verloren. Hoffentlich können wir bald Antworten bekommen. –

+0

das wird Ihnen nicht helfen, aber scheint, dass in dem obigen Code drucken Sie zweimal die PID – rano

Antwort

3

Werfen Sie einen Blick auf die Quelle Darwin für libtop.c und insbesondere die libtop_pinfo_update_cpu_usage() Funktion . Beachten Sie, dass:

  1. Sie werden ein grundlegendes Verständnis von Mach-Programmierung Grundlagen müssen Sinn dieses Codes zu machen, wie es Aufgabe Ports verwendet, usw.
  2. Wenn Sie möchten, einfach verwenden libtop, Sie haben um die Quelle herunterzuladen und selbst zu kompilieren.
  3. Ihr Prozess benötigt Berechtigungen, um an den Task-Ports für andere Prozesse zu gelangen.

Wenn all dies eher abschreckend klingt, gut ... Es ist eine Art und Weise, die weniger esoterisch-APIs verwendet: einfach ein Top-Prozess erzeugen und die Standardausgabe analysieren. Ein kurzer Blick über die Spitze (1) man-Seite drehte dieses kleine Juwel up:

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

Das heißt, Probe einmal pro Sekunde für 3600 Sekunden (eine Stunde) und die Ausgabe in Protokollform an stdout nur die Statistiken für Pid, CPU-Nutzung und Zeit.

Das Erstellen und Verwalten des Child-Top-Prozesses und das anschließende Analysieren der Ausgabe sind einfache Unix-Programmierübungen.

+0

Gibt es eine Möglichkeit, ein wenig Beispielcode zu erhalten, um zu sehen, wie dies zu implementieren? Ich bin nicht einmal wirklich klar, welche Argumente die Methode durchlaufen soll :( –

+0

Ich habe meine Antwort geändert, um eine etwas weniger esoterische Alternative anzubieten :-) Es gibt viel Tutorialmaterial zur Verwendung von NSTask, um einen Kindprozess zu verwalten ... Ich würde das und NSScanner empfehlen, die Ausgabe von top zu parsen. –

+0

Vielen Dank! Wir kommen definitiv etwas näher, was ich schaffen kann. Gut gemacht! :) –

1

Haben Sie sich die Struktur rusage angesehen?Sie haben es aufgelistet und kommentiert als "Exit information", aber ich weiß, dass es die Ressourcen tatsächlich von einem Prozess verwendet enthält. Werfen Sie einen Blick auf this page. Ich erinnere mich, dass ich getrusage() für die Berechnung der genauen Menge an CPU-Zeit in meiner wissenschaftlichen Berechnung für meinen aktuellen Prozess verwendet, so müssen Sie nur wissen, wie diese Struktur für jeden Prozess in Ihrer Liste Abfrage ich

+1

Getrusage() funktioniert nur für den aufrufenden Prozess und seine untergeordneten Elemente. –

+0

Ich weiß, ich habe es oben gesagt, aber ich glaube, es gibt eine Möglichkeit, andere Prozesse in ähnlicher Weise abzufragen – rano

+0

@rano. Das scheint machbar und ich spiele gerade damit. Einige Beispielcode wäre aber fantastisch;) –

Verwandte Themen