Linux looping a process without heavy load



  • Hey,
    ich möchte unter Linux einen Process bzw. eine Applikation ohne GUI erstellen der unendlich läuft (bis ich ihn halt kille).
    Der Process soll nichts tun bis er eine Nachricht bekommt die er abarbeiten muss. Danach soll er wieder chillen.

    Eine simple Möglichkeit wäre das hier:

    main(){
        MyReceiver myRec = /*... */ ;
    
        while(true){
    
           Sleep(1);
    
          if(myRec == NewData){
             //do stuff here
           }
        }
    }
    

    Jedoch ist es in diesem Fall ja so, dass die CPU dann die ganze Zeit zugeballert wird, obwohl der Prozess nichts tut außer schlafen. Ist das korrekt? Wenn ich jetzt nur einen solcher prozesse hätte wäre das eventuell kein Problem, aber wenn ich jetzt 10 oder 30 von solchen Prozessen hätte dann würde die CPU die ganze Zeit unter Last laufen obwohl die Processe ja in der meisten Zeit nichts tun sondern auf NewData warten.

    Jemand eine Idee wie man sowas löst? Eventuell mit Callbacks oder Signals?

    Danke für DIe Hilfe

    Grüße
    Denis



  • Warum kannst du nicht an der Stelle warten, an der die Daten geliefert werden (read oder welche Funktion auch immer benutzt wird)?

    Prinzipiell ist das aber eher kein C++ Problem sondern eine Frage des APIs Betriebssystems.



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum Linux/Unix verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Wenn Daten geliefert werden sollen sie ja verarbeitet werden. Ich versuche mehr ins Detail zu gehen.

    Ich habe drei Processe die etwas Verarbeiten. Und ich habe zwei SharedMemorys wo die verarbeitetenden Daten reingeschrieben werden. Das ganze sieht so aus:

    -> schreibt
    <- liest

    P1 -> ShMem1 <- P2 -> ShMem2 <- P3

    P1 braucht 10 Sekunden um Daten zu verarbeiten.
    P2 braucht 20 Sekunden um Daten zu verarbeiten.

    Sobald P1 fertig ist schickt er die Daten nach ShMem1. Sobald neue Daten in ShMem1 ankommen soll P2 diese Daten lesen und weiterverarbeiten.
    Sobald P2 fertig ist schickt er die Daten nach ShMem2. Sobald neue Daten in ShMem2 ankommen soll P3 diese Daten lesen und ausgeben.

    Wenn P1 arbeitet macht P2 für 10 Sekunden nichts, P3 macht sogar 30 Sekunden nichts. Diese Zeit kann ich mit Sleep() überbrücken. Aber das ist nicht schön. Deshlab suche ich nach einer Alternativen.



  • Erst mal sind das Prozesse und nicht Processe.

    Dann ist so ein sleep natürlich nicht schön, aber wenn ein Prozess eben im sleep ist, verbraucht er keine CPU.

    Besser ist es natürlich, auf ein Event zu warten. Schau Dir mal Semaphoren an.


  • Mod

    Klingt eher danach, als wolle der TE die Prozesse einfach durch eine Pipe verbinden. Noch nicht einmal Pipes auf Prozessebene, sondern einfach über die Kommandozeile verbunden:

    P1 | P2 | P3
    

    Also im Prinzip das, was manni66 vorgeschlagen hat.



  • Wie sollen die Prozesse mit Daten gefuettert werden? Dementsprechend waehlst du den IPC-Mechanismus aus: http://beej.us/guide/bgipc/


Log in to reply