Forum: PC-Programmierung Prozessorzeit wie ermitteln?


von Seb (Gast)


Lesenswert?

Hey,
unter Unix gibt es ein Kommando oder auch ein Bash-Builtin "time" mit 
dem man die beanspruchte Prozessorzeit und Realzeit messen kann.
Auf Wikipedia liest sich das so:

Die "Prozessorzeit" (englisch "CPU Time") bezeichnet die gemessene Zeit 
in Stunden, Minuten und Sekunden, in der ein laufendes Programm seit dem 
letzten Programmstart tatsächlich Kommandos an den Prozessor gesendet 
hat. Diese Summe ist praktisch immer niedriger als die gesamte Laufzeit 
des Programms, da dieses selbst bei intensiver Nutzung kaum pausenlos 
Befehle an den Prozessor sendet.

Nun meine Frage, wie soll man dies nun ermitteln? Finde das ein bisschen 
Missverständlich wie das beschrieben wird, da hier suggeriert wird ein 
Programm würde Befehle "senden" und eigentlich arbeitet ja der Prozessor 
die Befehle eines Programms ja ab. Und naja, die werden ja eig alle 
nacheinander abgearbeitet und wenn man jetzt mal außer acht lässt das 
die CPU das Programm unterbricht und andere Prozesse ausführt, dann weis 
ich nicht in welchem Zeitpunkt kein Befehl an die CPU sendet. Selbst 
wenn ich auf Ressourcen warte wie z.B. Netzwerkpakete dann wird das 
Programm ja auch unterbrochen und zu einem anderen Kernel-Space Prozess 
gesprungen und selbst da muss doch in irgend einer Art und weise Polling 
betrieben werden.

mfg Seb

von Steffen (Gast)


Lesenswert?

Moin Seb,

das klingt in der Tat merkwürdig:

Seb schrieb:
> Die "Prozessorzeit" (englisch "CPU Time") bezeichnet die gemessene Zeit
> in Stunden, Minuten und Sekunden, in der ein laufendes Programm seit dem
> letzten Programmstart tatsächlich Kommandos an den Prozessor gesendet
> hat.

Ein Programm ist nix aktives. Selbt ein "laufendes Programm" (Prozess) 
wird vom Prozessor (od. entsprechenden Einheiten) ausgeführt. Der 
Prozessor (od. die Ausführungseinheit) ist also der aktive Teil.

Der time Befehl akkumuliert imho die Zeit, die ein Prozess (i.e. seine 
Threads) als "running" scheduled sind.

Grüße, Steffen

von Peter II (Gast)


Lesenswert?

Seb schrieb:
> Diese Summe ist praktisch immer niedriger als die gesamte Laufzeit
> des Programms, da dieses selbst bei intensiver Nutzung kaum pausenlos
> Befehle an den Prozessor sendet.

das dürfte aber nicht stimmen. Man kann auch ein 5min 12min CPU zeit 
verbrauchen. Dann wenn man mehr als eine CPU nutzt. (Threads).

von Seb (Gast)


Lesenswert?

Peter II schrieb:
> Seb schrieb:
>> Diese Summe ist praktisch immer niedriger als die gesamte Laufzeit
>> des Programms, da dieses selbst bei intensiver Nutzung kaum pausenlos
>> Befehle an den Prozessor sendet.
>
> das dürfte aber nicht stimmen. Man kann auch ein 5min 12min CPU zeit
> verbrauchen. Dann wenn man mehr als eine CPU nutzt. (Threads).

Naja, ein Beispiel ist z.B. wenn ich jetzt hier mal ein einfaches 
apt-get update mache.

also:
1
time sudo apt-get update

Der Output ist dann:
1
real  0m26.212s
2
user  0m3.004s
3
sys  0m0.372s

