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 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 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.
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).
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 |
PIPE
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 **.
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.
SIGHUP
SIGINT
SIGQUIT
SIGKILL
SIGSEGV
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.
Es gibt verschiedene Muster, um auf Signale zu reagieren
Mit einigen Ausnahmen kann das empfangene Signal ignoriert werden. Welche Signale können nicht ignoriert werden?
SIGKILL
SIGSTOP
Der Prozess, der diese Signale empfängt, führt immer die Standardeinstellungsoperation aus.
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 **.
Zusätzlich zur Standardeinstellungsoperation kann der Benutzer die Entsprechung für jedes Signal unter Verwendung von "signal ()" definieren.
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.
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 darauf warten, dass Ressourcen verfügbar werden
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.
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
Wie bei anderen IPCs in POSIX können Sie Ihr Semaphos benennen und verwalten. Teilen Sie Semaphos zwischen Prozessen, indem Sie Namen teilen
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.
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.
System V
--Erstellen Sie ein Shared-Memory-Segment oder rufen Sie die ID eines vorhandenen Segments mit shmget ()
ab
shmat ()
** ein Shared-Memory-Segment an den Speicher Ihres Prozesses anshmdt ()
lösen.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.
Systemaufrufe im Zusammenhang mit dem Socket-Betrieb
socket()
--Erstellen Sie einen neuen Socketbind()
listen()
accept()
connect()
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.
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