Ça refroidit!Zhang San n'a pas répondu correctement à la question « la communication entre les processus, l'entier et la chaîne doivent poser des questions sur les connaissances »

Cxyyidd 2021-08-19 22:45:04 阅读数:242

refroidit zhang san pas pondu

image.png


Texte

L'espace d'adresse utilisateur de chaque processus est indépendant,En général, ils ne sont pas accessibles les uns aux autres,Mais l'espace du noyau est partagé par chaque processus,Pour communiquer entre les processus, il faut passer par le noyau.

image.png

Linux Le noyau fournit un certain nombre de mécanismes de communication inter - processus,Voyons ce qu'il y a?

Tuyauterie

Si tu avais appris Linux Les ordres,Alors vous devez connaître「|」Cette ligne verticale.

$ ps auxf | grep mysql

  • 1.
  • 2.

Sur la ligne de commande ci - dessus「|」La ligne verticale est uneTuyauterie,Sa fonction est de déplacer la commande précédente(ps auxf)La sortie de,Comme dernière commande(grep mysql)Contribution de,À partir de cette description fonctionnelle,Comme vous pouvez le voir,Les données transmises par Pipeline sont unidirectionnelles,Si vous voulez communiquer entre vous,Nous devons créer deux tuyaux pour.

En même temps,On nous a dit qu'il n'y avait pas de nom pour ce tuyau,Alors...「|」Le tuyau représenté est appeléPipeline anonyme,Détruisez quand vous en aurez fini avec.

Un autre type de tuyauterie estPipe nommée,Aussi appelé?FIFO, Parce que les données sont le premier entré, premier sorti .

Avant d'utiliser un tuyau nommé , Il faut d'abord passer ?mkfifo? Commande pour créer , Et spécifiez le nom du tuyau :

$ mkfifo myPipe

  • 1.
  • 2.

myPipe C'est le nom de ce tuyau ,Basé sur Linux L'idée que tout est documenté , Donc les tuyaux existent aussi sous forme de fichiers ,Nous pouvons utiliser ls Regarde, Le type de fichier est p,C'est - à - dire pipe(Tuyauterie) Ça veut dire:

$ ls -l
prw-r--r--. 1 root root 0 Jul 17 02:45 myPipe

  • 1.
  • 2.
  • 3.

Et puis...,On y va. myPipe Ce Pipeline écrit des données :

$ echo "hello" > myPipe // Écrire les données dans le pipeline
// Ça s'est arrêté ...

  • 1.
  • 2.
  • 3.

Après l'opération , Vous verrez que l'ordre s'arrête ici après l'exécution , C'est parce que le contenu du tuyau n'est pas lu , Ce n'est qu'après avoir lu les données du pipeline , Les commandes peuvent sortir normalement .

Et donc,, Nous effectuons une autre commande pour lire les données dans ce pipeline :

$ cat < myPipe // Lire les données dans le tuyau
hello

  • 1.
  • 2.
  • 3.

Je vois., Le contenu du tuyau a été lu , Et imprimé sur le terminal ,D'un autre côté,echo Cette commande s'est également retirée normalement .

Nous pouvons voir, Pipeline ce mode de communication est inefficace , Ne convient pas à l'échange fréquent de données entre les processus .Bien sûr., Les avantages , La nature est simple , Il est également facile de savoir que les données du pipeline ont été lues par un autre processus .

Comment créer un tuyau , Quel est le principe derrière ?

Création de pipelines anonymes , Cet appel système est nécessaire par :

int pipe(int fd[2])

  • 1.
  • 2.

Ceci représente la création d'un pipeline anonyme , Et renvoie deux descripteurs , L'un est le descripteur de l'extrémité de lecture du tuyau ?fd[0], L'autre est le descripteur d'extrémité d'écriture du pipeline ?fd[1].Attention!, Ce tuyau anonyme est un fichier spécial , N'existe que dans la mémoire , Pas dans le système de fichiers .

image.png

En fait..., Le soi - disant Pipeline , C'est une chaîne de cache dans le noyau . Données écrites à partir d'une section du pipeline , Est en fait mis en cache dans le noyau , Lisez à l'autre bout , C'est - à - dire lire ces données du noyau .En plus, Les données transmises par Pipeline sont des flux non formatés et de taille limitée .

Regarde ça., Vous pourriez avoir des questions , Les deux descripteurs sont dans un processus , Ne fonctionne pas comme une communication inter - processus , Comment faire en sorte que le pipeline traverse deux processus ?

