[Betriebssysteme] Was macht eine Anwendung wenn sie nichts macht?

  • Ersteller Ersteller Green Mamba
  • Erstellt am Erstellt am
G

Green Mamba

Gast
Hallo,

zuerst einmal möchte ich erläutern dass ich diesen Thread mit Absicht im Programmieren-Forum erstellt habe, weil es prinzipiell um Programmierung geht. ;)
Angenommen ich bin eine Anwendung. :D

Was passiert wenn ich auf eine Interaktion warte? Es ist praktisch nichts zu tun außer auf eine Eingabe zu warten. Frage ich dann zyklisch alle paar ms beim Betriebssystem nach ob ein Event eingegangen ist welches mich interessiert, oder sage ich dem Dispatcher des Betriebssystems dass er mich wecken (auf den Prozessor legen) soll, wenn ein solches Event eintrifft. Warte ich also aktiv oder eher passiv?
Beispiel Qt, da wird eine sogenannte Eventloop gestartet, läuft diese durch, auch wenn ncihts passiert? Oder blockiert diese solange nichts passiert?
Genauso bei der Windows-GUI welche mit MFC gebaut wird. Gibt es da unterschiede? Es gibt ja auch Anwendungen die mit voller Prozessorlast generell in einer Endlosschleife laufen, wie z.B. Spiele. Das lässt sich aber sicherlich nicht auf alle anderen Anwendungen übertragen, oder? :o

Viele Grüße,
Mamba

PS: Ich bin mir sicher dass ich das mal wusste, bekomme es aber nicht mehr zuverlässig auf die Kette. :o
 
Green Mamba schrieb:
Was passiert wenn ich auf eine Interaktion warte? Es ist praktisch nichts zu tun außer auf eine Eingabe zu warten. Frage ich dann zyklisch alle paar ms beim Betriebssystem nach ob ein Event eingegangen ist welches mich interessiert, oder sage ich dem Dispatcher des Betriebssystems dass er mich wecken (auf den Prozessor legen) soll, wenn ein solches Event eintrifft. Warte ich also aktiv oder eher passiv?

Das kommt auf die Anwendung an :)
Unter Windows kannst du z.B. zwischen GetMessage (wenn keine Nachrichten vorhanden sind wird dein Thread blockiert bis neue Nachrichten eintreffen, also passives Warten) und PeekMessage (blockiert nie, also aktives Warten) wählen.
Welche der beiden Funtkionen von MFC und QT verwendet werden weiß ich nicht, aber ich würde mal schwer auf GetMessage tippen.
 
Also ich kann nur von der MFC (Windows GUI) sprechen. Und da gibt es einen Extra Befehl:

OnIdle(int)

Diese Funktion wird automatisch aufgerufen wenn das Programm auf eine eingabe wartet. Diese Funktionen sind dann eben um z.B. den Speicher aufzuräumen, schonmal im voraus Berechnungen machen, ...

Diese Funktion wird dann immer wieder aufgerufen und jeweils mit einem anderen Wert anhand dem du "erkennen" kannst wie lange sich das Programm schon im Idle Modus befindet (eine Größere Berechnung macht keinen Sinn bei OnIdle(1) ^^).

Man kann die Funktion immer weiter aufrufen lassen bis man einen Wert != 0 zurückgibt. IMHO wird dann der Prozess "schlafen" gelegt, also er bekommt erst wieder irgendwelche Prozessor Zeit zugesprochen bis er ein Event bekommt...


Hoffe mal das dir das weiterhilft (kann nich sonderlich gut erklären)


MFG
- booZy
 
Also heißt das, dass es von der Anwendung abhängt, und man von außen nicht erkennen kann ob aktiv oder passiv gewartet wird?
Kann man aktives Warten an der Prozessorauslastung erkennen? :confused_alt:
 
Ich denke mal mit "Aktivem Warten" meinst du wenn eine Anwendung in ihrer Idle Time etwas macht. Kann ich dir Leider nicht genau sagen, aber ich könnte mir Vorstellen das alles was in der Idle-time geamcht wird nicht allzu hohe Priorität von der Berechnung her hat (worauf ich aber nicht Wetten würde :P ).

Erkennen kannst du es sonnst noch wenn eine Anwendung aufeinmal anfängt zu Arbeiten obwohl du gar nichts machst (merke das Öfter auf der Arbeit bei Word, Excel und Co). Dann mache ich so ne halbe minute nix und auf einmal fängt der Rechner an zu Rödeln (ich habe da ned das beste ding stehen, daher merke ich das recht deutlich ;) ).

Wobei wenn ich recht überlege Lagt der rechner dann auch ein wenig rum ... daher kann es schon sein dass er entweder nur etwas geringere Priorität oder aber die gleiche Priorität wir sonnst auch dafür hat... Genau sagen kann ich es dir aber leider nicht und ausprobieren kann ich es momentan auch nicht da ich hier zu Hause momentan keinen Compiler drauf habe ... :(
 
Ich meine mit aktivem warten, dass die Anwendung zyklisch nachfragt ob ein Event eingetreten ist. Mit passivem Warten meine ich dass die Anwendung vom Betriebssystem wachgerüttelt wird, indem der Dispatcher den Prozess Prozessorzeit zuteilt. :)

Vll hatte ich mich etwas dreideutig ausgedrückt? :D

Erkennen kannst du es sonnst noch wenn eine Anwendung aufeinmal anfängt zu Arbeiten...
Das kann genausogut bedeuten dass ein Event abhängig von der Systemzeit ausgelöst wurde. :)
 
