Quelques informations sur la mémoire partagée


La mémoire partagée (« shared memory ») permet, comme son nom l'indique, de partager des données entre processus. Elle est surtout utile lorsque 2 processus, issus d'un « fork() » par exemple, veulent partager des données. En effet, vous devez vous rappeler que le « fork() » crée 2 processus clones avec des segments de mémoire propres à chacun (pas d'échange possible). Lorsque l'on utilise des threads c'est un peu moins utile puisque ceux-ci partagent par défaut les variables globales d'un programme. De nombreuses applications utilisent la mémoire partagée, la première étant évidemment le système d'exploitation, qui partage des segments de code ou de données entre plusieurs fonctions.

Un espace mémoire partagé est créé en dehors de tous les processus (il est géré directement par le système d'exploitation). Chaque processus qui veut utiliser cette espace mémoire (en lecture et/ou en écriture) doit « attacher » le segment de mémoire partagé à son propre espace d'adressage virtuel. Le système tient à jour un compteur du nombre de processus qui ont attaché l'espace commun à leur espace propre, ainsi que les PID/UID/GID du créateur de l'espace partagé. Lorsqu'un processus ne se sert plus de la mémoire partagée, il la « détache » de son espace virtuel. Lorsque plus aucun processus n'utilise l'espace, il est marqué « à supprimer » par le système (généralement, c'est le processus créateur qui marque l'espace à supprimer). Il faut bien faire attention à libérer la mémoire partagée car la taille disponible n'est pas très importante. Évidemment, la mémoire partagée est allouée par pages, donc par morceaux de 4ko sur vos machines.

Les opérations en C pour la mémoire partagée sont :
Pour avoir une information sur un segment de mémoire, on utilise la même fonction shmctl(int, IPC_STAT, struct shmid_ds). La structure regroupe plusieurs variables. D'après le manuel (« man shmctl »), la structure contient :

struct shmid_ds {
             struct ipc_perm shm_perm;   /* Propriétaire et permissions      */
             int             shm_segsz;  /* Taille segment en octets         */
             time_t          shm_atime;  /* Heure dernier attachement        */
             time_t          shm_dtime;  /* Heure dernier détachement        */
             time_t          shm_ctime;  /* Heure dernier changement         */
             unsigned short  shm_cpid;   /* PID du créateur                  */
             unsigned short  shm_lpid;   /* PID du dernier shmat(2)/shmdt(2) */
             short           shm_nattch; /* Nombre d’attachements            */
           };

On voit que la structure en contient une autre : struct ipc_perm, qui contient les permissions sur le segment partagé (cf. man).