Hallo,
schon seit langer Zeit können die CPUs in PCs Gas geben, oder Gas raus
nehmen, was man z.B. bei WinXP im Task-Manager -> Systemleistung ->
CPU-Auslastung sehen kann.
Muss das Gas geben bzw. das Gas raus nehmen explizit programmiert werden
(z.B. rechenintensives Unterprogramm = Vollgas, Warten auf ein Ereignis
im Main-Loop im Standgas), oder erkennt der PC von selber, wann er Gas
geben muss?
Vielen Dank schon mal im Voraus für die Infos.
Herbert H.
Kloni schrieb:> Muss das Gas geben bzw. das Gas raus nehmen explizit programmiert werden> (z.B. rechenintensives Unterprogramm = Vollgas, Warten auf ein Ereignis> im Main-Loop im Standgas), oder erkennt der PC von selber, wann er Gas> geben muss?
Ja, wobei der PC selbst entscheidet, wenn er Gas wegnimmt. bspw. weil
ihm zuheiss wird.
https://de.wikipedia.org/wiki/Throttling
Kloni schrieb:> Warten auf ein Ereignis> im Main-Loop im Standgas)
Die Steuerung macht der Taskmanager. Wenn du mit "dirty waits" wartest
wird nicht runtergetaktet und der Task rennt mit 100%. Wenn du dem
scheduler die Kontrolle übergibst wird auch entsprechend runter getaktet
bzw. die CPU-Last sinkt entsprechend.
> mit "dirty waits" wartest
Das scheint die bevorzugte Methode der Webf1ckler zu sein.
Kaum ist Javascript an, läuft der Lüfter auf Hochtouren.
Mein Trost: Es gibt genug Bäume in Deutschland.
Kloni schrieb:> oder erkennt der PC von selber, wann er Gas> geben muss?
Windows ist etwas cleverer designt. Alle Programme (außer Console)
haben eine grundlegende Schleife für Messages:
1
while(GetMessage(&Msg,NULL,0,0)>0)
2
{
3
TranslateMessage(&Msg);
4
DispatchMessage(&Msg);
5
}
Und das GetMessage() blockiert wenn keine Message vorhanden ist. Damit
weiss der Scheduler das Dein Programm (genauer der Message Thread)
gerade keine CPU Zeit benötigt.
Komplizierter wird es bei zusätzlichen Threads - da gäbe es
Wartefunktionen wie Sleep() oder WaitForSingleObject(),
WaitForMultipleObjects().
Kloni schrieb:> schon seit langer Zeit können die CPUs in PCs Gas geben, oder Gas raus> nehmen, was man z.B. bei WinXP im Task-Manager -> Systemleistung ->> CPU-Auslastung sehen kann.
XP zeigt nur die Auslastung, spätere Versionen auch die sich heute immer
wieder ändernde Taktfrequenz. Auslastung ohne Taktfrequenz ist nur die
halbe Miete.
> Muss das Gas geben bzw. das Gas raus nehmen explizit programmiert werden> (z.B. rechenintensives Unterprogramm = Vollgas, Warten auf ein Ereignis> im Main-Loop im Standgas), oder erkennt der PC von selber, wann er Gas> geben muss?
Eine einfache Mainloop ist Dauer-Vollgas. Wenn du Luft rauslassen
willst, dann baust du dort ein sleep() ein. Dann wird dieser Thread dort
inaktiv und das Betriebssystem weiss es und nutzt es aus. Nicht so viel
anders als ein Mikrocontroller, der dann einpennt und Strom spart.
Das gleiche geschieht auch, wenn das Programm in einem anderen
Systemaufruf wartet, z.B. auf eine GUI-Event, oder ein Stück von einem
File.
A. K. schrieb:> Eine einfache Mainloop ist Dauer-Vollgas. Wenn du Luft rauslassen> willst, dann baust du dort ein sleep() ein.NEIN. Das ist zwar schon viel besser als eine busy loop, aber nicht
wirklich gut. Die verwendung von Sleep() zeigt eigentlich nur eins: der
Herr Programmierer ist nicht in der Lage, ein ereignisgesteuertes
Programm korrekt zu implementieren...
Das kommt darauf an: Einige fahren auch mit Schweröl. Bei anderen muss
man einen Zahn zulegen oder ein paar Kohlen oder Holzscheite nachlegen.
Alles etwas aufwendigere Mechanismen. Schweröl z.B. muss erwärmt werden,
sonst geht es gar nicht durch die Leitungen.
:-)
Bevor das allseits beliebte Hauen und Stechen losgeht:
Hauptärgernis ist (wie von NoJS schon beschrieben) das Internet. Bei
immer mehr Seiten sehe ich die doppelte Stromaufnahme und dann läuft der
Staubsauger und ich heize die Wohnung :-( Selbst wenn auf der Seite
nichts passiert. Oft kann man sogar den Browser minimieren, die CPU
bleibt auf Vollgas. Man muss erst die entsprechende Seite (den Tab)
schließen, damit die CPU vom Gas geht.
Hier im Forum ist dies übrigens super gelöst: Nur solange die Seite
geladen bzw. aufgebaut wird, sehe ich Vollgas. Beim Lesen oder Tippen
sehe ich ausschließlich Standgas.
Dann sind es ältere Programme z.B. aus der Win98 Ära, die Laufen vom
Start an auf Vollgas, auch minimiert. Nur ein Programm ist so
intelligent, dass es minimiert vom Gas geht. Neuere Programme geben nur
Vollgas, wenn wirklich Arbeit anliegt. Arbeit beendet, dann Standgas.
Sehe ich auch an der Leistungsanzeige, die hier beim Notebook zwischen
15 und 30 Watt schwankt.
Kann man nur Vollgas und Leerlauf programmieren, oder gibt es auch
Zwischenstufen?
Bei den heute üblichen Quadcore-CPUs bedeutet dieses „Vollgas“ aber auch
nur ein Viertel der maximalen Last. Evtl. noch etwas mehr wegen
Turbotakt für diesen einen Kern.
c-hater schrieb:> Die verwendung von Sleep() zeigt eigentlich nur eins: der Herr> Programmierer ist nicht in der Lage, ein ereignisgesteuertes Programm> korrekt zu implementieren...
Oder dass die SW etwas komplexer ist als auf Anfragen zu reagieren.
SPS-Loop das ne Event-loop haben beide ihre Berechtigung. Rein
ereignisgesteuert ist eher was für nieschen.
> Hauptärgernis ist (wie von NoJS schon beschrieben) das Internet.
Mann kann JS auch einfach ausschalten.
Bei "reinen" Nachrichtenseiten hält sich der Bequemlichkeitsverlust
in Grenzen.
Erspart einem nebenbei auch jede Menge S.P.A.M. und närfige
"Die Seite wurde aktualiest"-Meldungen.
Am einfachsten geht das mit 2 Browserinstanzen.
Einer mit aktiviertem JS und einer ohne.
NoJS schrieb:> Mann kann JS auch einfach ausschalten.> Bei "reinen" Nachrichtenseiten hält sich der Bequemlichkeitsverlust> in Grenzen.
Da hat sich scheinbar was geändert. Bei früheren Versuchen las ich auf
vielen Seiten die Meldungen: Schalten Sie gefälligst JS ein ...
Werde JS mal ausgeschaltet halten und schauen was geht.