Maison > Article > Opération et maintenance > Techniques classiques de communication inter-processus Linux
Cet article vous apporte des connaissances pertinentes sur la communication inter-processus Linux, y compris les canaux, les canaux anonymes, la mémoire partagée et d'autres problèmes connexes. J'espère qu'il sera utile à tout le monde.
·Communication inter-processus : La méthode fournie par le système d'exploitation pour que le système implémente la communication inter-processus
Les processus ne peuvent pas communiquer directement car chaque processus possède un espace d'adressage virtuel indépendant et accède au sien. adresse virtuelle, le processus est donc indépendant et ne peut pas communiquer directement
Selon le scénario de communication, différentes méthodes de communication sont fournies
Types de méthodes de communication inter-processus : tuyaux, mémoire partagée, file d'attente de messages, sémaphore
·Pipeline
Caractéristiques : Communication semi-duplex - communication unidirectionnelle avec la direction que vous pouvez choisir
Essence : Ouvrir un tampon dans le noyau (un morceau de mémoire dans l'espace du noyau)
Principe : Plusieurs processus communiquent en accédant au buffer dans le même noyau (en copiant le handle d'opération du buffer)
Catégorie : Pipe anonyme : Le buffer n'a pas d'identifiant et ne peut être utilisé que pour la communication inter-processus avec affinité
Pipe nommée : Le buffer a un identifiant et peut être utilisé pour toute communication inter-processus sur le même hôte
Tout sous Linux est un fichier - tout est exploité comme un fichier (y compris les tubes), et l'accès au tube se fait via des opérations d'E/S
·Pipeline anonyme
Valeur de retour : renvoie 0 avec succès ; l'échec renvoie -1
Caractéristiques : ne peut être utilisé que pour la communication inter-processus avec des relations associées
Les canaux anonymes n'ont aucun identifiant et ne peuvent pas être trouvés par d'autres processus. Ils peuvent uniquement copier le. parent à travers le processus de l'enfant Obtenez la poignée d'opération à travers le processus pour parvenir à la communication
Fonctionnalités de lecture et d'écriture : s'il n'y a pas de données dans le canal, la lecture bloquera
using using ‐ ‐ ' ' s ' ‐ down ‐ ‐ ‐ ‐ ‐ , provoquant le blocage du processus et exit
étant fermé avec les extrémités d'écriture de tous les tubes. Si vous continuez à lire, 0 sera renvoyé après la lecture des données et il ne sera plus bloqué.
Une fois la direction sélectionnée, la fin inutilisée devrait être fermé.
·
Tube nommé : Essentiellement, il s'agit d'un tampon dans le noyau, avec un identifiant qui peut être trouvé par d'autres processus, il peut donc être utilisé pour toute communication inter-processus sur le même hôte Pipe nommée L'identifiant est un fichier de type pipe visible dans le système de fichiers Plusieurs processus communiquent en ouvrant le même fichier pipe et en accédant au tampon dans le même noyau
Opération de commande : mkfifo filename Créer un fichier pipe nommé
Fonctionnement de la fonction :int mkfifo(const char *pathname, mode_t mode);
Pathname : nom du fichier ; mode : autorisation de création
Valeur de retour : 0 est renvoyé en cas de succès ; -1 est renvoyé en cas d'échec
·Résumé :
L'essence du pipeline : Un tampon dans l'espace noyau Principe : Plusieurs processus réalisent la transmission de données en accédant au même tampon Catégorie : canaux anonymes, canaux nommés
Tubes anonymes : ne peuvent être utilisés que pour la communication inter-processus avec des relations de parenté
Tubes nommés : peuvent être utilisés pour toute communication inter-processus sur le même hôte
Caractéristiques : ① Communication semi-duplex - communication unidirectionnelle avec la direction que vous pouvez choisir
Fournit un service de transmission de flux d'octets : commandé , fiable, basé sur la connexion Une sorte de transmission en streaming
Basé sur la connexion : si toutes les extrémités de lecture sont fermées, l'écriture sera anormale si toutes les extrémités d'écriture sont fermées, la lecture renverra 0
② Livré avec synchronisation et exclusion mutuelle :
Synchronisation : le seul accès aux ressources critiques via le même processus et en même temps Réaliser des opérations d'accès sécurisées
mis en œuvre.对 Le mode de réalisation de l'exclusion mutuelle : La taille de l'opération d'écriture du pipeline ne dépasse pas la taille du PIPE_BUF-4096, alors l'atomicité du fonctionnement de l'opération est synchronisée. Le cycle de vie suit le processus : sans intervention humaine, après que tous les processus qui ouvrent la sortie du tuyau, le tampon du tuyau est libéré
·Mémoire partagée : Utilisée pour réaliser le partage de données entre les processusEssence : un morceau de mémoire physique Principe : Ouvrir un espace mémoire physique , plusieurs processus mappent le même bloc sur leur propre espace d'adressage virtuel et y accèdent directement via l'adresse virtuelle, réalisant ainsi le partage de données
Caractéristiques : La méthode de communication inter-processus la plus rapide, le cycle de vie suit le noyau touchant dans, , , , , , , , , , , , , , et , deux opérations de copie de données en moins
.Remarque : les problèmes de sécurité doivent être pris en compte lors de l'utilisation de la mémoire partagée
Processus opérationnel :
①Créer ou ouvrir une mémoire partagée②Mappez la mémoire partagée sur l'espace d'adressage virtuel du processus ③Grâce à l'espace d'adressage virtuel mappé adresse Effectuer diverses opérations de mémoire
④Démapper la relation de mappage ⑤Supprimer la mémoire partagéeint shmget(key_t key, size_t size, int shmflg);
key : identifiant (plusieurs processus ouvrent la même mémoire partagée via le même identifiant) size : la taille de l'espace ouvert lors de la création (en mémoire Pages) utiliser utiliser utiliser utiliser utiliser ' s ‑ ‑ ‑ ‑void *shmat(int shmid, const void *shmaddr, int shmflg); Méthode d'accès ; SHM_RDONLY -Lecture seule ; 0-lecture-écriture L'échec peut revenir (vide *)-1
int shmdt(const void *shmaddr);int shmctl(int shmid, int cmd, struct shmid_ds *buf); buf : pour IPC_RMID, renvoie 0 avec succès, renvoie -1 en cas d'échec
·Message Queue
Essence : une file d'attente prioritaire dans le noyau. Plusieurs processus accèdent à la même file d'attente et ajoutent ou obtiennent des nœuds à la file d'attente pour obtenir un transfert de données inter-processus Caractéristiques : Livré avec synchronisation et exclusion mutuelle, le cycle de vie suit le noyau
·Sémaphore
. Essence : Un compteur dans le noyau + file d'attente PCB
Fonction : Utilisé pour réaliser la synchronisation entre les processus Avec exclusion mutuelle, coordonner l'accès du processus aux ressources critiques Opération P : Compteur -1, juger si le décompte est inférieur à 0, bloquer le processus
Opération V : Compteur +1, réveiller un processus bloqué
Utiliser son propre compteur pour accéder aux ressources Un comptage est effectué pour déterminer si l'acquisition de ressources par le processus est raisonnable. Si elle n'est pas raisonnable, elle sera bloquée. . Après avoir attendu qu'une ressource soit générée, réveillez le processus bloqué
Implémentation synchrone : comptez la ressource via un compteur, et effectuez l'opération P avant d'acquérir la ressource Implémentation mutuellement exclusive : le compteur est 1, indiquant qu'il n'y a que une ressource, avant que le processus n'accède à la ressource. Effectuez l'opération P et effectuez l'opération V après avoir terminé la visite
Recommandations associées : "Tutoriel vidéo Linux"
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!