GNU/Linux >> Tutoriels Linux >  >> Linux

Mécanismes de verrouillage pour la cohérence de la mémoire partagée

Donc, en faisant des recherches, j'ai découvert que les sémaphores System V ont un indicateur appelé SEM_UNDO qui peut inverser l'état de verrouillage lorsque le programme échoue, mais ce n'est pas garanti de fonctionner.

SEM_UNDO déverrouillerait le sémaphore en cas de plantage du processus. Si les processus se sont écrasés en raison de la corruption de la mémoire partagée, les sémaphores ne peuvent rien faire pour vous. Le système d'exploitation ne peut pas annuler l'état de la mémoire partagée.

Si vous devez pouvoir restaurer l'état de la mémoire partagée, vous devez implémenter quelque chose par vous-même. J'ai vu au moins deux modèles qui traitent de cela.

Le premier modèle avant de modifier quoi que ce soit dans la mémoire partagée prenait un instantané de la structure, en l'enregistrant dans une liste dans la mémoire partagée. Si un autre processus était capable d'obtenir le verrou et que la liste n'était pas vide, il annulait tout ce que le processus planté avait pu changer.

Le deuxième modèle consiste à faire des copies des structures shm dans la mémoire locale et à garder le verrou verrouillé pour toute la transaction. Lorsque la transaction est validée, avant de libérer le verrou, copiez simplement les structures de la mémoire locale dans la mémoire partagée. La probabilité que l'application plante pendant la copie est plus faible et l'intervention de signaux externes peut être bloquée en utilisant sigprocmask() . (Le verrouillage dans le cas vaut mieux être bien partitionné sur les données. Par exemple, j'ai vu des tests avec un ensemble de 1000 verrous pour 10 millions d'enregistrements dans shm accessibles par 4 processus simultanés.)


Il n'y a que peu de choses qui sont garanties d'être nettoyées en cas d'échec d'un programme. La seule chose qui me vient à l'esprit ici est le nombre de liens. Un descripteur de fichier ouvert augmente le nombre de liens de l'inode sous-jacent et une fermeture correspondante le diminue, y compris une fermeture forcée lorsque le programme échoue.

Ainsi, vos processus pourraient tous ouvrir un fichier commun (ne vous souvenez pas si cela fonctionne pour les segments de mémoire partagée) et vous pourriez déclencher une sorte d'alarme si le nombre diminue, alors qu'il ne devrait pas. Par exemple, au lieu de faire une simple attente, vos processus pourraient faire une attente temporisée (pendant une seconde, par exemple) dans une boucle et interroger le nombre de liens pour être alerté lorsque quelque chose ne va pas.


Linux
  1. Linux - Limiter l'utilisation de la mémoire pour un seul processus Linux ?

  2. Interroger la liste des serveurs pour la mémoire/processeur alloué ?

  3. "quel" équivalent pour les bibliothèques partagées ?

  4. Exemples de commandes ipcs sous Linux

  5. Recommandation de communication inter-processus

Comment créer un répertoire partagé pour tous les utilisateurs sous Linux

Comment vérifier la mémoire partagée Linux à l'aide de la commande ipcs

Détecter les bibliothèques partagées obsolètes en mémoire avec UChecker

Supprimer la mémoire partagée posix lorsqu'elle n'est pas utilisée ?

Mémoire partagée Linux :shmget() vs mmap() ?

Utilisation de fichiers pour la mémoire partagée IPC