Also wenn ich jetzt von asynchronen IPC rede und von einem Clienten dann geht es
nicht um RPC! Ich bin da wieder bei meinem lieblings Bsp. GUI-Anwendung. Diese GUI-Anwendung bekommt eine Nachricht, in der Nachricht steht dass das Fenster vergrößert wurde und neugezeichnet werden muss. Der Service sendet die Nachricht asynchron, weil warum sollte der Service darauf warten das die Nachricht auch bearbeitet wurde?
Der Client wartet entweder auf eine Nachricht oder er macht gerade etwas, die Nachricht kommt in die Queue des Ports und wenn er Client fertig ist macht er seinen Syscall um die Nachricht abzuholen.
Der Client kann also jedes Mal die Nachricht ganz einfach verarbeiten, bei meinem Bsp., wird er also seinen Fensterinhalt neu zeichnen und erst wenn er fertig ist, guckt er nach ob eine neue Nachricht vorhanden ist.
Würde ich das jetzt über Popup-Threads machen, würde ich einfach die Queue, für Nachrichten, in den UserSpace packen und wahrscheinlich mit einer Semaphore arbeiten. So dass der Popup-Thread die Semaphore inkrementiert wenn er die Nachricht in die Queue gepackt hat und damit den eventuell wartenden Worker-Thread startet (was wieder einen Syscall kostet) und der Worker-Thread dekrementiert die Semaphore und wenn noch mind. eine Nachricht vorhanden ist bearbeitet er die nächste.
So könnte ich das Problem welches mit dem Multi-Threading kommen würde auch noch umgehen, aber ich würde die Popup-Threads nutzen.
Was ich momentan noch gar nicht sehe ist, dass mehrere Nachrichten gleichzeitig=parallel bearbeitet werden. Kann sein das ich das irgendwann auch hinbekomme (gedanklich), aber im Moment einfach noch nicht.
So ich hoffe jetzt du weißt was ich mit aktiven Abholen und asynchronen IPC meine!
Dann nochmal zum SharedMem
Ich sehe da wie gesagt keinen Unterschied, bei beiden Sachen (Nachricht und "richtiger" SharedMem) wird der Speicher in beiden Prozessen gemappt sein und theoretisch können in dem Moment beide darauf zugreifen (theoretisch deswegen, weil ja ein anderer Thread des Clienten auf die dumme Idee kommen könnte, in dem Speicher der als Nachricht verschickt wurde, herumzufrickeln). Der einzige Unterschied wäre, dass der SharedMem beim RPC zeitlich für das Antworten begrenzt ist und ansonsten solange bleibt bis ihn der Empfänger unmappt.
Was den IPC Port betrifft, den man dann zum Übertragen von SharedMem bräuchte, wie willst du denn dem anderen Prozess den SharedMem zukommen lassen und wie willst du rausfinden welchem Prozess du den Speicher zukommen lassen willst?
Was mir im Moment fehlt, wäre mal ein konkretes Bsp. wo SharedMem verwendet wird.
Der Kernel macht für den kurzen Zeitraum des Kopierens beide Adressräume gleichzeitig zugänglich
Das geht bei mir halt nicht, ich kann von einem Prozess aus nicht auf den Adressraum eines anderen Prozess zugreifen (weil die Daten welche Bereiche frei und welche nicht frei sind, werden im Kernel immer an der selben Stelle gespeichert und sind Prozessbezogen).
Man wird auf jeden Fall noch eine gültige Shared-Memory-ID brauchen und ansonsten kannst Du ja den Key 128 Bit groß machen so das raten wirklich keinen Sinn mehr ergibt.
Wieso so umständlich?! Zumal du den immer noch durch einen dummen Zufall bekommen könntest. Bei mir ist das Unmöglich! Wenn ein Prozess einen Speicher-Bereich an einen anderen sendet, gibt es für alle anderen Prozesse keine Möglichkeit da ran zukommen, nicht mal per Zufall (und es braucht wie gesagt auch noch weniger Syscalls).
Was die Anzahl der Syscalls betrifft, das möchte inzwischen nicht mehr so schlimm sein, aber da ich immernoch für Pentium Systeme programmiere (und da nutzt man nen Interrupt und das kostet richtig) lege ich Wert darauf das man nur so wenig wie nötig machen muss.