Also 26s ist das Programm gelaufen, davon 3s im Userspace + 0.3 s im 
Kernel Space.
Aber in welchem Moment der 26 s ist das Programm nicht aktiv gewesen? 
Sprich eig nur wenn die CPU gerade andere Prozesse ausgeführt hat. Aber 
ich  geh mal davon aus das die große Zahl von 26 s hauptsächlich das 
warten auf Netzwerkpakete betrifft, aber selbst wenn das Programm auf 
Netzwerkpakete wartet, wird das Programm doch weiterhin ausgeführt, oder 
nicht? Polling etc....?

Weil mir 3 s ein bisschen wenig erscheint und  mit 3s + 0.3s kommt man 
nie auf diese 26 s . Was ist also in den restlichen 22.6s passiert?

von Peter II (Gast)


Lesenswert?

Seb schrieb:
> Netzwerkpakete wartet, wird das Programm doch weiterhin ausgeführt, oder
> nicht?

nein wird es nicht. Es macht wird erste wieder "geweckt" wenn daten für 
das Programm da sind.

Polling macht man eigentlich nicht mehr.

Auch bei einem Sleep(100). Wird einfach im Betiebsystem ein wecker 
gestellt und dieser weckt dann Pünktlich die Applikation. Dabei 
verbraucht die App keine CPU zeit.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Seb schrieb:
> Sprich eig nur wenn die CPU gerade andere Prozesse ausgeführt hat.

Nein, auch I/O oder sleep kann ein Programm unterbrechen.

Seb schrieb:
> wenn das Programm auf Netzwerkpakete wartet

Wenn es wartet wird es "beiseite geschoben", bei aktivem polling würde 
man natürlich auch alle Zeit verbraten, wenn man aber aktiv von sich aus 
Zeit abgibt (z.B. indem man blockierend liest) sieht das schon anders 
aus.

von Seb (Gast)


Lesenswert?

Peter II schrieb:
> Seb schrieb:
>> Netzwerkpakete wartet, wird das Programm doch weiterhin ausgeführt, oder
>> nicht?
>
> nein wird es nicht. Es macht wird erste wieder "geweckt" wenn daten für
> das Programm da sind.
>
> Polling macht man eigentlich nicht mehr.
>
> Auch bei einem Sleep(100). Wird einfach im Betiebsystem ein wecker
> gestellt und dieser weckt dann Pünktlich die Applikation. Dabei
> verbraucht die App keine CPU zeit.

Naja, aber wenn das Programm jetzt z.B. aus einem Socket versucht zu 
lesen und noch keine Daten da sind, ist das doch eine blockierende 
Aktion, sprich ich bin doch noch immer im Programm, bzw. in der 
System-Routine. Das System könnte sonst dem Scheduler einfach sagen, 
Programm inaktiv wartet auf Ressourcen und sobald das System feststellt 
das Sie verfügbar sind, kann das System wieder zum Programm springen, 
das würde mir einfallen?!

Ich hab mal Angefangen ein kleines Mini-Betriebssystem zu schreiben, 
wenn man nun dort z.B. auf einen leeren Tastatur-Puffer wartet im 
Keyboardcontroller wird einfach gepoolt, weils keine andere Möglichkeit 
gibt. Dort führt die CPU dann imemer wieder Befehle aus, und wenns nur 
überprüfen und zurückspringen ist. Wenn ich nicht mehr will das die CPU 
was ausführt, müsste man einen halt - Befehl senden (hlt in Assembler), 
aber dann krieg ich sie auch nicht mehr wach. Allso die Ausführung 
konkret unterbrechen, da kenn ich keine möglichkeit, außer irgendwas 
anderes zu machen.

In meinem kleinen Betriebssystem hab ich ein einfaches Round-Rubin ohne 
Prioritäten.
Aber wenn ich dort von der Eingabezeile lese überprüft die Systemroutine 
einfach immer und immer wieder ob Zeichen im Puffer stehen und kehrt 
erst dann wieder aus der schleife zurück.

von Seb (Gast)


Lesenswert?

Ich meine selbst Event-Bibliotheken arbeiten so. oder die Win32 - Api. 
Da gibts die Nachrichten schleife die immer und immer wieder auf 
eingetroffene Events wartet. Im Grunde nichts andere als das was ich mit 
dem Puffer mache.

