API de memoria compartida POSIX

Hay varios mecanismos IPC disponibles para los sistemas POSIX, incluida la memoria compartida y el paso de mensajes. Aquí, exploramos la API POSIX para la memoria compartida.

La memoria compartida POSIX se organiza mediante archivos asignados a la memoria, que asocian la región de la memoria compartida con un archivo. Un proceso primero debe crear un objeto de memoria compartida utilizando la llamada al sistema shm_open(), de la siguiente manera:

shm_fd = shm_open(name, O_CREAT | O_RDWR, 0666);
Parameters:
name: The first parameter specifies the name of the shared-memory object. 
Processes that wish to access this shared memory must refer to the 
object by this name.
O_CREAT | O_RDWR : The subsequent parameters specify that the shared-memory 
object is to be created if it does not yet exist (O_CREAT) and that the object is 
open for reading and writing (O_RDWR).

The last parameter establishes the directory permissions of the 
shared-memory object.

Una llamada exitosa a shm_open() devuelve un descriptor de archivo entero para el objeto de memoria compartida. Una vez que se establece el objeto, se usa la función ftruncate() para configurar el tamaño del objeto en bytes. La llamada

 ftruncate(shm_fd, 4096);

establece el tamaño del objeto en 4.096 bytes. Finalmente, la función mmap() establece un archivo mapeado en memoria que contiene el objeto de memoria compartida. También devuelve un puntero al archivo asignado a la memoria que se utiliza para acceder al objeto de memoria compartida.
 

Programas que muestran la API de memoria compartida POSIX para productores y consumidores 

C

//C program for Producer process illustrating POSIX shared-memory API.
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <sys/mman.h>
 
int main()
{
    /* the size (in bytes) of shared memory object */
    const int SIZE = 4096;
 
    /* name of the shared memory object */
    const char* name = "OS";
 
    /* strings written to shared memory */
    const char* message_0 = "Hello";
    const char* message_1 = "World!";
 
    /* shared memory file descriptor */
    int shm_fd;
 
    /* pointer to shared memory object */
    void* ptr;
 
    /* create the shared memory object */
    shm_fd = shm_open(name, O_CREAT | O_RDWR, 0666);
 
    /* configure the size of the shared memory object */
    ftruncate(shm_fd, SIZE);
 
    /* memory map the shared memory object */
    ptr = mmap(0, SIZE, PROT_WRITE, MAP_SHARED, shm_fd, 0);
 
    /* write to the shared memory object */
    sprintf(ptr, "%s", message_0);
 
    ptr += strlen(message_0);
    sprintf(ptr, "%s", message_1);
    ptr += strlen(message_1);
    return 0;
}

C

// C program for Consumer process illustrating
// POSIX shared-memory API.
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <sys/mman.h>
 
int main()
{
    /* the size (in bytes) of shared memory object */
    const int SIZE = 4096;
 
    /* name of the shared memory object */
    const char* name = "OS";
 
    /* shared memory file descriptor */
    int shm_fd;
 
    /* pointer to shared memory object */
    void* ptr;
 
    /* open the shared memory object */
    shm_fd = shm_open(name, O_RDONLY, 0666);
 
    /* memory map the shared memory object */
    ptr = mmap(0, SIZE, PROT_READ, MAP_SHARED, shm_fd, 0);
 
    /* read from the shared memory object */
    printf("%s", (char*)ptr);
 
    /* remove the shared memory object */
    shm_unlink(name);
    return 0;
}

Los programas anteriores se pueden compilar escribiendo los siguientes comandos en la terminal abierta en el directorio de trabajo:

gcc producer.c -pthread -lrt -o producer
gcc consumer.c -pthread -lrt -o consumer
./consumer & ./producer & 

Esto debería generar lo siguiente:

HelloWorld!

Los programas anteriores utilizan el modelo productor-consumidor para implementar la memoria compartida. 

  • El productor establece un objeto de memoria compartida y escribe en la memoria compartida, y el consumidor lee de la memoria compartida.
  • El productor crea un objeto de memoria compartida llamado OS y escribe la famosa string «¡Hola mundo!» a la memoria compartida.
  • El programa mapea en memoria un objeto de memoria compartida del tamaño especificado y permite escribir en el objeto. (Obviamente, solo la escritura es necesaria para el productor).
  • La bandera MAP SHARED especifica que los cambios en el objeto de memoria compartida serán visibles para todos los procesos que comparten el objeto. Observe que escribimos en el objeto de memoria compartida llamando a la función sprintf() y escribiendo la string formateada en el puntero ptr.
  • Después de cada escritura, debemos incrementar el puntero por el número de bytes escritos. El proceso consumidor lee y genera el contenido de la memoria compartida.
  • El consumidor también invoca la función shm_unlink(), que elimina el segmento de memoria compartida después de que el consumidor haya accedido a él.

Referencias 
Conceptos del sistema operativo de Silberschatz 

http://www.cse.cuhk.edu.hk/~ericlo/teaching/os/lab/7-IPC2/sync-pro.html

Este artículo es una contribución de Mayank Rana . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *