Memoria compartida IPC

Shared Memory :
Uno de los métodos de comunicación entre procesos más simples está utilizando
memoria compartida memory.Shared permite que dos o más procesos para acceder a la misma memoria que
si todos se llaman malloc y se devolvieron los punteros a la misma memoria real.
Cuando se cambia el proceso de memoria, todos los otros procesos de ver la modificación.

Fast Local Comunicación :
La memoria compartida es la forma más rápida de comunicación entre procesos porque
todos los procesos comparten el mismo trozo de memoria. El acceso a esta memoria compartida es
lo más rápido acceso a la memoria no compartida de un proceso, y que no requiere de un
llamada al sistema o la entrada al núcleo. También evita la copia de datos innecesariamente.
Dado que el núcleo no sincroniza los accesos a la memoria compartida, debe
proporcionar su propia sincronización.

El modelo de memoria :.
Para utilizar un segmento de memoria compartida, un proceso debe asignar el segmento
A continuación, cada proceso que desee acceder al segmento debe adjuntar el segmento.
Después de terminar su uso del segmento, cada proceso se separa el segmento.
En algún momento, un solo proceso debe desasignar el segmento.
Comprender el modelo de memoria Linux ayuda a explicar la asignación y
proceso de apego. En Linux, la memoria virtual de cada proceso se divide en páginas.
Cada proceso mantiene una asignación de sus direcciones de memoria a estas páginas />
intercambio de memoria.
La asignación de un nuevo segmento de memoria compartida hace que las páginas de memoria virtual que se
creado. Debido a que todos los procesos desean acceder al mismo segmento compartido, sólo uno
proceso debe asignar un nuevo segmento compartido. La asignación de un segmento existente no
no crear nuevas páginas, pero sí devuelve un identificador para el
pages.To existente permitir un proceso para utilizar el segmento de memoria compartida, se adjunta un proceso, lo que
añade la cartografía entradas de su memoria virtual para compartir
terminado con el segmento, estas entradas de asignación son removed.When no más procesos
desee acceder a estos segmentos de memoria compartida, exactamente un proceso debe desasignar
las páginas de memoria virtual.
Todos los segmentos de memoria compartida se asignan como múltiplos enteros de tamaño de página de la
del sistema, que es el número de bytes en una página de memoria. En los sistemas Linux,
el tamaño de página es de 4KB, pero usted debe obtener este valor llamando a la función getpagesize.

:
Un proceso asigna un segmento de memoria compartida utilizando shmget («Memoria compartida
GET»). Su primer parámetro es una clave de entero que especifica qué segmento de la creación.
Procesos no relacionados pueden tener acceso al mismo segmento compartido especificando el mismo valor de clave /> podría conducir a un conflicto. Usando el IPC_PRIVATE constante especial como el valor de la clave garan-
tees que se crea un nuevo segmento de memoria de la marca.
Su segundo parámetro especifica el número de bytes en el segmento. Debido mentos /> a un múltiplo entero del tamaño de página.
El tercer parámetro es el bit a bit o de valores de indicadores que . especificar opciones para shmget
Los valores de los indicadores son los siguientes:
IPC_CREAT-Esta bandera indica que un nuevo segmento debe ser created.This mits />
IPC_EXCL-Esta bandera, que siempre se utiliza con IPC_CREAT, provoca shmget falle
si no se especifica una clave que ya exists.Therefore segmento, se arregla para que el proceso ing />

