Resumen de aprendizaje de la comunicación entre

  

para usar la memoria compartida, debe tener los siguientes pasos: 1 abre una shmget memoria compartida () 2 permite que el actual proceso de usar una compartida shmat bloque de memoria común () 3 de escritura /lectura 4. prohibición de este proceso utiliza esta shmdt memoria compartida () 5. Suprimir esta shmctl memoria compartida () o la línea de comandos ipcrm

memoria compartida puede decirse que es uno de los más útiles modelo de comunicación proceso, que es el más rápido forma IPC. Dos procesos diferentes A, medios de memoria compartida B es la misma memoria física se asigna al proceso A B propio espacio, dirección de proceso. Un proceso se puede ver al instante actualizar datos de la memoria compartida de proceso B, y viceversa. Debido a múltiples procesos comparten la misma región de la memoria, la necesidad inevitable algún tipo de mecanismo de sincronización, las cerraduras de exclusión mutua y semáforos pueden ser.

a: Conceptos

beneficio obvio de utilizar una comunicación de memoria compartida de alta eficiencia, ya que el proceso puede ser directamente leer y escribir en la memoria, sin la necesidad de cualquier copia de datos. Como conducto para la comunicación y colas de mensajes, se requiere copia de datos en el espacio de cuatro núcleo y el usuario, y la única copia de los datos de la memoria compartida en dos ocasiones [1]: una desde el archivo de entrada a la zona de memoria compartida, compartida desde otro área de memoria al archivo de salida. De hecho, en la memoria compartida entre los procesos no siempre hay una pequeña cantidad de datos de lectura y escritura no asignado después, cuando hay una nueva comunicación, re-establecer un área de memoria compartida. Sin embargo, mantener el área compartida, hasta que se complete la comunicación, por lo que los datos de contenido se ha almacenado en la memoria compartida, y no escribir el archivo. memoria compartida contenido es a menudo sólo cuando se escribe en el archivo para levantar el mapa. Por lo tanto, la eficacia de la comunicación utilizando la memoria compartida es muy alta. Linux 2.2.x del kernel es compatible con una variedad de memoria compartida, como mmap (llamada) del sistema, la memoria compartida POSIX, y la memoria compartida System V. distribuciones de Linux como RedHat 8.0 mmap apoyo () llamada al sistema y el sistema V de memoria compartida, pero no se dio cuenta de memoria compartida POSIX, en este documento se describen los principios y la aplicación del Sistema V API de memoria compartida.

System V de memoria compartida se refiere a todos los datos compartidos en un área de memoria compartida (IPC región de memoria compartida), cualquier proceso que desea tener acceso a los datos hay que añadir un bloque de memoria en el espacio de direcciones de este proceso para almacenar datos de los mapas compartidos páginas de memoria física.

File System V es un sistema de archivos especial mediante la asignación de la memoria compartida SHM comunicación entre procesos. Es decir, cada región de memoria compartida que corresponde a un archivo especial en el SHM sistema de archivos (que está vinculada por la estructura shmid_kernel), se explicará más adelante.
entre

proceso tiene que ser colocado en un dato de IPC región de memoria compartida compartida denominada el lugar, todos requieren el acceso a la zona compartida del proceso debe ser para mapear la región para compartir el espacio de direcciones de este proceso a seguir. Memoria compartida System V IPC obtener o crear un área de memoria compartida, y devuelve el identificador correspondiente por shmget. Kernel en la obtención o garantía shmget crear un área de memoria compartida, inicializar el área de memoria compartida estructura shmid_kernel correspondiente, al mismo tiempo, también en un SHM especial del sistema de archivos, crear y abrir un archivo con el mismo nombre, y establecer los archivos correspondientes en la memoria dentry y la estructura de inodo, el archivo recién abierto no pertenece a ningún proceso (cualquier proceso puede acceder al área de memoria compartida). Todo esto se hace la llamada al sistema shmget. Nota: Cada zona tiene una memoria de estructura de control estructura shmid_kernel compartida, shmid_kernel región de memoria compartida es muy importante en una estructura de datos que se almacena en el puente, y la gestión del sistema de archivos se combinan, se define como sigue: struct {struct shmid_kernel kern_ipc_perm shm_perm; struct file * shm_file; int id; shm_nattch largo sin signo; sin firmar shm_segsz larga; time_t shm_atim; time_t shm_dtim; time_t shm_ctim; pid_t shm_cprid; pid_t shm_lprid;}; la estructura del campo más importante debe ser shm_file, almacena será abordar archivo de asignación. Cada área de memoria de objetos compartidos que corresponde a un archivo específico en la SHM sistema de archivos, en circunstancias normales, un archivo SHM sistema de archivos especial no se utiliza en la lectura (), write () para acceder similares, al tiempo que el modo de memoria compartida después de que los archivos mapeados en el espacio de direcciones del proceso, que puede ser utilizado directamente acceder a su acceso a la memoria.