On peut utiliser?fork?Créer un sous - processus, Le processus enfant créé copie le descripteur de fichier du processus parent , Il en résulte deux processus chacun 「?fd[0]?Avec?fd[1]」, Les deux processus peuvent passer par leurs fd L'écriture et la lecture du même fichier Pipeline permettent la communication entre les processus .

image.png

Le tuyau ne peut être écrit qu'à une extrémité , L'autre bout lit , Donc ce schéma ci - dessus est susceptible de créer de la confusion , Parce que les processus parent et enfant peuvent écrire en même temps , On peut aussi lire .Alors,Pour éviter cela, La pratique habituelle est :

  • Le processus parent ferme la lecture fd[0], Ne gardez que ce qui est écrit fd[1];
  • Le Sous - processus a fermé l'écriture fd[1], Seules les lectures fd[0];

image.png

Donc si une communication bidirectionnelle est nécessaire , Vous devriez créer deux tuyaux .

Par ici., Nous avons simplement analysé l'utilisation de pipelines pour communiquer entre les processus parent et enfant , Mais avant shell Ce n'est pas comme ça .

In shell Exécution interne?A | BAu moment de l'ordre,A Processus et B Les processus sont shell Processus enfant créé ,A Et B Il n'y a pas de relation parent - enfant entre , Ses deux processus parentaux sont shell.

image.png

Alors dis,In shell Passe par 「|」 Le pipeline anonyme relie plusieurs commandes ensemble , En fait, plusieurs sous - processus ont été créés , Alors, avant d'écrire shell Lors du script, Ce qui peut être fait avec un tuyau , N'utilisez pas plus d'un tuyau , Cela réduit les frais généraux du système pour créer des sous - processus .

Nous pouvons savoir, Pour les pipelines anonymes , Son champ de communication est le processus dans lequel il existe une relation parent - enfant . Parce que le tuyau n'a pas de corps , Ce qui veut dire qu'il n'y a pas de fichiers pipe ,Uniquement par fork Pour copier le processus parent fd Descripteur de fichier, Pour atteindre le but de la communication .

En plus, Pour les tuyaux nommés , Il peut communiquer entre des processus non pertinents . Parce que le tuyau de commande , Un fichier de périphérique de type pipe a été créé à l'avance , Il suffit d'utiliser ce fichier périphérique dans le processus , Pour communiquer entre eux .

Qu'il s'agisse d'un pipeline anonyme ou d'un pipeline nommé , Les données écrites par le processus sont mises en cache dans le noyau , Un autre processus lit naturellement les données à partir du noyau , En même temps, les données de communication suivent Premier entré, premier sortiPrincipes,Non pris en charge lseek Opérations de localisation de fichiers telles que .


File d'attente des messages

Comme nous l'avons mentionné plus haut, la communication par Pipeline est inefficace , Par conséquent, les pipelines ne conviennent pas à l'échange fréquent de données entre les processus .

Sur cette question,File d'attente des messages Le mode de communication de .Par exemple,,A Le processus va donner B Le processus envoie un message ,A Une fois que le processus a mis les données dans la file d'attente de message correspondante, il peut revenir normalement ,B Lisez les données quand le processus en a besoin .Même chose.,B Le processus va donner A Il en va de même pour les messages envoyés par le processus .

Encore. , La file d'attente des messages est une liste de liens de messages stockés dans le noyau ,Lors de l'envoi des données, Il sera divisé en une seule Unit é de données , C'est le corps du message (Bloc de données), Le corps du message est un type de données défini par l'utilisateur , L'expéditeur et le destinataire du message conviennent du type de données du bon corps du message , Donc chaque corps de message est un bloc de stockage de taille fixe , Contrairement aux pipelines qui sont des données de flux d'octets non formatées . Si le processus lit le corps du message à partir de la file d'attente du message , Le noyau supprimera ce corps de message .

Le cycle de vie de la file d'attente des messages avec le noyau , Si la file d'attente des messages n'est pas libérée ou si le système d'exploitation n'est pas désactivé , La file d'attente des messages existera toujours , Et le cycle de vie du pipeline anonyme mentionné précédemment , Est créé avec la création du processus ,Détruire à la fin du processus.

Message ce modèle , La communication entre les deux processus est comme l'envoi normal de courriels , Prends une , Je vais répondre , Peut communiquer fréquemment .

