IPC a través de memoria compartida

La comunicación entre procesos a través de la memoria compartida es un concepto en el que dos o más procesos pueden acceder a la memoria común. Y la comunicación se realiza a través de esta memoria compartida donde los cambios realizados por un proceso pueden ser vistos por otro proceso.

El problema con las canalizaciones, fifo y la cola de mensajes es que dos procesos intercambian información. La información tiene que pasar por el kernel.

  • El servidor lee del archivo de entrada.
  • El servidor escribe estos datos en un mensaje utilizando una tubería, fifo o cola de mensajes.
  • El cliente lee los datos del canal IPC, nuevamente requiriendo que los datos sean copiados desde el búfer IPC del kernel al búfer del cliente.
  • Finalmente, los datos se copian del búfer del cliente.
  • Se requiere un total de cuatro copias de datos (2 de lectura y 2 de escritura). Entonces, la memoria compartida proporciona una forma de permitir que dos o más procesos compartan un segmento de memoria. Con la memoria compartida, los datos solo se copian dos veces: del archivo de entrada a la memoria compartida y de la memoria compartida al archivo de salida.

    LAS LLAMADAS AL SISTEMA UTILIZADAS SON:

    ftok() : se utiliza para generar una clave única.

    shmget() : int shmget(key_t,size_tsize,intshmflg); al completarse con éxito, shmget() devuelve un identificador para el segmento de memoria compartida.

    shmat() : antes de que pueda usar un segmento de memoria compartida, debe adjuntarse
    a él usando shmat(). vacío *shmat(int shmid ,void *shmaddr ,int shmflg);
    shmid es una identificación de memoria compartida. shmaddr especifica una dirección específica para usar, pero debemos establecerlo
    en cero y el sistema operativo elegirá automáticamente la dirección.

    shmdt() : cuando haya terminado con el segmento de memoria compartida, su programa debería
    separarse de él usando shmdt(). int shmdt(void *shmaddr);

    shmctl() : cuando se desconecta de la memoria compartida, no se destruye. Entonces, para destruir
    se usa shmctl(). shmctl(int shmid,IPC_RMID,NULL);

    MEMORIA COMPARTIDA PARA EL PROCESO DE ESCRITOR

    #include <iostream>
    #include <sys/ipc.h>
    #include <sys/shm.h>
    #include <stdio.h>
    using namespace std;
      
    int main()
    {
        // ftok to generate unique key
        key_t key = ftok("shmfile",65);
      
        // shmget returns an identifier in shmid
        int shmid = shmget(key,1024,0666|IPC_CREAT);
      
        // shmat to attach to shared memory
        char *str = (char*) shmat(shmid,(void*)0,0);
      
        cout<<"Write Data : ";
        gets(str);
      
        printf("Data written in memory: %s\n",str);
          
        //detach from shared memory 
        shmdt(str);
      
        return 0;
    }

    MEMORIA COMPARTIDA PARA PROCESO DE LECTOR

    #include <iostream>
    #include <sys/ipc.h>
    #include <sys/shm.h>
    #include <stdio.h>
    using namespace std;
      
    int main()
    {
        // ftok to generate unique key
        key_t key = ftok("shmfile",65);
      
        // shmget returns an identifier in shmid
        int shmid = shmget(key,1024,0666|IPC_CREAT);
      
        // shmat to attach to shared memory
        char *str = (char*) shmat(shmid,(void*)0,0);
      
        printf("Data read from memory: %s\n",str);
          
        //detach from shared memory 
        shmdt(str);
        
        // destroy the shared memory
        shmctl(shmid,IPC_RMID,NULL);
         
        return 0;
    }

    Producción:

Publicación traducida automáticamente

Artículo escrito por shubham_rana_77 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 *