Hallo,

Grüße
Erik
Wie kommst du darauf das mein System X-fach langsamer sei? Ich meine wir gehen einfach mal davon aus, dass alle Daten in die Pipe passen ohne das der Writer warten muss, das die Daten wieder daraus gelesen werden.Das Problem ist IMHO das die Daten dafür schon 2 mal kopiert werden müssen (einmal rein in die Pipe und einmal raus).
Im normal Fall läuft es doch so ab, du allokierst einen Speicherbereich für deinen Buffer für eine Nachricht, kopierst die erforderlichen Sachen in den Buffer rein und machst einen Syscall das du eine Nachricht versenden willst. Die Nachricht wird dann in einen Buffer im Kernel kopiert (dieser muss auch vorher allokiert werden, was bei dynamic-size Msgs unter Umständen ne "Weile" dauern kann).So läuft es nur ab wenn der Empfänger die Nachrichten selber aktiv abholen muss (Du also selber zur Post hinlaufen musst), wenn die Nachrichten aber zugestellt werden (also der Postbote zu Dir kommt und auch automagisch das exakt passende Transportbehältnis hat) dann gibt es dieses Problem nicht.
Wenn der Empfänger dann die Nachricht abholt gibt es 2 Möglichkeiten, entweder sein Empfangsbuffer ist für die Nachricht groß genug oder er muss erstmal einen Syscall machen um zu wissen wie groß die Nachricht ist. Dann allokiert er einen Buffer und ruft nen Syscall auf, das er die Nachricht haben will. Die Nachricht wird dann aus dem Kernelbuffer in den Buffer des Clienten kopiert.
So ungefähr sollte das auf allen Systemen aussehen die asynchrones IPC zur Verfügung stellen.Das wäre sehr schade, obwohl dann hätte ich es deutlich leichter ein OS zu bauen das signifikant schneller ist als die anderen.

den Speicher, wo der Buffer drin liegt, kannst du dem Sender auch nicht einfach wegnehmen.Wer hat was von wegnehmen gesagt? Der Client verliert seinen Speicher nicht, schließlich soll ja die für ihn bestimmte Antwort dort rein.
Ich weiß das man beim synchronen IPC versucht das Kopieren zu vermeiden, aber wie will man das mit sehr großen Nachrichten anstellen?Mapping!
Weil die Nachricht müsste ja in den Kernelstack des Senders passen, damit du ihn einfach vom Kernelstack in den Userstack des Empfängers kopieren kannst.Was haben die Messages der User-Mode-Applikationen auf dem Stack vom Kernel zu suchen? Oder überhaupt auf irgendeinem Stack? Okay, tyndur legt die Messages auch auf den User-Mode-Stack und hat daher vermutlich gewisse Größenbeschränkungen, aber das tyndur-Konzept ist für synchrones IPC sicher nicht der Idealfall.
Naja, z.B. im fread müssten nicht nur Syscalls für das IPC stecken sondern auch welche für das Memory-Mapping. Ich meine das pro Vorgang mehrere (verschiedene) Syscall nötig sind, ich würde versuchen das auf so wenige wie möglich zu beschränken.Zitat von: erikAha, deswegen ein Haufen extra Syscalls für das Memory-Sharing usw?Ich verstehe nicht was du mit den extra Syscalls meinst.
Aus meiner Sicht ist das schneller/besser als wenn ich sage, das er die Daten per Msg verschickt.Das ich da anderer Meinung bin dürfte wohl mittlerweile außer Frage stehen. Kopieren ist IMHO ein unnützer Vorgang für synchrones IPC.
Wieso? kommt dem Zero-copy ziemlich nahe, bzw. ist es sogar. Das dürfte so ähnlich wie dein Konzept aussehen.Also 2 mal kopieren ist IMHO was anderes als 0 mal kopieren. Insofern kann ich auch keine Ähnlichkeit zu meinem Konzept erkennen.
ich will nicht ohne das es der Prozess weiß, in den Pagingtabellen rumfummeln.Warum nicht? In meinem Konzept wird doch auch in der LDT der Prozesse rumgefummelt wenn es dem Kernel in den Kram passt. Ich kann da kein Problem sehen.
Denn fread sagt das du den Buffer übergibst wo die Daten rein sollen und nicht das du nen Buffer zurück bekommst wo die Daten drin sind.Ganz genau! Der Client (in diesem Fall der aufrufende Code) gibt seinem Buffer dem Service (also fread) damit der Service dort was rein legt. Genau das will ich auf IPC-Ebene nachbauen. Ich würde es mir extrem unhandlich vorstellen wenn fread mir nen Pointer auf die gelesenen Daten zurück geben würde, so müsste ich immer erst noch kopieren wenn ich mehrere Häppchen einer Datei in einem zusammenhängenden Array haben will.
Du hast mich erst überzeugt das mein Konzept richtiger Mist ist, wenn ich ein besser (eventuell mit deiner HilftIch möchte Dir eigentlich nichts vorgeben, nur wenn das Konzept in Deinem Kopf gereift ist kannst Du es auch ordentlich umsetzen. Mit dem Paging kann man wunderbar Speicher von überallher nach überallhin mappen (krass, jetzt mache ich schon Werbung für Flat-Memory).) habe. Aber es sollte auch vernünftig für Paging umzusetzen sein.
Grüße
Erik

Übersicht
Wiki
Hilfe
Suche
Einloggen
Registrieren
Drucken

Gespeichert