Mais là où les moyens de communication du courrier sont insuffisants, il y a deux points , Premièrement, la communication n'est pas opportune , Deuxièmement, les accessoires ont également des limites de taille , C'est aussi le point où la file d'attente des messages manque de communication .

Les files d'attente de messages ne conviennent pas à la transmission de données volumineuses , Parce qu'il y a une limite de longueur maximale pour chaque corps de message dans le noyau , La longueur totale de tous les corps de messages contenus dans toutes les files d'attente est également plafonnée .In Linux Dans le noyau, Il y aura deux définitions de macro ?MSGMAX?Et?MSGMNB, Ils sont en octets , La longueur maximale d'un message et la longueur maximale d'une file d'attente sont définies respectivement .

Pendant la communication de la file d'attente de messages , Il y a des frais généraux de copie de données entre l'état utilisateur et l'état du noyau , Parce que quand un processus écrit des données dans une file d'attente de messages dans le noyau , Le processus de copie des données de l'état utilisateur à l'état du noyau se produit , De même, lorsqu'un autre processus lit les données du message dans le noyau , Le processus de copie des données de l'état du noyau à l'état de l'utilisateur se produit .


Mémoire partagée

Processus de lecture et d'écriture des files d'attente de messages , Il y aura un processus de copie de message entre l'état utilisateur et l'état du noyau .C'est...Mémoire partagéeDe la façon dont, C'est une bonne solution à ce problème .

Système d'exploitation moderne, Pour la gestion de la mémoire , La technologie de la mémoire virtuelle est utilisée , C'est - à - dire que chaque processus a son propre espace mémoire virtuel , La mémoire virtuelle de différents processus est cartographiée en mémoire physique différente .Alors..., Même si le processus A Et Processus B L'adresse virtuelle est la même , En fait, vous accédez à différentes adresses de mémoire physique , L'ajout, la suppression, la recherche et la modification des données n'ont pas d'incidence mutuelle .

Mécanisme de mémoire partagée , C'est sortir un espace d'adresse virtuel pour , Mappé dans la même mémoire physique . Ce que ce processus écrit , Un autre processus va bientôt voir , Aucune copie n'est nécessaire pour copier , Ça vient, ça vient , Augmente considérablement la vitesse de communication entre les processus .

image.png


Sémaphore

En utilisant le mode de communication mémoire partagée , Apporter de nouveaux problèmes , C'est - à - dire si plusieurs processus modifient simultanément la même mémoire partagée , Il y a de fortes chances qu'il y ait conflit . Par exemple, les deux processus écrivent une adresse en même temps , Le processus qui a écrit en premier découvrira que le contenu a été écrasé par quelqu'un d'autre .

Pour empêcher les processus multiples de concurrencer les ressources partagées , Et la confusion des données qui en résulte , Il faut donc un mécanisme de protection , Faire en sorte que les ressources partagées , Un seul processus peut accéder à tout moment .Exactement.,Sémaphore Ce mécanisme de protection a été mis en place .

Le sémaphore est en fait un compteur entier , Principalement utilisé pour réaliser l'exclusion mutuelle et la synchronisation entre les processus , Au lieu de mettre en cache les données utilisées pour la communication entre les processus .

Un sémaphore indique le nombre de ressources , Le sémaphore est contrôlé de deux façons atomiques :

  • L'un est?P Fonctionnement, Cette opération soustrait le sémaphore de -1, Après soustraction, si le sémaphore < 0, Indique que la ressource est utilisée , Le processus doit être bloqué en attendant ; Après soustraction, si le sémaphore >= 0, Indique qu'il y a des ressources disponibles , Le processus peut se poursuivre normalement .
  • L'autre est?V Fonctionnement, Cette opération ajoutera un sémaphore à 1, Après addition, si le sémaphore <= 0, Indique qu'il y a actuellement un processus bloqué , Le processus est alors réveillé pour fonctionner ; Après addition, si le sémaphore > 0, Indique qu'il n'y a actuellement aucun processus bloqué ;

P L'opération est utilisée avant d'entrer dans la ressource partagée ,V L'opération est utilisée après avoir quitté la ressource partagée , Ces deux opérations doivent être appariées .

Et puis...,Par exemple,, Si vous voulez que les deux processus accèdent mutuellement à la mémoire partagée , Nous pouvons initialiser le sémaphore à ?1.

