domingo, 28 de diciembre de 2014

Guardar matriz en Memoria Compartida

Ya sabemos que no se pueden almacenar punteros en memoria compartida (las direcciones de memoria son diferentes para diferentes procesos). Esto acarrea que no se puedan crear vectores multidimensionales de la manera "tradicional" ( int ** ). 
La solución esta en emular las matrices al puro estilo de malloc (método index magic)

Supongamos que queremos declarar una matriz de enteros de 5x5 en memoria compartida.

El tamaño de la memoria será: el tamaño del tipo de dato multiplicado por la cantidad de columnas y la cantidad de filas.

int id_Memoria = shmget (key,sizeof(int) * 5 * 5, 0777 | IPC_CREAT);



Ahora para acceder a la memoria sería:

// nCol = Cantidad de columnas de la matriz
matriz[x][y] ----> matriz[y * nCol + x];



Ejemplo con código:



  1. int nFil = 5; // numero de filas
  2. int nCol = 5; // numero de columnas
  3. int row, column;
  4. int *matrix;
  5.  
  6. // Crea el segmento de memoria compartida
  7. id_shmem = shmget(ipc_key, sizeof(int)*nFil*nCol, IPC_CREAT|0777); 

  8. matrix = (int *)shmat(id_shmem, 0, 0);
  9.  
  10. matrix[3*nCol + 2] = 1; // Equivalente a matrix[2][3]   


Links: 

http://stackoverflow.com/questions/1961504/is-it-possible-to-allocate-a-2d-array-as-shared-memory-with-ipc

1 comentario:

  1. Buenísimo!
    Busqué "matriz memoria compartida c" y fue lo primero que me apareció.
    Me sirvió, gracias!

    ResponderEliminar