Solo quería saber dónde reside la memoria compartida en un sistema Linux. ¿Está en la memoria física o en la memoria virtual?
Soy consciente de los cuadros de envío de memoria virtual del proceso, son diferentes de un proceso a otro y los procesos no ven la memoria de los demás, pero podemos pasar los datos entre procesos usando IPC. Para implementar el escenario simple, acabo de crear un programa de memoria compartida simple e intento imprimir la dirección de memoria compartida y el valor devuelto por la función shmat
, sin embargo, los procesos tienen direcciones diferentes pero los mismos valores.
Aquí está el programa de escritura.
escribir.c
#include <sys/ipc.h> #include <sys/shm.h> #include <stdio.h> 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; }
Aquí está el programa lector.
leer.c
#include <sys/ipc.h> #include <sys/shm.h> #include <stdio.h> #include <stdlib.h> 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; }
Sería genial si alguien pudiera explicar en detalle cómo los procesos ven el mismo valor a pesar de tener diferentes direcciones.
Esta pregunta proviene del puntero vacío de paso C usando memoria compartida .
Toda memoria que se compromete es física.
Sin embargo, los procesos no pueden dirigirse directamente a la memoria física. Tienen direcciones virtuales que el núcleo resolverá en direcciones físicas. Cuando se configura una región de memoria compartida, los múltiples procesos se dirigen a la misma ubicación de memoria física. Sin embargo, las direcciones virtuales pueden ser diferentes. Cada proceso usa la dirección virtual que recibió solo en su propio contexto. Ambas direcciones virtuales se refieren a la misma memoria física.
Para elaborar, en el caso de una región de memoria compartida, la misma dirección de memoria física es direccionable por múltiples procesos simultáneamente ya que ambos procesos tienen direcciones virtuales que apuntan a la misma dirección física.
Por ejemplo considere lo siguiente:
ambos apuntan a la región de memoria compartida.
Esta es en realidad una dirección física común P .
Ahora,
Proceso T1 que hace referencia a la dirección virtual V1
O
Proceso T2 que hace referencia a la dirección virtual V2
dará como resultado un acceso a la dirección física P ya que el kernel traduce ambas ubicaciones de direcciones virtuales a la misma ubicación física en la memoria.
Por ejemplo, en el siguiente diagrama, la memoria física PFN4 es compartida por los procesos X e Y usando VPFN3 y VPFN1 en sus respectivos contextos (PFN significa Page Frame Number).