Mehrere Prozesse lesen und schreiben aus einem Socket



  • Hallo Leute,

    ich habe eine Anwendung geschrieben, in welcher ich AF_UNIX Sockets als queue zwischen Prozessen missbrauchen will.

    Pseudocode:

    socketpair(CHILD, PARENT);
    
    for (1..10) {
        fork(); //Es gibt 10 Kinder die alle vom gleichen Socket lesen und schreiben
        //...
    }
    
    //Parent:
    while (...) {
        $eingabe = <CHILD>;
        print CHILD $foo;
    }
    
    //CHILD:
    while (...) {
        $eingabe = <PARENT>;
        print PARENT $bar;
    }
    

    Beschreibung:
    Alle 10 Kindprozesse arbeiten auf dem gleichen Socket (ein einziges mal socketpair vor den forks aufgerufen) indem sie aus diesem Lesen und schreiben. Nehmen wir an, dass das Lesen und Schreiben aus dem Socket z.B. durch Semaphoren geschützt ist (hier nicht).
    Annahme:
    Der Elternprozess schreibt, die Kinderprozesse lesen. Der umgekehrte Weg (Kinderp. schreiben, Elternp. liest) wird auch währenddessen vorgenommen, allerdings soll das in der Beobachtung (siehe unten) nicht berücksichtigt werden. Ich erwähne das nur, da es vielleicht relevant für das Problem ist. Die Kinder sollen jeweils einen weiteren Datensatz erst dann lesen, wenn sie mit der Verarbeitung des vorherigen abgeschlossen haben (es wird nicht auf Vorrat gelesen).
    Beobachtung:
    Ich beobachte, dass sich der Socket, nicht wie eine FIFO queque verhält. Während z.B. Kindprozess A erst Eintrag 1 liest, so liest Kindprozess B schon Eintrag 100. A hat scheinbar die Einträge 1-99 und B 100-XY, obwohl diese unter Idealbedingungen sowas lesen müssten:

    Kind_A|Kind_B
    1     |
          | 2
    3     |
          | 4
    5     |
          | 6
     // ...
    

    Frage:
    Wiese erreicht man nicht dieses FIFO/Queue Verhalten, wenn mehrere Prozesse aus dem gleichen Socket lesen? Oder darf eine Socketverbindung nur jeweils zwischen zwei Prozessen bestehen?

    Bitte um Antwort
    MfG



  • das verhalten ist genau das, was zu erwarten ist. da du dein socket semaphore-mäßig abgesichert hast, liest nur immer ein prozess daten heraus. schreib mal vielleicht die gleiche tabelle als beispiel dafür, was du erwartest hast.



  • Hallo,

    und danke für Deine Antwort. Ich nehme jedoch an, dass Du mein Problem falsch verstanden hasst, bzw. ich habe mich missverständlich ausgedrückt.
    Die Tabelle wie ich sie oben angegeben habe ist genau das was ich unter Idealbedingungen (d.h. Race-Conditionings vernachlässigt) erwartet habe, was in der Praxis jedoch nicht auftritt.
    Was in der Praxis zu beobachten ist, ist folgendes:

    Kind_A|Kind_B
    1     |
          | n + 1
    2     |
          | n + 2
    3     |
          | n + 3
    n     |
    // ...
    

    Die Zahl entspricht jeweils dem Datensatz, wie er aus dem Socket gelesen wird.
    Bzw kann man das auch anders angeben, da die Prozesse (logisch gesehen) ja parallel laufen:

    Kind_A|Kind_B
    1     | n + 1
    2     | n + 2
    3     | n + 3
    n     |
    // ...
    

    Meine Frage ist keine Frage der Synchronisierung z.B. mit Semaphoren, sondern eher die: Wieso werden die Datensätze nicht der Reihe nach, wie sie vom Parent geschrieben wurden, wieder von den Kindern gelesen (auch wenn die Datensätze, gelesen von einem einzelnen Kind, relativ geordnet sind [siehe Tabelle])?
    Dies ist kein FIFO Verhalten.



  • weil der erste kindprozess mehr als einen datensatz liest. er liest n ein. damit liest der zweite kindprozess wieder welche ein, aber ab position n+1. du verwendest also einen stream socket. probier mal datagram. das ist hier passender.


Anmelden zum Antworten