[LINUX] Arten der Kommunikation zwischen Prozessen

Introduction of Communication agenda

WHOAMI IPFactory 1 Jahr @ n01e0 Normalerweise mache ich Linux-Kernelmodule.

WHAT IS IPC IPC ist eine Abkürzung für * Inter Process Communication *. Dies bedeutet ** Datenaustausch zwischen Prozessen ** und verschiedene Arten von IPC sind unter Linux verfügbar. In diesem Artikel geben wir nur eine kurze Einführung und erläutern die Implementierung nicht im Detail. Dies liegt daran, dass das Ziel darin besteht, die allgemeinen Eigenschaften jeder Funktion zu verstehen und die beste Wahl für den Leser zu treffen.

IPC-Klassifizierung

IPC wird entsprechend seiner Funktion grob in drei Typen eingeteilt.

--Kommunikation --Mechanismus für die Datenkommunikation und den Austausch zwischen Prozessen --Synchronisation --Mechanismus zur Synchronisation zwischen Prozessen und Threads --Signal

IPC-Spezifikationen

IPC wurde in der langen Geschichte von UNIX nach verschiedenen Standards implementiert und gemischt. Es gibt hauptsächlich * System V * -Implementierungen und * POSIX * -Implementierungen Insgesamt ist POSIX einfacher zu handhaben, aber der IPC von POSIX wurde seit Kernel-Version 2.6 implementiert, sodass er weniger portabel ist.

SYSTEM V IPC und POSIX IPC

In System V befindet sich die Datenstruktur jedes IPC im Kernelraum. Dynamisch generiert, wenn ein Prozess ** IPC-Ressourcen anfordert (Semaphos, Nachrichtenwarteschlangen, gemeinsam genutzte Speicherbereiche) **. Jede IPC-Ressource hat eine eindeutige Kennung. Der Benutzer kann jeden IPC mit einem anderen IPC-Schlüssel unterscheiden. Diese Beziehung ähnelt der Beziehung zwischen einer Datei und einem Dateideskriptor. Der Unterschied zwischen Dateien besteht jedoch darin, dass sie im Speicher verbleiben, sofern der Prozess sie nicht explizit freigibt. Es gibt einen ** POSIX IPC **, der ähnliche Funktionen bietet und multithread-sicher ist. Ein weiterer wesentlicher Unterschied besteht darin, dass mit POSIX jeder IPC benannt und unterschieden werden kann. Es gibt eine Regel für die Benennung. Es muss sich um eine nullterminierte Zeichenfolge handeln, die mit "/" beginnt und eine Länge von mindestens einem anderen Zeichen als "/" hat. Obwohl es kleine Unterschiede in den Spezifikationen gibt, besteht der Hauptunterschied im Konzept jedes IPC in der Verwaltungsmethode jedes Objekts (jeder Ressource).

IPC-Vergleich

Der Hauptunterschied zwischen System V und POSIX besteht in der IPC-Objektkennung und dem Handler, die aufgelistet sind.

IPC-Typ Kennung Handler
Rohr Keiner Dateideskriptor
FIFO Pfad Dateideskriptor
System V Semapho System V IPC-Schlüssel System V IPC ID
POSIX Anonym Semafo Keiner Semapho-Zeiger
POSIX namens Semafo POSIX IPC-Pfad Semapho-Zeiger
System V-Nachricht System V IPC-Schlüssel System V IPC ID
POSIX-Nachricht POSIX IPC-Pfad Deskriptor der Nachrichtenwarteschlange
Gemeinsamer Speicher von System V. System V IPC-Schlüssel System V IPC ID
Gemeinsamer POSIX-Speicher POSIX IPC-Pfad Dateideskriptor
UNIX-Domain-Socket Pfad Dateideskriptor
Internet Domain Socket IP-Adressport Dateideskriptor

IPC unter Linux wurde in diesem Artikel vorgestellt

PIPE

Was ist eine Pfeife?

Es ist ein sehr bekanntes Konzept für Leser, die täglich in der Shell leben. Um kurz zu beschreiben, was eine Pipe (|) in einer Shell ist ** Verbinden Sie den Ausgang eines Prozesses mit dem Eingang eines anderen ** Es bedeutet das. In ähnlicher Weise wird die Pipe als ** IPC ** häufig verwendet, um die Ausgabe und Eingabe von Daten zu verbinden. Ich habe versucht, die Datenstruktur von Pipes am Beispiel zu erklären, aber ich kann mir keine anderen guten Beispiele als Pipes vorstellen. Da es sich um einen Zylinder handelt, werden Ein- und Ausgang zuerst eingegeben. Zusammenfassend ist eine Pipe eine ** unidirektionale First-In-, First-Out-Datenstruktur **.

Implementierung