von Peter II (Gast)


Lesenswert?

Seb schrieb:
> Naja, aber wenn das Programm jetzt z.B. aus einem Socket versucht zu
> lesen und noch keine Daten da sind, ist das doch eine blockierende
> Aktion, sprich ich bin doch noch immer im Programm, bzw. in der
> System-Routine.

du bist immer im Programm, sonst währe ja das Programm beendet.

Wenn du in der Systemfunktion Read blockierst, dann brauchst du keine 
CPU-Zeit mehr. Denn der Kernel gibt dir erst wieder CPU-Zeit wenn daten 
ankommen. Dein Programm ist also in der Zeit nicht aktiv sondern liegt 
nur im RAM rum.

von Konrad S. (maybee)


Lesenswert?

Der Prozessor wartet nicht, bis er aus einer Schnittstelle ein Byte 
rauspopeln kann. Die Schnittstelle teilt die Verfügbarkeit von Daten per 
Interrupt mit und der Prozessor reagiert darauf. Wenn der Prozessor grad 
garnichts zu tun hat, dann legt er sich schlafen und spart Strom.

von Seb (Gast)


Lesenswert?

Peter II schrieb:
> Seb schrieb:
>> Naja, aber wenn das Programm jetzt z.B. aus einem Socket versucht zu
>> lesen und noch keine Daten da sind, ist das doch eine blockierende
>> Aktion, sprich ich bin doch noch immer im Programm, bzw. in der
>> System-Routine.
>
> du bist immer im Programm, sonst währe ja das Programm beendet.
>
> Wenn du in der Systemfunktion Read blockierst, dann brauchst du keine
> CPU-Zeit mehr. Denn der Kernel gibt dir erst wieder CPU-Zeit wenn daten
> ankommen. Dein Programm ist also in der Zeit nicht aktiv sondern liegt
> nur im RAM rum.

Aber was verstehst du unter blockieren? Ich versteh unter einer 
blockierenden Operation, das sie den Programmablauf stoppt durch eine 
Schleife oder aus Systemsicht eine Routine die das Programm erst mal bei 
Seite schiebt.
Ich meine ich versteh den Begriff CPU-Zeit irgendwie immer noch nicht so 
richtig. Also ist das jetzt einfach die Zeit, wo das Programm vom 
Prozessor auch aktiv gerade ausgeführt wird, sprich laufend scheduled 
ist? Und die reale Zeit die, bis das Programm fertig durchgelaufen ist?

von Seb (Gast)


Lesenswert?

Peter II schrieb:
> Seb schrieb:
>> Diese Summe ist praktisch immer niedriger als die gesamte Laufzeit
>> des Programms, da dieses selbst bei intensiver Nutzung kaum pausenlos
>> Befehle an den Prozessor sendet.
>
> das dürfte aber nicht stimmen. Man kann auch ein 5min 12min CPU zeit
> verbrauchen. Dann wenn man mehr als eine CPU nutzt. (Threads).

Das ist aber was anderes, weil während dieser Zeit "echt-parallel" 
gearbeitet wird und von daher praktisch Nebeneinander ausgeführt wird. 
Ich glaube es geht da weniger um die CPU-Auslastung, weil du da recht 
mit hast, aber das währe dann CPU-Zeit im Rahmen von Multitasking.

von Seb (Gast)


Lesenswert?

Seb schrieb:
> Peter II schrieb:
>> Seb schrieb:
>>> Diese Summe ist praktisch immer niedriger als die gesamte Laufzeit
>>> des Programms, da dieses selbst bei intensiver Nutzung kaum pausenlos
>>> Befehle an den Prozessor sendet.
>>
>> das dürfte aber nicht stimmen. Man kann auch ein 5min 12min CPU zeit
>> verbrauchen. Dann wenn man mehr als eine CPU nutzt. (Threads).
>
> Das ist aber was anderes, weil während dieser Zeit "echt-parallel"
> gearbeitet wird und von daher praktisch Nebeneinander ausgeführt wird.
> Ich glaube es geht da weniger um die CPU-Auslastung, weil du da recht
> mit hast, aber das währe dann CPU-Zeit im Rahmen von Multitasking.

