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.
Gut ich will mein IPC darauf aufbauen, das man selber entscheidet wann man eine Nachricht bekommen möchte, sprich das man diese selbst abholt (das ist für mich auch das ganze Konzept des recv Syscall´s).
Ich bin mir eigentlich auch sicher (du kannst mich gerne vom Gegenteil überzeugen) das z.B. Linux auch "nur" die Daten aus seinem VFS/Cache in den Client-Buffer kopiert.
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.
Ich kann nur Vermutungen anstellen, aber ich denke mal, dass du das IPC an sich überbewertest. Im Fall von z.B. Haiku liegt das komplette VFS-System im Kernel, die werden also auch nur 1x Kopieren oder den Speicher reinmappen.
Man kann natürlich sein IPC System so aufbauen das man praktisch alle Probleme damit lösen kann (wie du es machst). Da muss man dann aber abwägen was leichter ist und für wen es leichter ist. Ich würde mir nämlich nicht noch zusätzliche Komplexität in den Kernel holen wollen (á la ich mappe das dann in den Client-Buffer). Ziel eines Mikrokernels ist es doch so viel wie möglich an Aufgaben (und auch Komplexität) aus dem Kernel zu holen und in den UserSpace zu packen.
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.
Ich orientiere mich bei schnellem IPC immer am L4-Kernel. Ich habe gerade mal so ein Paper über dessen IPC System überflogen und die haben synchrones IPC mit dynamic-size Msgs. Es wird versucht so viel wie möglich einer Nachricht in den Registern zu "kopieren" (was meiner Meinung nach auf x86 nicht wirklich viel bringt, zwecks verdammt weniger Register), wirds doch mehr wird es in einen Buffer kopiert (im Kernel) und wird es wirklich viel, werden Pages in gemappt.
Soweit ich das verstanden habe, weiß der Sender aber im Prinzip wie die Nachricht versendet wird, da für längere Msgs ein wenig mehr Aufwand auf Seite des Senders betrieben werden muss, aber auch auf Seite des Empfängers.
Auch gibt es da genau das Problem, das die Nachricht nur empfangen werden kann, wenn du damit rechnest bzw. weißt wie groß die Nachricht ist, die du bekommst.
Wie das dann genau mit dem Page mapping funktionier weiß ich nicht, nur das man da eine Nachricht so senden kann, das einem der Speicher praktisch weggenommen wird (wie als wenn man ne SharedMem Region erstellt und diese dann im eigenen Prozess unmappt und an einen anderen weiterschickt).
So einen Syscall könnte ich natürlich auch machen, damit würde ich mir ein paar Kernelaufrufe ersparen, aber mal sehen.
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.
Da bin ich wieder anderer Meinung. Gut passt die Nachricht in die Register muss nicht kopiert werden, ist die Nachricht verdammt groß mappst du einfach, aber was ist mit dem was dazwischen liegt, da wo du trotz mapping kopieren musst und was für die Register zu groß ist?
Ich behaupte mal das der Großteil der versendeten Nachricht da reinfällt.
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.
Da komme ich jetzt nicht mit, wenn du mehrere Häppchen einer Datei in einem zusammenhängenden Array haben willst, dann muss doch irgendwo kopiert werden. Ob das nun fread macht oder ob du das erst nach dem fread machst ist dann schon fast egal, es muss gemacht werden.
Ich wage sogar zu behaupten das es bei bestimmten Sachen mehr Sinn macht, eine Datei vollständig in den Prozess einzulesen und aus diesem Buffer dann deine Häppchen rauszuholen, als sehr viele fread Aufrufe zu tätigen und deine Häppchen so zu holen!