Der in "unistd.h" definierte Systemaufruf "pipe ()" erzeugt zwei Dateideskriptoren. Einer ist zum Lesen und der andere zum Schreiben. Dies sind Dateideskriptoren, aber es gibt keinen entsprechenden Pfad. Die in die Pipe geschriebenen Daten werden von der Datenstruktur im Kernel gepuffert, bis sie gelesen werden. Wenn ein Prozess eine leere Pipe liest (read ()), stoppt er normalerweise das Lesen, bis Daten in diese Pipe geschrieben werden.

FIFO Es gibt eine ähnliche Funktion, "FIFO". Wie der Name schon sagt, wird es auch als "Named Pipe" bezeichnet. Es handelt sich um eine ** First-In-First-Out ** -Datenstruktur. Der einzige Unterschied zu Pipes besteht darin, dass der erstellte Dateideskriptor einen ** Namen ** (Pfad) hat.

SIGNAL Dies ist auch ein bekanntes Konzept. Man kann sagen, dass das Signal auch eine Art IPC ist. Es gibt viele Arten von Signalen. Nehmen wir einige Beispiele.

und so weiter. Signale werden hauptsächlich verwendet, um einem Prozess mitzuteilen, dass etwas passiert ist, oder um einen Prozess zu zwingen, etwas Bestimmtes zu tun. Die Informationsmenge, über die ein Signal verfügt, ist gering und enthält normalerweise keine anderen Informationen als die Nummer (Typ). Wie mit dem empfangenen Signal umgegangen wird, hängt auch vom Prozess ab.

Korrespondenz

