Hallo,
Einen expliziten Flush empfinde ich als unnötig weil ja jede geschriebene Message (durch den Send-Syscall) auch möglichst schnell zugestellt wird, der Kernel wartet nicht bis eine Menge X in der Pipe ist, das ergibt keinen Sinn.
Grüße
Erik
Zu deiner Pipe. WowDanke.
Gutes Bsp. wie sehr es vom Betrachter abhängt, ob etwas einfach oder kompliziert ist.Wieso, was genau empfindest Du an meiner Idee kompliziert?
Die Lese-/Schreibpointer hätte ich aber schon den Prozessen überlassen, weil nen Sicherheitsgewinn hast du dadurch das du es in den Kernel packst auch nicht, weil der Prozess sich ja nicht dran halten muss.Es geht dabei auch nicht um Sicherheit sondern darum das der Kernel dem Writer quasie einen Bereich in der Pipe zusichert und der Writer diesen Bereich ungestört füllen kann ohne auf andere Threads im selben Prozess Rücksicht nehmen zu müssen (es bedarf dafür keiner weiteren Synchronisation o.ä. und trotzdem können mehrere Threads parallel Messages in diese Pipe stellen). Das der Kernel in meinem Vorschlag immer gleich die halbe Pipe zusichert ist dafür aber etwas doof, hier wäre es eventuell geschickter wenn der Empfänger beim Create-Syscall auch die maximale Message-Größe vorgibt so das auch mehr als 2 Threads im Writer die Pipe befüllen können (falls das Verhältnis Pipe-Größe:maximale Message-Größe mehr als 2:1 beträgt). Diese Zusicherung gilt immer solange bis sie durch einen Send-Syscall benutzt wird (das übrig bleibende Stück kann dann wieder neu zugesichert werden) oder beim Wait-Syscall (da hier ja die vorangegangene Zusicherung durch den Kernel nicht groß genug war). Dem Wait-Syscall kann auch NULL übergeben werden so das nur eine neue Zusicherung mit einer gewissen Mindestgröße angefordert wird (damit ein weiterer Thread im Writer-Prozess an diesem Spiel mitmachen kann), die Mindestgröße könnte aber auch 0 sein so das nur eine vorhandene Zusicherung zurückgegeben wird. Die Zusicherung die vom Wait-Syscall kommt sollte auch nicht größer sein als die angeforderte Größe (der entsprechende Writer-Thread fordert ja schließlich X Bytes weil er genau weiß was er senden möchte) um die Pipe möglichst effizient nutzen zu können.
Einen expliziten Flush empfinde ich als unnötig weil ja jede geschriebene Message (durch den Send-Syscall) auch möglichst schnell zugestellt wird, der Kernel wartet nicht bis eine Menge X in der Pipe ist, das ergibt keinen Sinn.
Da komme ich nicht mit, wieso und wofür Double-Buffering?Wenn Du eine Pipe immer ganz voll machst dann kann immer nur entweder der Writer oder der Reader arbeiten aber nie beide gleichzeitig. Deswegen würde ich die maximale Message-Größe deutlich kleiner ansetzen als die Größe der Pipe. Wenn beide parallel (auf unterschiedlichen CPUs) arbeiten können dann muss im Idealfall nie einer blockieren. Diese Idee ist eigentlich von Dir und die erscheint mir auch sehr nützlich in so einem Szenario.
Grüße
Erik

Übersicht
Wiki
Hilfe
Suche
Einloggen
Registrieren
Drucken

Gespeichert



