Annuaire d'articles
1. Mémoire partagée du Système V
Le système est un ensemble de normes, indépendant du système de fichiers, et est un module de noyau spécialement conçu pour la communication par le système.Il est appelé mécanisme de communication IPC du système V.
La principale méthode de partage de mémoire consiste à permettre à deux processus non liés de voir la même ressource.
1. Principe
Dans l'espace d'adressage du processus, il existe une zone partagée entre la pile et la zone du tas. Le tas grandit vers le haut et la pile vers le bas. La zone de chevauchement est la zone partagée, où la bibliothèque dynamique est stockée. Ouvrez un espace dans la mémoire physique, mappez cet espace à la zone partagée, puis renvoyez l'adresse de départ de cet espace à l'utilisateur ; de la même manière, un autre processus fait de même, afin que deux processus puissent accéder au même espace dans la mémoire physique.
S'il n'est plus partagé, le processus peut annuler la relation de mappage, c'est-à-dire modifier la table des pages, puis libérer la mémoire partagée de l'espace d'adressage, et enfin libérer la mémoire partagée de la mémoire physique, afin qu'elle ne soit plus partagée. être partagé.
2. Implémentation des simulations
Analysez le code par rapport aux mots suivants, en commençant par le fichier server.cc.
shmget, demande d'une mémoire partagée System V, est une interface d'appel système, size est la taille du bloc de mémoire demandé, shmflg est une lettre majuscule, utilisée pour le fonctionnement réel, écrite dans le code. Une fois cette fonction créée avec succès, elle renverra un identifiant de la mémoire partagée. Cet indice est différent de l'indice de fichier, il est donc en fait moins utilisé et la méthode d'utilisation des fichiers sera plus générale. Le paramètre key doit être défini avec la fonction ftok, et ftok combine l'identifiant et le chemin du projet transmis pour générer la clé.
Le principe de la mémoire partagée est écrit ci-dessus. Il n'y a pas qu'une seule mémoire partagée dans le système, ni plus de deux processus partageant la mémoire, il y aura donc plusieurs mémoires dans le système en même temps. Leur gestion par le système est pour les décrire et les organiser d'abord, et créer une structure pour stocker tous les attributs de la mémoire partagée.
Pour la couche inférieure, la gestion de la mémoire partagée devient la gestion des structures : tant que deux processus peuvent obtenir les mêmes données, ils peuvent accéder à la même mémoire partagée. Mais le système dispose de beaucoup de mémoire partagée, comment deux processus peuvent-ils garantir qu’ils accèdent à une seule mémoire ? Voici la clé de la fonction ftok. Un processus crée une mémoire partagée, spécifie un chemin et transmet un identifiant pour former une clé. La clé sera renseignée dans la structure de la mémoire partagée, et un autre processus appelle également le ftok fonction. S'il utilise le même chemin et le même identifiant, il générera également une clé, puis les deux clés correspondront, qui doivent être égales, afin que la même ressource soit accessible.
Le processus lié à la mémoire partagée est terminé, mais la mémoire est toujours là. Comment déterminer l’existence d’une mémoire partagée ?
ipc
Regardez la colonne Segments de mémoire partagée, ou vous pouvez ajouter -m pour simplement regarder cette colonne. ipcrm peut être utilisé pour supprimer la mémoire partagée, mais doit-elle être supprimée en fonction de la clé ou du shmid ?
shmid est l'identifiant de la mémoire partagée renvoyé par la fonction shmget, qui équivaut à fd. La clé est utilisée dans le système, ce qui équivaut à l'inode de la mémoire partagée. Shmid est utilisé au niveau de l'utilisateur. Les instructions se trouvent au niveau de la couche utilisateur, au-dessus de la couche d'interface système. Supprimez la commande ipcrm -m shmid.
shmctl
Cela reflète également un problème. La mémoire partagée ne suit pas le processus. Le fichier d'implémentation de simulation écrit est généré dans un programme exécutable, appelé et effacé, puis appelé à nouveau. Le serveur échouera car il n'est pas nécessaire de le créer à nouveau, et le client peut l'obtenir et le télécharger en même temps. La mémoire partagée dépend du système d'exploitation. En plus de la suppression des commandes, l'interface système peut également être appelée.
Bien que la mémoire partagée soit créée, elle ne peut pas être utilisée directement et la fonction shmat est utilisée.
L'adresse de la mémoire partagée obtenue par l'utilisateur est une adresse virtuelle. Le shmaddr dans le paramètre shmat fait référence à l'endroit où il est placé dans l'espace d'adressage, il est donc généralement défini sur Aucun et laisse le système le faire lui-même. shmflg peut définir les attributs du bloc mémoire, s'il vaut 0, il est lisible et inscriptible.
3. Taille de la mémoire partagée
Dans le code ci-dessus, gsize = 4096. Si vous utilisez ipcs -m pour afficher le processus en cours d'exécution, vous pouvez voir que la taille de la mémoire partagée que nous avons ouverte est de 4096. Cette taille peut être modifiée. La taille de la mémoire partagée est basée sur la page PAGE et elle est alignée vers le haut sur la PAGE. Le système alloue la mémoire en unités de pages, et cette page a une taille de 4 Ko, qui est le fichier et bloc de données de disque. L'unité d'E/S. Mais si nous définissons gsize sur 4097, la taille de la mémoire partagée devrait être de 4096 * 2, car 4097 dépasse 4096, selon la règle d'alignement sur PAGE, elle devrait être 4096 fois deux fois, mais maintenant elle est de 4097 par commande. En fait, la capacité a été étendue, mais le système est effectivement aligné pour doubler le 4096, mais je n'utilise que 4097 et la taille de la mémoire partagée est de 4097.
-------------------------------------------------- -------------------------------------------------- --------------------------------------------
4. Caractéristiques de la mémoire partagée
La mémoire partagée n'utilise pas l'interface d'appel système, car la mémoire partagée est mappée sur l'espace d'adressage du processus, cela a été vu et aucun utilisateur n'a besoin de faire quoi que ce soit. C'est précisément grâce à cette fonctionnalité que le nombre de copies peut être réduit lorsque les processus communiquent, la mémoire partagée est donc la communication la plus rapide entre tous les processus.
Selon le code ci-dessus, si le client n'appelle pas, il n'y a pas de contenu dans la mémoire partagée et seul le serveur est appelé, le lecteur du serveur lira et imprimera toujours vide, et le pipeline bloquera le lecteur et attendra que le rédacteur commence à écrire avant de continuer la lecture, il n'y a donc aucun mécanisme de protection de la mémoire partagée (exclusion mutuelle synchrone).
Pourquoi la mémoire partagée présente-t-elle cette lacune apparemment fatale ? Le pipeline communique via l'interface système, et l'interface système gère les données lorsqu'elle est appelée à l'intérieur du système ; la mémoire partagée communique directement.