como colas de mensajes y semáforos como por las estructuras de datos del núcleo ipc_ids struct shm_ids mantienen todo el sistema compartido región de memoria. Figura encima shm_ids.entries ipc_id variable se refiere a una matriz de estructura, y cada matriz tiene una estructura ipc_id kern_ipc_perm estructura punta puntero. Aquí debe ser familiar para el lector, para la región de memoria compartida del sistema V es, el anfitrión es kern_ipc_perm estructura shmid_kernel, shmid_kernel se utiliza para describir una región de memoria compartida, de manera que el núcleo puede controlar todo el sistema de región compartida. Mientras tanto, en la configuración de un tipo de archivo puntero que apunta a la shmid_kernel shm_file SHM sistema de archivos archivos correspondientes, de manera que, en el área de memoria compartida en asociación con el archivo de SHM en un sistema de archivos. Después de crear una región de memoria compartida, que debe ser mapeada en el espacio de direcciones del proceso, llamadas al sistema para completar esta función shmat (). Porque cuando se llama a shmget (), sistema de archivos SHM se ha creado en un archivo con el mismo nombre que la región de memoria compartida, por lo tanto corresponde, llame shmat () es equivalente al proceso de archivo de asignación del mismo nombre que la SHM sistema de archivos en el proceso.

II: System V memoria compartida API

memoria V compartida para el sistema, principalmente en los siguientes API: shmget (), shmat (), shmdt () y shmctl (). # include < sys /ipc.h > # include < sys /shm.h >

shmget () se utiliza para obtener el ID de área de memoria compartida, si el área especificada no existe en la zona compartida correspondiente para crear . shmat () para mapear la región de memoria compartida al espacio de direcciones del proceso de llamada para ir, por lo que el proceso puede ser fácilmente compartida zona para una visita. shmdt () se usa para aliviar el proceso de mapeo de la región de memoria compartida. shmctl realizar una operación de control de la región de memoria compartida.

III: Ejemplo

dos procesos a modo de memoria compartida ejemplo de sistema de comunicación V.

# include < sys /ipc.h > # include < sys /shm.h > # include < sys /types.h > # include < unistd.h > typedef struct {char nombre [ ,null,null,0],4]; int edad;} la gente; //espacio de direcciones del proceso abre una región de memoria compartida para el mapeo de memoria principal (int argc, char ** argv) {int shm_id, I; key_t clave; Char temperatura, la gente * p_map; char * name = " /dev /shm /myshm2 "; clave = ftok (nombre, 0); //ex son 'a'if (clave == - 1) perror (" error ftok "); shm_id = shmget (clave, 4096, IPC_CREAT), si (shm_id == - 1) {perror (" error shmget "); return; }

p_map = (personas *) shmat (shm_id, NULL, 0); //espacio de direcciones de proceso de mapeado en memoria temp = 'a'; para (i = 0; i < 10; i ++) {temp + = 1; memcpy ((* (p_map + i)) nombre, &. temp, 1); //la operación de escritura de memoria compartida (que está escrito en el proceso de asignación en la memoria), Francia

(* (p_map + i)) edad = 20 + i;. //(* (p_map + i)) .name equivalente (p_map + i) - > nombre } if (shmdt (p_map) == - 1) //perror unmapped (" deta error ch ");} # incluyen < sys /ipc.h > # include < sys /shm.h > # include < sys /types.h > # include < unistd.h > typedef struct {char nombre [4]; edad int;} personas; principal (int argc, char ** argv) {int shm_id, i; key_t clave; personas * p_map; char * name = " /dev /shm /myshm2 "; clave = ftok (nombre, 0), si (clave == -1) perror (" error ftok "); shm_id = shmget (clave, 4096, IPC_CREAT), si (shm_id == -1) {perror (" error shmget "); return; } p_map = (personas *) shmat (shm_id, NULL, 0); for (i = 0; i < 10; i ++) {printf (" nombre:.% s \\ n ", (* (p_map + i)) nombre); //compartido memoria operación de lectura (es decir, la memoria del proceso de lectura asignada) printf (" de edad% d \\ n ", (* (p_map + i)) la edad.);} if (shmdt (p_map) == -1) perror (" separar error ");}

testwrite.c crear un área de memoria compartida sistema V, y datos de formato en ella escritas; testread.c acceder al V compartido área de memoria mismo sistema, lectura a la datos formateados. Los dos programas se compilan para testwrite y testread, y se ha realizado ./testwrite ./testread ./testread la salida siguiente: nombre: b edad 20; nombre: c edad 21; nombre: d edad 22; nombre de: e edad 23; nombre: F edad 24; nombre: g edad 25; nombre: h edad 26; nombre: Mi edad 27; nombre: edad j 28; nombre: k 29 años de edad;

Copyright © Conocimiento de Windows All Rights Reserved