André Mantz: Fragen zu PIPE, SLEEP und KILL

Hallo zusammen,

ich probiere gerade ein Chat-Modul unter Perl zu entwickeln. Hierbei habe ich mir den Ansatz überlegt, dass jeder User einen Prozess startet, der in einer Tabelle nachsieht, wer noch gerade online ist und welche ProzessID´s die anderen haben.

Schreibt nun jemand etwas, soll das geschriebene über eine PIPE an alle anderen übergeben werden, die es dann ausgeben können.

Dazu habe ich jetzt folgende Fragen:

1. In SelfHTML ist zwar beschrieben, wie ich einen (bzw. 2) Pipes aufmache, dann den Prozess forke und somit Eltern- und Kindprozess kommunizieren können. Wie kann ich denn eine Pipe zwischen zwei Prozessen aufmachen, die von unterschiedlichen Usern gestartet wurden?

2. Solange niemand etwas schreibt, sollen die wartenden Prozesse möglichst wenig Prozessorlast verursachen. Wie sieht das mit SLEEP aus? Wieviel Prozessorlast erzeugt ein Prozess, der mit SLEEP schlafen gelegt wurde? Gibt es eine bessere Möglichkeit als SLEEP?

3. Wenn ich einen Prozess mit SLEEP() auf Dauer schlafen lege, kann ich ihn dann mittels KILL(ALARM, PID) von einem anderen Prozess auch wieder aufwecken?

Ich hoffe, die Fragen waren jetzt nicht zu Anfängerhaft, aber ich kenne mich zwar mittlerweile recht gut mit Perl aus, habe aber bisher noch nichts mit Prozesskommunikation auf Unix-Systemen zu tun gehabt.

Danke für Eure Hilfe

Gruß, André

  1. Hallo André,

    ich probiere gerade ein Chat-Modul unter Perl zu
    entwickeln. Hierbei habe ich mir den Ansatz überlegt,
    dass jeder User einen Prozess startet, der in einer
    Tabelle nachsieht, wer noch gerade online ist und welche
    ProzessID´s die anderen haben.

    Da wird das System aber sehr schnell sehr langsam.

    Schreibt nun jemand etwas, soll das geschriebene über eine
    PIPE an alle anderen übergeben werden, die es dann
    ausgeben können.

    Oha... warum laesst du die Verwaltung nicht durch einen
    Server-Prozess machen?

    1. In SelfHTML ist zwar beschrieben, wie ich einen
      (bzw. 2) Pipes aufmache, dann den Prozess forke und somit
      Eltern- und Kindprozess kommunizieren können. Wie kann ich
      denn eine Pipe zwischen zwei Prozessen aufmachen, die von
      unterschiedlichen Usern gestartet wurden?

    So einfach gar nicht. Dafuer gibt es Unix Domain Sockets,
    IO::Socket::UNIX ist eine Abstraktion in Perl.

    1. Solange niemand etwas schreibt, sollen die wartenden
      Prozesse möglichst wenig Prozessorlast verursachen. Wie
      sieht das mit SLEEP aus? Wieviel Prozessorlast erzeugt ein
      Prozess, der mit SLEEP schlafen gelegt wurde?

    Das haengt von der Architektur und der Plattform ab. Unter
    MacOS (bis 9, MacOS X weiss ich nicht) war sleep als busy
    wait implementiert, sprich, der Prozess wurde in eine
    Event-Schleife geschickt. Unter Windows, Linux und BSD ist es
    ueblich, den Prozess wirklich auch schlafen zu schicken,
    sprich, er braucht keinerlei CPU-Zeit mehr -- bis zum
    naechsten Signal, sei es SIGALRM oder ein beliebiges anderes.

    Gibt es eine bessere Möglichkeit als SLEEP?

    Bei deiner Architektur nicht, nein. Bei einer
    Client-Server-Architektur wuerde ich select() benutzen, die
    entsprechende Perl-Abstraktion ist IO::Seleckt. Ein Prozess
    im POLL-Modus braucht normal auch keine CPU-Zeit.

    1. Wenn ich einen Prozess mit SLEEP() auf Dauer schlafen
      lege, kann ich ihn dann mittels KILL(ALARM, PID) von einem
      anderen Prozess auch wieder aufwecken?

    Ja. sleep() dauert nur bis zum naechsten Signal (oder auch
    ewig, falls kein Signal geschickt wurde). Der Return-Wert ist
    dann die Zeit, die der Prozess geschlafen hat.

    Ich an deiner Stelle wuerde einen Server schreiben
    (meinetwegen auch in Perl), der die Verwaltung der
    Nachrichten, User, Raeume etc. uebernimmt. Die
    Client-Prozesse wuerde ich sehr, sehr klein halten (und
    deshalb auch in C schreiben). Die muessen ja nichts anderes
    tun als das auszugeben, was vom Server kommt und das an den
    Server zu schicken, was aus einer beliebigen Quelle kommt.
    So ist dein System weniger anfaellig; wuerde fuer jeden
    Client ein grosser Prozess gestartet, der im Grunde alle
    Verwaltungs-Aufgaben immer wieder machen muss, dann waere das
    System sehr schnell an seinen Grenzen.

    Gruesse,
     CK