image.png

Le processus spécifique est le suivant :

  • Processus A Avant d'accéder à la mémoire partagée , D'abord exécuté P Fonctionnement, Parce que la valeur initiale du sémaphore est 1, Donc dans le processus A Mise en œuvre P La quantité de signal devient 0, Indique que les ressources partagées sont disponibles , Alors le processus A Pour accéder à la mémoire partagée .
  • Si à ce stade ,Processus B Je veux aussi accéder à la mémoire partagée ,Mise en œuvre P Fonctionnement, Le signal devient -1, Cela signifie que les ressources critiques ont été utilisées , Donc le processus B Bloqué .
  • Jusqu'à ce que le processus A Accès à la mémoire partagée ,Pour exécuter V Fonctionnement, Pour ramener le sémaphore à 0, Ensuite, le fil dans le blocage se réveille B, Faire en sorte que le processus B Accès à la mémoire partagée , Une fois l'accès à la mémoire partagée terminé ,Mise en œuvre V Fonctionnement, Ramener le sémaphore à sa valeur initiale 1.

On peut le découvrir., Le signal est initialisé à ?1, Ça veut dire que Signaux mutuellement exclusifs , Il garantit qu'un seul processus accède à la mémoire partagée à tout moment , Cela protège bien la mémoire partagée .

En plus, En Multi - processus , Chaque processus n'est pas nécessairement exécuté séquentiellement , Ils sont essentiellement indépendants les uns des autres 、 Avance à une vitesse imprévisible , Mais parfois, nous voulons que plusieurs processus travaillent en étroite collaboration , Pour réaliser une mission commune .

Par exemple,Processus A Est responsable des données de production , Et le processus B Est responsable de la lecture des données , Les deux processus travaillent ensemble 、 Interdépendante ,Processus A Il faut d'abord produire les données ,Processus B Pour lire les données , Il y a donc un ordre d'exécution avant et après .

À ce moment - là , Pour réaliser la synchronisation multi - processus en utilisant des sémaphores , Nous pouvons initialiser le sémaphore à ?0.

image.png

Processus spécifiques:

  • Si le processus B Plus que le processus A D'abord exécuté , Alors exécutez jusqu'à P Fonctionnement, Parce que la valeur initiale du sémaphore est 0, Donc le sémaphore devient -1,Processus de représentation A Pas encore de données de production , Alors le processus B Bloquez l'attente ;
  • Et voilà., Quand le processus A Après la production des données ,Mise en œuvre V Fonctionnement, Ça va changer la quantité de signal en 0, Et ça va réveiller le blocage dans P Processus d'opération B;
  • Enfin,Processus B Après avoir été réveillé , Ça veut dire que le processus A Les données ont été produites , Alors le processus B Pour que les données puissent être lues normalement .

On peut le découvrir., Le signal est initialisé à ?0, Ça veut dire que Synchro sémaphore , Ça garantit le processus A Devrait être dans le processus B Précédemment appliqué.


Signal

La communication inter - processus décrite ci - dessus , Sont des modes de fonctionnement normaux . Pour les modes de fonctionnement dans des conditions anormales , J'ai besoin de 「Signal」 Pour informer le processus .

Signal et sémaphore, bien que le nom soit similaire 66.66%, Mais l'utilisation des deux est complètement différente ,C'est comme... Java Et JavaScript La différence entre.

In Linux Dans le système d'exploitation, En réponse à une grande variété d'événements , Des dizaines de types de signaux , Chacun représente un sens différent .On peut passer par?kill -l?Les ordres, Voir tous les signaux :

$ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.

Enfin

Après des mois et des jours, Ce qui suit est une compréhension approfondie de l'inductionJavaDocumentation de la machine virtuelle,J'espère que cela vous aidera à réussir l'entrevue.
Comme l'ensemble du document est assez complet,Plus de contenu,L'espace n'est pas autorisé,Voici une capture d'écran .Si vous avez des amis qui ont besoin de documents d'information, Disponible gratuitement en cliquant ici






En raison des limites d'espace,La documentation détaillée est trop complète,Trop de détails,Donc juste une capture d'écran de quelques points de connaissance pour une introduction approximative,Chaque petit noeud a un contenu plus détaillé!

Copyright:Cet article est[Cxyyidd]Établi,Veuillez apporter le lien original pour réimprimer,remercier。 https://fra.fheadline.com/2021/08/20210819224453298o.html