IPC mit Shared Memory - Ablageproblem?



  • Ich versuche gerade IPC (Inter-process communication) mit Shared Memory zu realisieren, bin dabei aber leider auf ein Problem gestoßen, wo ich einfach nicht weiter komme.

    Das Problem scheint erst bei um die 50 Prozesse oder mehr aufzutreten. Ich bin mir einigermaßen sicher, dass das Problem irgendwo beim forken (erzeugen neuer Prozesse) liegt aber da ich mir auch nicht 100%ig sicher bin, habe ich das ganze mal auf ein git Repository mit den entsprechenden Testfall gelegt.
    Ich weiß ja nicht, ob ihr dann die Testfälle überhaupt braucht, die ich den Ordner tests abgelegt habe oder ob ihr das vielleicht auch so irgendwie seht aber ich habe sie einfach mal dabei gelegt. Die tests_src muss dann nur einen Ordner über dem IPC Ordner liegen, da sonst make einen Fehler wirft. Ein make im IPC Ordner reicht dann und auch die Testfälle werden kompiliert und die ausführbaren Dateien in den tests Ordner geschoben. Dann einfach mit
    ./ipc 50 tests/ipc_sendrecv_max_procs
    in dem IPC Ordner die Anwendung starten und dann sieht man, dass da was schief läuft.

    Einmal kurz zum Ablauf: Der starter initialisert das Programm und erzeugt die Prozesse und wartet dann nachher auf das Ende der Prozesse. Die Prozesse sollen aber mit einer Semaphore zunächst warten, bis alle pid's bzw. der Elternprozess alle Prozessdaten abgelegt hat, da man ja sonst auch u.U an einen Prozess sendet, der seine Daten noch nicht im SHM abgelegt hat. Die Prozese starten dann alle, nachem sie von dem Elternprozess gewecket wurden mit einem execvp-Auruf das Programm (den test in diesem Fall) und senden und empfangen Nachrichten. Die ersten n/2, also 25 senden 16 Nachrichten an den n - Prozessnumer Prozess, also Prozess 25 sendet an 50, 26 an 49 usw. und die anderen n/2 empfangen die 16 Nachrichten.

    Das Problem ist jetzt: Ein Prozess kann sich dann manchmal nicht (richtig) initialisieren. In der IPC_Init Funktion blendet der Prozess das SHM Segment zunächst in seinen Adressraum ein und das funktioniert auch und auch das senden und empfangen nachher aber irgendwie kann ein Prozess manchmal ebend nicht seine Prozessdaten (pid vor allem) und somit seine "Nummer" (Rank) ermitteln bzw. aus dem SHM holen (oder da steht was falsches). ich denke daher beim forken liegt irgendwo der Fehler.

    Hier der Link zum Repo
    https://gitlab.com/Clayman/IPC/tree/master



  • - man benutzt keine VLA
    - man benutzt keine Zeigercasts
    - nimm valgrind



  • Hm .. das mit den VLA's war mir so nicht bekannt, also sollte man stattdesssen lieber mit malloc arbeiten, also sich selbst speicher alloziieren aber das mit den Zeigercasts muss man doch machen oder wie soll man dann nachher die verschiedenen Daten im SHM adressieren?

    Ich habe jetzt auch valgrind mal verwendet (das Tool hatte ich irgendwie schon ein wenig vergessen) und den Fehler auch gefunden. Jetzt bin ich desbezüglich auch schon weiter, also danke schon einmal für den Hinweis.



  • Man kann auch compilerunterstützte sogenannte AddressSanitizer verwenden,

    https://github.com/google/sanitizers/wiki/AddressSanitizer

    die sind je nach Geschmack etwas handlicher, haben aber auch einen etwas anderen Anspruch als das deutlich ältere valgrind.


Anmelden zum Antworten