Warteschleifen und Stromverbrauch auf modernen IBM kompatiblen PCs?



  • Wie wird das in C oder C++ heute eigentlich gemacht?

    Wenn das Programm warten soll, aber die CPU in einen Stromsparmodus fahren soll.
    Macht das die Hardware intern oder muß das softwareseitig entsprechend programmiert werden?
    Z.B. durch Aufruf von entsprechenden OS Funktionen?

    Und wenn das Softwareseitig erledigt werden muß, inwiefern werden davon alte Programme, die dem Benutzer nur als Binary vorliegen, beeinflußt?
    Nutzen die z.B. eine Funktion des OS, so daß es nur auf das OS und seine Funktionsimplementierung ankommt?



  • Man ruft Sleep oder sleep vom Betriebssystem auf. Das kümmert sich um den Rest.

    Zum Beispiel, wenn ich das richtig verstanden habe, daß immer in Thread dran ist und sei es zur Not, wenn kein anderer will, der sogenannte Idle-Thread, der sinnigerweise auch eine voll niedrige Priorität hat. Gewechselt und geweckt wird das BS immer über Interrupts von irgendwelchen Uhren. Und der Idle-Thread fährt inzwischen keine Endlosschleife mit for(;;) mehr, sondern rennt auf einen hlt-Befehl, der die CPU supi stomsparig macht, und aus dem auch nur per Interrupt wieder geweckt werden kann.

    An meinem Rechner hab ich so einen Stromverbrauchsmesser angeschlossen. Der braucht auch echt deutlich unterschiedlich viel Strom, je nachdem, wieviel gerade gerechnet wird.



  • Ist sleep Platformunabhängig oder OS spezifisch?

    Ist es Teil des C/C++ Standards bzw. der STD?



  • Ok, habe gerade gefunden das sleep Teil der C Library ist.

    Aber warum gibt er das Hallo nicht vor Sleep aus?

    #include <stdio.h>
    #include <unistd.h>
    
    int main()
    {
      unsigned int i = 10;
      printf("Hello!\n");
      sleep(i);
    
      printf("Und Tschüß!");
      return 0;
    }
    


  • Proggen & Stromverbra schrieb:

    Ist sleep Platformunabhängig oder OS spezifisch?
    Ist es Teil des C/C++ Standards bzw. der STD?

    Plattformabhängig.
    Windows: Sleep(millisekunden)
    Linux und alles andere, was ich ernst nehme: sleep(sekunden) und evtl usleep(mikrosekunden)
    DOS: delay(millisekunden)//vermutlich NICHT Stromsparend.

    Sie sind nicht im C- oder C++-Standard. Aber man kann erwarten, daß jedes PC-Betriebssystem sowas hat. Da könnte man wiedermal ein wenig #ifdef benutzen.

    #ifdef __WIN32
    #include <windows.h>
    inline void sleep(int sekunden){
       return Sleep(sekunden*1000);
    }
    #else
    #include <unistd.h>
    //da gibt es auch sleep(int sekunden) drin
    #endif
    


  • Proggen & Stromverbra schrieb:

    Aber warum gibt er das Hallo nicht vor Sleep aus?

    Tut er bei mir.
    Vielleicht hast Du eine anderes Terminal oder anderes printf oder stdout, das nicht bei '\n' flusht?
    Dann würde nach dem printf vielleicht ein fflush(stdout); abhelfen. Kann ich mir aber kaum vorstellen.

    Bei mir steht in der Hilfe

    man stdout schrieb:

    The stream stderr is unbuffered. The stream stdout is line-buffered
    when it points to a terminal. Partial lines will not appear until
    fflush(3) or exit(3) is called, or a newline is printed.

    und

    man stdout schrieb:

    Note that in case stdin is
    associated with a terminal, there may also be input buffering in the
    terminal driver, entirely unrelated to stdio buffering.

    Dann hilft wohl nur, eine funktionierendes Terminal zu besorgen.



  • volkard schrieb:

    Proggen & Stromverbra schrieb:

    Aber warum gibt er das Hallo nicht vor Sleep aus?

    Tut er bei mir.
    Vielleicht hast Du eine andere Konsole oder anderes printf, das nicht bei '\n' flusht?
    Dann würde nach dem printf ein fflush(stdout); abhelfen. Kann ich mir aber kaum vorstellen.

    Ach so, es lag an dem \n.

    Im Code habe ich das zwar später hinzugefügt und dann hier gepostet, aber in meinem letzten compilierten Binary hatte ich es noch nicht drin.

    Bei so etwas wird erst gewartet und dann wird der gesamte Text ausgegeben:

    #include <stdio.h>
    #include <unistd.h>
    
    int main()
    {
      unsigned int i = 10;
      printf("Hello!");
      sleep(i);
    
      printf("Und Tschüß!");
      return 0;
    }
    

    Hier müßte dann, wie du schreibst, der Aufruf von fflush helfen.
    Werde ich mal testen.



  • Proggen & Stromverbra schrieb:

    Ist sleep Platformunabhängig oder OS spezifisch?

    Ist es Teil des C/C++ Standards bzw. der STD?

    Mit C++0x schon.

    std::this_thread::sleep ist es, wenn ich mich nicht irre.



  • volkard schrieb:

    Linux und alles andere, was ich ernst nehme: sleep(sekunden) und evtl usleep(mikrosekunden)

    👍



  • 314159265358979 schrieb:

    volkard schrieb:

    Linux und alles andere, was ich ernst nehme: sleep(sekunden) und evtl usleep(mikrosekunden)

    👍

    Nein, ich wollte nicht Windows flamen.
    Ich wollte nur nicht vier BSDs und weitere 13 Derivate aufzählen müssen.



  • Mist 😃


Anmelden zum Antworten