Das kann genausogut bedeuten dass ein Event abhängig von der Systemzeit ausgelöst wurde.

Okay Punkt für dich :P



Ich glaube die Anwendung fragt an sich gar nicht nach ob irgendwas für sie da ist. Meiner Meinung nach wird ihr einfach vom OS gesagt das "dieses oder jenes" passiert ist und dann kann sie selber entscheiden ob sie etwas damit anfangen kann/will oder nicht. Aber um mir da sicher zu sein habe ich bisher zu wenig mit MFC/Win API gemacht (mache eher Datenmodelle und sowas, also eher so die Sachen die im Hintergrund passieren).

MFG
- booZy
 
aktives warten sollte man eigentlich aufjedenfall an der cpuauslastung sehen. solange dein prozess rechnet wird das (zumindest unter windows, bei linux hab ich eigentlich noch nie nach der auslastung geguckt... da merkt man in der regel von auslastung eh nich viel ;)) da auch angezeigt.

qt und co. warten also ziemlich sicher passiv, den zumindest bei meinen einfachten qt anwendungen ist der idle prozess von windows in der regel so ziemlich der einzige der cpu verbraucht(abgesehen vom prozess explorer, sonst könnt ich das ja garnet nachgucken ;)).
 
Zuletzt bearbeitet:
Hmm, eigentlich sehe ich das genauso. Wir hatten uns hier halt mit ein paar Leuten Gedanken darum gemacht, ob eine Event- Prozess- oder Renderloop ständig läuft, oder eben nur dann angeschubst wird wenn ein Event passiert. :)
Aber so wie es ausschaut hängt das ganz von der konkreten Implementierung ab.

Also noch kein konkretes Problem, wird aber sicher noch zu einer konkreten Fragestellung. Ich werde mich melden wenn weitere Fragen auftauchen. Wenn noch jemand was beizusteuern hat, immer her damit. :)

Vielen Dank an euch beide bis hier her. :daumen:
 
Hi,

ich denke das ganze wird über Interrupts und Queues vom Betriebssystem bzw dem Prozess Manager gehandhabt.

Sprich, wenn du (also das Programm) auf eine Ressource zugreifen willst die schon vergeben ist landest du in einer entsprechenden Queue (also auch der Prozess angehalten) und wirst sobald die Ressource wieder frei ist zurück zu den aktiven Prozessen geholt.

So wurde uns das in der technischen Informatik beigebracht, kann natürlich auch sein das verschiedene Betriebssysteme das unterschiedlich handhaben.

mfg
 
Moin.

Wie genau das abläuft weis ich auch nicht. Weiss nur das die Alten Programmiersprachen wie QuickBasic Polling mache. Das heisst sie fragen die ganze Zeit nach ob sie irgendetwas tun sollen. Deshalb ist in den alten versionen die CPU auslastung sofort auf 100%.

Ich denke deshalb das neure Programmiersprachen wie C++, Java, C# usw das vom Prozesser gesagt bekommen das sie etwas tun sollen.

MFG
tewes
 
Das hängt eigentlich von der Art der Programmierung ab, sollte aber mit ereignisgesteuerter Programmierung aus der Welt geschaffen sein. Wenn bei dem Programm keine Ereignisse auftreten, dann bekommt es halt auch kaum CPU-Zeit (das ist übrigens auch der Grund, warum ich es nicht verstehen kann, wieso manche Leute meinen, dass das Schließen von z.B. Notepad einen Geschwindigkeitsvorteil beim Spielen bringen könnte...). Wenn das Programm aber unabhängig davon permanent andere Rechenoperationen durchführt, dann bekommt es natürlich CPU-Zeit zugewiesen - allerdings macht es dann keinen Sinn von "auf Eingaben warten" zu sprechen, scheinbar ist das Programm ja ausgelastet.

Ob die Runtimes intern permanent prüfen, ob irgendwelche Ereignisse für eine Anwendung vorliegen, spielt eigentlich keine große Rolle, da so gut optimiert dass das nicht ins Gewicht fällt.
 
Wenn es um Softwaredesign geht, sehe ich eine defensive Programmierung als vorteilhaft an. Sprich das warten auf einen Event ist einem aktiven Polling auf jeden Fall vorzuziehen.

Es kann auch der schnellere Ansatz sein. Schliesslich verliert man bei einem aktiven Polling immer Zeit bis die Daten verarbeitet werden können.
Angenommen der Polling Takt liegt bei 10ms, der Event tritt aber nach 15ms auf, findet die Verarbeitung der Daten erst 5ms später statt. Obwohl sie auch früher hätte stattfinden können.

Beim warten auf einen Event, kommt dann eben noch die Verzögerung durch das OS hinzu bis der Event signalisiert wird und der Task/Prozess aktiviert ist. Die Daten würden in dem obigen Beispiel dann aber bereits ca. 1ms nach eintreffen der Daten verarbeitet werden.

Dabei spielt aber auch das Lastverhalten der Daten eine Rolle. D.h. wie oft kommen die Daten und in welchem Rhytmus. Zuviele Events können ein System auch lahmlegen.

Von Anwendungen die 100% CPU Last erzeugen halte ich persönlich nicht viel. Schliesslich ist damit der Rechner dann lahmgelegt.

Unter Windows wird normalerweise auf ein Event gewartet (GetMessage). Das beste Negativ Beispiel ist aber auch der Windows Explorer, wenn er z.B. auf einen inaktive Netzwerkfreigabe wartet. Damit ist der ganze Explorer lahmgelegt, weil sich die Programmierer eben den Aufwand für einen separaten Thread gespart haben.

MfG

Arnd
 
Zurück
Oben