EDIT: sorry, ich meine im Rahmen von Multithreading!!!

von Seb (Gast)


Lesenswert?

Konrad S. schrieb:
> Der Prozessor wartet nicht, bis er aus einer Schnittstelle ein
> Byte
> rauspopeln kann. Die Schnittstelle teilt die Verfügbarkeit von Daten per
> Interrupt mit und der Prozessor reagiert darauf. Wenn der Prozessor grad
> garnichts zu tun hat, dann legt er sich schlafen und spart Strom.

Ja aber der Prozessor wird wohl kaum bei jedem einzelnen Byte das 
laufende Programm unterbrechen, sondern eher Paketweise etc. je nachdem 
wie die Schnittstelle das regelt...

Und das empfangen ist eine Sache aber nur weil das System weis das die 
Daten da sind weis das das Programm noch lange nicht, bis das System die 
Daten weiter gibt.

von Reinhard Kern (Gast)


Lesenswert?

Seb schrieb:
> aber nur weil das System weis das die
> Daten da sind weis das das Programm noch lange nicht, bis das System die
> Daten weiter gibt.

Wenn du eine Taste von der Tastatur einlesen willst, ist entweder schon 
eine verfügbar oder der Scheduler merkt sich das und schaltet sofort auf 
einen anderen Thread um.

Zu deinem Programm schaltet er erst wieder zurück, wenn eine Tastendruck 
verfügbar ist. Deine Frage stellt sich also garnicht - dein Programm ist 
sozusagen bewusstlos, solange keine Taste gedrückt wurde, wenn es ins 
Leben zurückkehrt ist auch die Taste da. Den Programmzustand warten auf 
eine Taste gibt es garnicht. Den kannst du zwar in dein Programm 
reinschreiben, aber das Betriebssystem sorgt dafür, dass die 
Warteschleife nie ausgeführt wird.

Gruss Reinhard

von Seb (Gast)


Lesenswert?

Reinhard Kern schrieb:
> Den Programmzustand warten auf
> eine Taste gibt es garnicht. Den kannst du zwar in dein Programm
> reinschreiben, aber das Betriebssystem sorgt dafür, dass die
> Warteschleife nie ausgeführt wird.
>
> Gruss Reinhard

Klar gibt es den, hier:
http://de.wikipedia.org/wiki/Prozess_(Informatik)#Prozessmodell

von Reinhard Kern (Gast)


Lesenswert?

Seb schrieb:
> Klar gibt es den

Verstehst du es nicht oder willst du es nicht verstehen? Ein Process im 
Zustand wait läuft eben NICHT - keiner von deinen Befehlen wird 
ausgeführt.

Aber ich klinke mich hier aus, sinnlos jemandem was zu erklären, der 
überzeugt ist, dass er das besser weiss.

Gruss Reinhard

von Seb (Gast)


Lesenswert?

Reinhard Kern schrieb:
> Seb schrieb:
>> Klar gibt es den
>
> Verstehst du es nicht oder willst du es nicht verstehen? Ein Process im
> Zustand wait läuft eben NICHT - keiner von deinen Befehlen wird
> ausgeführt.
>
> Aber ich klinke mich hier aus, sinnlos jemandem was zu erklären, der
> überzeugt ist, dass er das besser weiss.
>
> Gruss Reinhard

Habe ich je das Gegenteil behauptet? NEIN... meine fresse...

von Seb (Gast)


Lesenswert?

> Habe ich je das Gegenteil behauptet? NEIN... meine fresse...

Nur so wie du es formuliert hast, wirkte das so als würdest du behaupten 
wollen, das das Betriebssystem den Prozess eben gerade nicht beiseite 
schiebt, wenn es Ressourcen anfordert, die aber noch nicht vorhanden 
sind!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.