Suppression de la mémoire partagée avec ipcrm sous Linux

je travaille avec une application de mémoire partagée, et pour supprimer les segments j'utilise la commande suivante:

 ipcrm -M 0x0000162e (this is the key)

Mais je ne sais pas si je fais les bonnes choses, parce que quand je lance ipcs je vois le même segment mais avec la clé 0x0000000. Donc le segment de mémoire est vraiment effacé? Quand j'exécute mon application plusieurs fois, je vois différents segments de mémoire avec la touche 0x000000, comme ceci:

 key        shmid      owner      perms      bytes      nattch     status
 0x00000000 65538      me         666        27         2          dest 
 0x00000000 98307      me         666        5          2          dest 
 0x00000000 131076     me         666        5          1          dest
 0x00000000 163845     me         666        5          0

Ce qui se passe réellement? Est le segment de mémoire vraiment supprimé?

Edit: le problème était - comme indiqué ci - dessous dans la réponse acceptée-qu'il y avait deux processus utilisant la mémoire partagée, jusqu'à ce que tout le processus soit fermé, le segment de mémoire ne va pas disparaître.

20
demandé sur Endre 2008-12-30 01:20:04

2 réponses

je me souviens vaguement de mes jours UNIX (AIX et HPUX, j'admets que je n'ai jamais utilisé de mémoire partagée sous Linux) que la suppression marque simplement le bloc comme n'étant plus attachable par les nouveaux clients.

il ne sera physiquement supprimé qu'à un moment donné après qu'il n'y aura plus de processus attachés à lui.

c'est la même chose que pour les fichiers réguliers qui sont supprimés, leurs informations de répertoire sont supprimées mais le contenu du fichier ne disparaît qu'après la fermeture du dernier processus. Cela conduit parfois à enregistrer des fichiers qui occupent de plus en plus d'espace sur le système de fichiers, même après leur suppression car les processus leur écrivent encore, conséquence du "détachement" entre un pointeur de fichier (le zéro ou plusieurs entrées de répertoire pointant vers une inode) et le contenu du fichier (l'inode lui-même).

Vous pouvez voir à partir de votre ipcs sortie que 3 des 4 ont encore des processus attachés de sorte qu'ils n'iront nulle part jusqu'à ce que ces processus se détachent de la mémoire partagée bloc. L'autre attend probablement une fonction de "balayage" pour le nettoyer, mais cela dépendra bien sûr de l'implémentation de la mémoire partagée.

un client bien écrit de mémoire partagée (ou de fichiers journaux pour cette matière) devrait périodiquement se réattaquer (ou se retourner) pour s'assurer que cette situation est transitoire et n'affecte pas le fonctionnement du logiciel.

21
répondu paxdiablo 2010-06-30 05:36:32

Vous avez dit que vous avez utilisé la commande suivante

ipcrm -M 0x0000162e (this is the key)

à Partir de la page de man pour ipcrm

 -M shmkey
         Mark the shared memory segment associated with key shmkey for
         removal.  This marked segment will be destroyed after the
         last detach.

ainsi le comportement des options-M fait exactement ce que vous avez observé, c'est-à-dire mettre le segment à détruire seulement après le dernier détachement.

12
répondu hhafez 2008-12-29 22:52:22