Categorías: Programacion

Programacion paralela en C : Memoria compartida


Si el otro día hablábamos de los inicios en programación paralela, hoy os vengo a hablar del paso de datos cuando realizamos un programa con varios procesos. Como repaso del otro día podemos decir que hay dos tipos de intercambio de datos, memoria compartida ( todos acceden a la misma posición de memoria) y paso de mensajes (se envía los datos a un proceso en concreto).

¿Qué es la memoria compartida?

Cuando nosotros creamos un proceso, se reserva una zona de memoria con acceso exclusivo para nuestro proceso, de tal manera que si otro proceso quiere acceder a esta zona de memoria, generalmente nos dará un error. El error suele aparecer con cierta frecuencia cuando no manejamos bien los punteros en C y es el famoso segmentation fault.

Sin embargo hay una manera de indicarle al sistema operativo, que esa zona de memoria sí va a poder ser accedida por varios procesos. Para ello tenemos que utilizar una función especial, no nos valen las funciones de reserva de memoria dinámica habituales (malloc y calloc).

Para ello vamos a utilizar las funciones del tipo shm, abreviatura de Shared Memory (memoria compartida):

#include <stdio.h>
#include <stdlib.h>
#include <sys/shm.h> //Memoria compartida
#include <sys/ipc.h>
#include <string.h>

#define TAM 1024

int main(){
    int pid,memoriaID;
    char *punteroAMemoriaCompartida = NULL;
    puts("Vamos a usar memoria compartida con varios procesos");
    
    if((memoriaID = shmget(1315511,TAM,0664|IPC_CREAT))==-1) { //El primer valor es un identificador unico, puede dar problemas
        fprintf(stderr,"Error al reservar la memoria");
    } //Creo la memoria compartida
    
    pid = fork();
    switch(pid) {
        case -1:
            fprintf(stderr,"Error al hacer el fork");
        break;
        case 0: //El hijo
            punteroAMemoriaCompartida = shmat(memoriaID,(void *)0,0); //Asociacion
            puts("Soy el hijo");
            strcpy(punteroAMemoriaCompartida,"Somos Binarios");
        break;
        default:
            sleep(5); //Se explicara mas adelante
            punteroAMemoriaCompartida = shmat(memoriaID,NULL,0); //Asociacion
            puts("Soy el padre");
            printf("Texto en memoria compartida: %s\n",punteroAMemoriaCompartida);
            
            shmdt(&punteroAMemoriaCompartida); //Desasociacion
            if(shmctl(memoriaID,IPC_RMID,NULL)==-1){
                fprintf(stderr,"Error al liberar la memoria");
            }
        break;          
    }   
    return 0;
}

Con este código, vemos como se reserva una zona de memoria compartida (hay un pequeño “truco” con el sleep que más adelante será comentado). En este caso el hijo escribe Somos Binarios en memoria compartida y el padre lo lee y lo muestra por pantalla:

Jorge Durán

Entusiasta de la tecnología desde los 10 años, desarrollador y creador de varios proyectos de software y autodidacta por naturaleza. Ingeniero Informático por la USAL y .Net backend developer en idealista.

Share
Publicado por
Jorge Durán

Recent Posts

Docker: conceptos principales y tutorial paso a paso

Hoy queremos hablaros de Docker un proyecto que cada día es más usado, porque permite…

3 años hace

Crea diagramas rápidamente usando código

Cada vez estamos más acostumbrados a usar código para generar la infraestructura (IaC), documentar nuestro…

3 años hace

Procesamiento del lenguaje natural con ElasticSearch

Uno de los problemas que se presentan con una mayor frecuencia hoy en día, es…

4 años hace

Elige tecnología clásica y aburrida

Uno de los problemas que solemos tener los programadores, es que nos gusta estar a…

4 años hace

Cómo usar Docker en Windows

Docker es una de las herramientas más usadas por los desarrolladores, sin embargo, usarlo en…

4 años hace

Analiza el coste del uso de JavaScript

Como seguramente sabrás el uso de JavaScript ha crecido exponencialmente en los últimos tiempos, sin…

5 años hace