Es gibt verschiedene Muster, um auf Signale zu reagieren

  1. Ignorieren
  2. [Standardeinstellungsoperation ausführen](# Standardeinstellungsoperation)
  3. [Call Signal Handler](#Signal Handler)

ignorieren

Mit einigen Ausnahmen kann das empfangene Signal ignoriert werden. Welche Signale können nicht ignoriert werden?

Der Prozess, der diese Signale empfängt, führt immer die Standardeinstellungsoperation aus.

Standardeinstellung

Wie der Name schon sagt, ist die Standardeinstellungsoperation die Reaktion auf jedes unter Linux als Standard eingestellte Signal. Einige Signale haben standardmäßig ** end **, ** dump **, ** stop ** und ** ignore **.

Signalhandler

Zusätzlich zur Standardeinstellungsoperation kann der Benutzer die Entsprechung für jedes Signal unter Verwendung von "signal ()" definieren.

Implementierung

Wenn ein Prozess ein Signal an den Prozess ausgibt, wird das Signal vom Kernel empfangen. Der Kernel prüft, ob der Zielprozess ausgeführt wird, und hält das Signal in der Warteschleife, wenn dies nicht der Fall ist. Der Systemaufruf signal () hat einen Zeiger auf die Funktion, die zum Signalhandler wird, der dem Signaltyp als Argument entspricht, und ordnet sie zu.

SEMAPHORE Semafo ist ein ** Synchronisationsmechanismus ** in der IPC-Klassifikation. Der tatsächliche Zustand von Semapho ist ein ganzzahliger Wert. Wird als Zugriffssteuerungszähler zugewiesen, um Ressourcen zu schützen, die von mehreren Prozessen gemeinsam genutzt werden

Besteht aus.

Verfassung

Ganzzahlige Variable

Es wird ein Zähler. Dieser Wert gibt den Status der Ressource an (unabhängig davon, ob sie verfügbar ist oder nicht).

Liste der Prozesse, die auf den Betrieb warten

Liste der Prozesse, die darauf warten, dass Ressourcen verfügbar werden

Zwei atomare Methoden

Zähle das Semapho auf und ab. Wenn ein Prozess auf eine durch ein Semapho geschützte Ressource zugreift, zählt er zuerst das der Zielressource zugeordnete Semafo herunter. Wenn die Semapho-Anzahl negativ wird, wird der Prozess unterbrochen und der Liste hinzugefügt. Wenn der Zugriff auf die Ressource abgeschlossen ist, zählt der Prozess das Semapho hoch. Dadurch wird der Listenprozess neu gestartet, wenn der Semaphowert positiv wird.

Implementierung

Das Semapho selbst schränkt den Betrieb des Prozesses nicht ein, es ist der Benutzer, der das Semafo aussagekräftig macht. Da das Semapho ein Synchronisationsmechanismus ist, erfordert es außerdem eine sehr komplizierte Operation.

System V Erstellen oder öffnen Sie ein Semapho mit semget (). Bedienen Sie das Semapho mit semop ().

POSIX In POSIX gibt es zwei Arten von Semafo

Benanntes Semapho

Wie bei anderen IPCs in POSIX können Sie Ihr Semaphos benennen und verwalten. Teilen Sie Semaphos zwischen Prozessen, indem Sie Namen teilen

Speicherbasiertes Semapho

Dem gemeinsamen Speicher zugeordnet. Teilen Sie das Semapho, indem Sie den Speicher zwischen Prozessen und Threads ohne Namen teilen.

MESSAGE Die IPC-Nachrichtenwarteschlange ist, wie der Name schon sagt, eine Warteschlange. Von einem Prozess gesendete Nachrichten werden in die Nachrichtenwarteschlange gestellt, bis sie von einem anderen Prozess gelesen werden. Wenn ein anderer Prozess die Nachricht liest, entfernt der Kernel die Nachricht aus der Warteschlange. Daher ist der Nachrichtenaustausch zwischen Prozessen immer eins zu eins.

Implementierung

System V Bei Daten, die als Nachricht gesendet werden, muss die Priorität der Nachricht immer als ganzzahliger Wert angegeben werden. Der Empfänger empfängt die Nachricht durch Angabe der Priorität. (In diesem Fall ist es möglicherweise nicht First-In-First-Out. Kann ich es also * Warteschlange * nennen?) Holen Sie sich die Warteschlange mit "msgget ()", senden Sie sie mit "messnd ()" und empfangen Sie sie mit "msgrcv ()".

POSIX Die POSIX-Nachrichtenwarteschlange wird ebenfalls benannt und verwaltet. Beim Empfang können Sie die Priorität der Nachricht nicht angeben. Die älteste Nachricht mit der höchsten Priorität wird gelesen. Öffnen Sie die Warteschlange mit mq_open (), senden Sie mit mq_send und empfangen Sie mit mq_receive.

SHARED MEMORY Gemeinsamer IPC-Speicher Platzieren Sie, wie der Name schon sagt, eine bestimmte Datenstruktur im gemeinsam genutzten Speicherbereich. Während andere IPCs zur Laufzeit Daten aus dem Benutzerbereich in die Datenstruktur im Kernelbereich übertragen, ist der Overhead gering, da er nur dem gemeinsam genutzten Speicherbereich zugeordnet wird. Es gibt jedoch ein Problem zu beachten, dass der Kernel nicht beteiligt ist. ** Es muss verhindert werden, dass mehrere Prozesse gleichzeitig zugreifen ** und das oben erwähnte Semapho kann zu diesem Zweck verwendet werden.

Implementierung

System V --Erstellen Sie ein Shared-Memory-Segment oder rufen Sie die ID eines vorhandenen Segments mit shmget () ab

Das angehängte gemeinsam genutzte Speichersegment kann wie der normale Speicher im Programm behandelt werden. Das gemeinsam genutzte Speicherobjekt wird zerstört, wenn alle Prozesse von shmctl () getrennt und gelöscht werden.

POSIX --Öffnen Sie ein Shared Memory-Objekt mit shm_open (). Der Rückgabewert ist ein Dateideskriptor.

SOCKET Steckdose. Steckdosen können gemäß der Datenübertragungsmethode in zwei Typen eingeteilt werden.

--Stream-Buchse --Datagrammbuchse

Wird genannt. Wie der Name schon sagt, kann der Stream-Socket als Stream behandelt werden und wie Dateien eine beliebige Anzahl von Bytes lesen, unabhängig von der geschriebenen Größe. Datagramm-Sockets ähneln Nachrichten usw. mit bestimmten Unterbrechungen in den Daten, und das Lesen erfordert das Lesen der gesamten Daten. Darüber hinaus gibt es als weitere Klassifizierung von Sockets auch eine Klassifizierung nach Kommunikationsziel.

--UNIX Domain Socket --Internet Domain Socket

Namens UNIX-Domänensockets unterstützen die Kommunikation zwischen Anwendungen innerhalb desselben Hosts, und Internetdomänensockets unterstützen die Kommunikation zwischen Anwendungen, die über das Internetprotokoll verbunden sind.

Implementierung

Systemaufrufe im Zusammenhang mit dem Socket-Betrieb

Ich kann hier nur einen kleinen Teil der Steckdosen vorstellen, aber es ist ein Konzept, das sehr viele Dinge zulässt. Dies ist die Grenze des IPC-Zusammenfassungsartikels, es gibt jedoch viele Artikel zu Sockets. Lesen Sie sie daher gegebenenfalls.

Zusammenfassung

Es ist zweckmäßig, die Merkmale, Stärken und Schwächen jedes einzelnen zu identifizieren und den optimalen IPC zu verwenden. In meinem Fall verwende ich die POSIX-Nachrichtenwarteschlange, um Dateipfade usw. auszutauschen.

Ich habe viel Mist geschrieben, aber ich möchte nach Bedarf ein Beispiel für jede Implementierung zusammenstellen.

Recommended Posts

Arten der Kommunikation zwischen Prozessen
Linux-Interprozesskommunikation
Kommunikation zwischen Prozessen ~ gemeinsamer Speicher ~
Rache der Typen: Rache der Typen
Fangen Sie mehrere Arten von Ausnahmen ab
Interprozesskommunikation für Embedded DL
Zusammenfassung der Linux-Verteilungstypen
Ich habe verschiedene Methoden der Kommunikation zwischen Prozessen bei der Mehrfachverarbeitung von Python3 gemessen
Ich habe 11 Arten von Betriebssystemen zusammengefasst