CPU-Auslastung bei ~50% durch einen Thread



  • Servus,

    ich habe innerhalb eines Threads, der nicht per Sleep aufgehalten wird eine Auslastung von rund 50% innerhalb meiner while Schleife - auch wenn ich jeglichen Inhalt entferne.
    Ist das normal? Kann ich dagegen etwas tun?

    Adde ich selbst ein Sleep(1) liegt die CPU-Auslastung bei lässigen 5%...
    Brauch ich generell ein Sleep?

    Grüße,
    Jöran



  • Was verstehst du unter Auslastung? Was ist es fuer eine CPU? Ist Hypertreading aktiviert?



  • Ich verstehe das Problem auch nicht.

    Wenn Du in einem Thread eine leere while-Schleife laufen lässt, dann macht die zwar nichts, aber auch die Schleife sekbst verbraucht Rechenzeit. Ein Kern wird dabei zu 100 Prozent ausgelastet.



  • Brauch ich generell ein Sleep?

    Nein. Du musst erstmal verstehen wie Computer funktionieren.



  • Ist eine 2-Kern CPU.
    Wie finde ich das raus, ob Hyperthreading aktiviert ist?

    Ich mein die zusammengefasste CPU-Auslastung im Task Manager. Hast schon recht. Eine CPU läuft auf 100%.

    Hilf mir doch bitte dabei, zu verstehen wie das Ding funzt. Ich würde es nämlich gern optimieren.

    Vielen Dank



  • Jöran schrieb:

    Servus,

    ich habe innerhalb eines Threads, der nicht per Sleep aufgehalten wird eine Auslastung von rund 50% innerhalb meiner while Schleife - auch wenn ich jeglichen Inhalt entferne.
    Ist das normal?

    Vollkommen. Unter

    while(isTrue())
     ;
    

    Versteht die CPU:

    LABEL: if (isTrue())
      goto LABEL;
    

    Sprich: die testet andauernd isTrue(), springt, testet, springt, testet, springt, testet, spring, testet, springt..... ohne Unterbrechung, d.h. natuerlich sind das 100% Auslastung.

    Kann ich dagegen etwas tun?
    

    Den Thread "schlafen legen":

    • Sleep am Schleifenende
    • Mutex/Semaphore wenn der Thread nicht gebraucht wird


  • Jöran schrieb:

    Ist eine 2-Kern CPU.
    Wie finde ich das raus, ob Hyperthreading aktiviert ist?

    Ich mein die zusammengefasste CPU-Auslastung im Task Manager. Hast schon recht. Eine CPU läuft auf 100%.

    Also du hast 2 Arbeiter. Dem einen gibst du Arbeit und er ist zu 100% beschaeftigt. Der andere langweilt sich und ist zu 0% beschaeftigt. Das macht im Mittel ... tataa ... 50% Beschaeftigung. Die Frage lautet also: Wie kann ich den anderen Arbeiter auch zu 100% beschaeftigen? Aber vorher solltest du den Rat von hustbaer beherzigen.



  • knivil schrieb:

    Die Frage lautet also: Wie kann ich den anderen Arbeiter auch zu 100% beschaeftigen?

    Ich bin mir gar nicht sicher, ob das wirklich die Frage ist. Ich schätze Jöran will einfach nur die Auslastung reduzieren. Wahrscheinlich sollte er einfach Polling durch Mutex + Wait + Notify ersetzen.

    Jöran: Wenn Du nichts zu tun hast, solltest Du dem Betriebssystem das auch signalisieren. Dann teilt das OS Deinem Thread keine CPU-Zeit mehr zu. Wenn Du auf eine bestimmte Bedingung wartest, solltest Du Thread A auf eine Art und Weise schlafen legen, so dass ein anderer Thread B den Thread A wieder aufwecken kann, wenn die Bedingung erfüllt ist. sleep benutzt man dafür aber selten. Threading-Bibliotheken bieten dafür Mutexes und Bedingungsvariablen an.


Anmelden zum Antworten