Où se trouve la mémoire partagée Linux?

Je voulais juste savoir où la mémoire partagée réside dans un système Linux? Est-ce dans la mémoire physique ou la mémoire virtuelle?

Je suis conscient de la boîte d’envoi de la mémoire virtuelle du processus, ils diffèrent d’un processus à l’autre et les processus ne se voient pas, mais nous pouvons transmettre les données entre les processus à l’aide d’IPC. Pour mettre en œuvre le scénario simple, je viens de créer un programme de mémoire partagée simple et d’essayer d’imprimer l’adresse de la mémoire partagée et le retour de valeur de la fonction shmat , mais les deux processus ont une adresse différente mais une même valeur.

Voici le programme d’écriture.

écrire.c

 #include  #include  #include  int main() { key_t key=1235; int shm_id; void *shm; int *ptr = 83838; shm_id = shmget(key,10,IPC_CREAT | 0666); shm = shmat(shm_id,NULL,NULL); sprintf(shm,"%d",ptr); printf("Address is %p, Value is %p \n", (void *)shm, (void *)&ptr); printf("Shm value is %d \n", *(int *)shm); return; } 

Voici le programme de lecture.

read.c

 #include  #include  #include  #include  int main() { key_t key=1235; int shm_id; void *shm; int *p = (int *)malloc(sizeof(int)); shm_id = shmget(key,10,NULL); shm = shmat(shm_id,NULL,NULL); if(shm == NULL) { printf("error"); } sscanf(shm,"%d",p); printf("Address is %p %p %p %d\n",(void *)shm, (void *)p, (void *)&p, *p); printf("Shared value is %d \n", *(int *)shm); return 0; } 

Ce serait bien si quelqu’un pouvait expliquer en détail comment les processus voyaient la même valeur malgré des adresses différentes?

Cette question provient du pointeur C passe void utilisant la mémoire partagée .

Merci.

Toute mémoire engagée est physique.

Cependant, les processus ne peuvent pas traiter directement la mémoire physique. Ils ont des adresses virtuelles que le kernel va résoudre en adresses physiques. Lorsqu’une région de mémoire partagée est configurée, le même emplacement de mémoire physique est traité par les processus multiples. Cependant, les adresses virtuelles peuvent être différentes. Chaque processus utilise l’adresse virtuelle reçue uniquement dans son propre contexte. Les deux adresses virtuelles se réfèrent à la même mémoire physique.


Pour élaborer, dans le cas d’une région de mémoire partagée, la même adresse de mémoire physique est adressable par plusieurs processus simultanément car les deux processus ont des adresses virtuelles qui pointent vers la même adresse physique.

Par exemple, considérez ce qui suit:

  • adresse virtuelle V1 (en contexte de processus T1 )
  • adresse virtuelle V2 (en contexte T2 en cours)

sont tous deux dirigés vers la région de mémoire partagée.
C’est en fait une adresse physique commune P.

À présent,
Processus T1 référençant l’adresse virtuelle V1
OU
Processus T2 référençant l’adresse virtuelle V2

entraînera un access à l’adresse physique P car le kernel traduit les deux adresses virtuelles sur le même emplacement physique en mémoire.


Par exemple, dans le diagramme suivant, la mémoire physique PFN4 est partagée par les processus X et Y utilisant VPFN3 et VPFN1 dans leurs contextes respectifs.

Cartes de mémoire virtuelle pour 2 processus