existente creando una nueva.
Banderas-Este modo de valor es de 9 bits que indican los permisos concedidos a
propietario, grupo y mundo para controlar el acceso al segmento. Bits de ejecución se ignoran
. Una forma sencilla de especificar los permisos es utilizar las constantes definidas en
y documentados en la sección 2 hombre stat página.1 Por ejemplo,
S_IRUSR y S_IWUSR especifican leer y escribir permisos para el dueño de la
segmento de memoria compartida y S_IROTH y S_IWOTH especifican leer y escribir misiones /> El apego y el desapego :
Para hacer que el segmento de memoria compartida disponible, un proceso debe utilizar shmat», compartió
Memoria Adjuntar «Pasarlo el segmento de memoria compartida retur shmid identificador nido por <. br /> shmget. El segundo argumento es un puntero que especifica en qué dirección
espacio de su proceso que desea asignar la memoria compartida; si se especifica NULL, Linux elegirá
una disposición address.The tercer argumento es una bandera, que puede incluir lo siguiente:
SHM_RND indica que la dirección especificada para el segundo parámetro debe ser
redondeará a un múltiplo del tamaño de página. Si no se especifica este indicador,
deben página a alinear el segundo argumento de Shmat ti mismo.
SHM_RDONLY indica que el segmento será de sólo lectura, no por escrito.
Si la llamada se realiza correctamente , devuelve la dirección del segmento compartido adjunto. –
Cre Niños ATED por llamadas a la mesa inherente que concede segmentos compartidos;. Pueden separar los segmentos de memoria />
Cuando haya terminado con un segmento de memoria compartida, el segmento debe ser
individual utilizando shmdt («Memoria compartida detach»). Pasarlo la dirección devuelta por shmat /> eliminado. Las llamadas a salir y nadie de la familia exec de separar automáticamente los segmentos

Controlar y desasignación de memoria compartida :.
El shmctl («memoria compartida de control») llamada devuelve información sobre un
segmento de memoria compartida y puede modificar it.The primer parámetro es un identificador de segmento />
Para obtener información sobre un segmento de memoria compartida , pase IPC_STAT como
segundo argumento y un puntero a una estructura shmid_ds.
Para eliminar un segmento, pase IPC_RMID como segundo argumento, y pasar NULL como
tercer segmento es argument.The eliminado cuando el último proceso que ha unido
finalmente lo desconecta.
Cada segmento de memoria compartida se debe cancelar la asignación explícita utilizando shmctl cuando
haya terminado con él, para no violar el límite de todo el sistema de el número total de
segmentos de memoria compartida. La invocación de salida y exec separa los segmentos de memoria pero
no les desasignar

Un ejemplo de programa:..
El programa muestra el uso de memoria compartida

# include
# include
# include
int main () {

int segment_id;
char * shared_memory;
struct shmid_ds shmbuffer;
int segment_size;
const int shared_segment_size = 0x6400;
/ * Asignar un segmento de memoria compartida. * /
Segment_id = shmget (IPC_PRIVATE, shared_segment_size,
IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR);
/ * Adjuntar el segmento de memoria compartida. * /
Shared_memory = (char *) shmat (segment_id, 0, 0); printf />
/ * Determinar el tamaño de segmento. * /
Shmctl (segment_id, IPC_STAT, y shmbuffer);
segment_size = shmbuffer.shm_segsz;
printf («tamaño del segmento:% d n», segment_size);
/ * Escribe una cadena en el segmento de memoria compartida. * /
Sprintf (shared_memory, «Hola, mundo».);
/ * Separe el segmento de memoria compartida. * Shmdt /> /
/ * Vuelva a colocar el segmento de memoria compartida, en una dirección diferente. * /
Shared_memory = (char *) shmat (segment_id, (void *) 0x5000000, 0); printf />
/ * Imprime la cadena de la memoria compartida. Printf /> * /
/ * Separe el segmento de memoria compartida. * Shmdt /> /
/ * Desasigne el segmento de memoria compartida. * /
Shmctl (segment_id, IPC_RMID, 0);
return 0;}

y Contras :
segmentos de memoria compartida por mit comunicación bidireccional rápida entre cualquier número
de los procesos. Cada usuario puede leer y escribir, sino un programa debe establecer y
seguir algún protocolo para prevenir condiciones de carrera como sobrescribir información
antes de que se lee. Desafortunadamente, Linux no garantiza estrictamente exclusivo
el acceso, incluso si se crea un nuevo segmento compartido con IPC_PRIVATE.
Asimismo, para múltiples procesos para utilizar un segmento compartido, deben hacer arreglos
para utilizar la misma clave.

Deja un comentario

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