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