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?
- 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.
- 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.
- 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