/ / Wie richte ich die Kommunikation zwischen zwei Prozessen ein? - Linux, Sockets

Wie richte ich die Kommunikation zwischen zwei Prozessen ein? - Linux, Sockets

Ich habe folgende Situation:

  1. Ein Daemon, der eine privilegierte Operation für Daten ausführt, die im Speicher gehalten werden.

  2. Ein Multithread-Server, der derzeit auf ungefähr 30 Kernen läuft, die Benutzeranforderungen bearbeiten.

Der Server (1) würde Anfragen von (2) erhalten,Bearbeite sie nacheinander und gib eine Antwort zurück. Jede Abfrage nach (1) würde niemals blockieren und dauert nur einen Bruchteil einer Mikrosekunde (1), um verarbeitet zu werden, so dass wir garantiert schnelle Antworten erhalten, es sei denn, (1) wird von zu viel Last überrannt.

Im Wesentlichen möchte ich eine Situation aufstellenWobei (1) auf einen UNIX-Domänen-Socket hört und (2) Anforderungen schreibt und Antworten liest. Ich möchte jedoch, dass jeder Thread von (2) gleichzeitig lesen und schreiben kann. Meine Idee ist es, ein UNIX-Socket pro Thread für die Kommunikation zwischen (1) und (2) haben (1) Block auf epoll_wait auf diesen Sockets Verarbeitung von Anfragen nacheinander. Jeder Thread auf (2) würde dann unabhängig von seinem Socket lesen und schreiben.

Das Problem, das ich mit diesem Ansatz sehe, ist dasIch kann die Anzahl der Threads auf (2) leicht dynamisch erhöhen. Gibt es eine Möglichkeit, dies auf eine Weise zu erreichen, die flexibel in Bezug auf die Laufzeitkonfiguration ist? Ich denke, ein Ansatz wäre, eine große Anzahl von Sockets und a zu haben thread on (2) würde einen Socket per Zufall auswählen, einen Mutex darauf setzen, eine Abfrage schreiben und blockieren, auf eine Antwort warten, dann den Mutex loslassen, sobald er eine Antwort von (1) zurückbekommt.

Hat jemand bessere Ideen?

Antworten:

0 für die Antwort № 1

Ich würde vorschlagen, eine praktikable Möglichkeit ist zu gehenmit Ihrem eigenen Vorschlag und jedem Thread erstellen Sie einen eigenen Socket für die Kommunikation mit dem Daemon. Sie können Streaming (tcp) Sockets verwenden, die Ihr Problem, dynamisch mehr Threads hinzuzufügen, lösen können:

  1. Der Daemon hört auf einem bestimmten Port mit socket(), bind() und listen(). Der zuhörende Socket ist zunächst das einzige Ding in seinem epoll_wait einstellen.
  2. Die Client-Threads verbinden sich mit diesem Port connect()
  3. Der Daemon Server akzeptiert (mit accept()) die eingehende Verbindung, um einen neuen Socket zu erstellen, der zu ihr hinzugefügt wird epoll_wait eingestellt mit epoll_ctl().

Die obige Prozedur kann verwendet werden, um beliebig viele Sockets beliebig hinzuzufügen, alle mit einem einzigen epoll_wait Schleife auf der Daemon-Seite.