Tecnologia
1.- Conceptos generales de memoria compartida.
La forma más eficaz que tienen los procesos para comunicarse consiste en compartir una zona de memoria, tal que para enviar datos de un proceso a otro, sólo se ha de escribir en dicha memoria y automáticamente estos datos estarán disponibles para cualquier otro proceso. La utilización de este espacio de memoria común evitala duplicación de datos y el lento trasvase de información entre los procesos.
La memoria convencional que puede direccionar un proceso a través de su espacio de direcciones virtuales es local a ese proceso y cualquier intento de direccionar esa memoria desde otro proceso va a provocar una violación de segmento. Es decir, cuando se crea uno o más procesos mediante la llamada fork(), se realizauna duplicación de todas las variables usadas, de forma que cualquier modificación de sus valores pasa inadvertida a los demás procesos, puesto que aunque el nombre es el mismo, su ubicación en memoria no lo es. Esto es debido a que con cada nuevo proceso se reserva una zona de memoria inaccesible a los demás. Las direcciones de las variables de esta zona son virtuales, y es el módulo de gestiónde la memoria el que se encarga de traducirlas a direcciones físicas.
Para solucionar este problema, UNIX ofrece la posibilidad de crear zonas de memoria con la característica de poder ser direccionadas por varios procesos simultáneamente. A estas zonas de memoria se les denominada segmentos de memoria compartida, y corresponden a memoria virtual, es decir; sus direcciones físicas asociadaspueden verse modificadas a lo largo de la ejecución, pero esto es transparente al programa puesto que es el módulo de gestión de la memoria el que se encarga de traducir las direcciones físicas a las direcciones virtuales generadas por los procesos.
El kernel no gestiona de forma automática los segmentos de memoria compartida, por lo tanto, es necesario asociar a cada segmento o grupo desegmentos un conjunto de mecanismos de sincronización, de forma que se evite los típicos choques entre los procesos, es decir, que un proceso este modificando la información contenida en el segmento mientras que otro lee sin que se hayan actualizado todos los datos.
2.- Petición de un segmento de memoria compartida.
La función shmget permite crear una zona de memoria compartida o habilitar elacceso a una ya creada. Su declaración es la siguiente:
#include
#include
#include
int shmget (clave, tamaño, opción);
key_t clave; /* clave del segmento de memoria compartida */
int tamaño; /* tamaño del segmento de memoria compartida */
int opción; /* opción para la creación */
Si la llamada se ejecuta correctamente, la función devolverá el identificador asociado a lazona de memoria con el fin de poder utilizarla posteriormente. Si por algún motivo falla, la función devolverá el valor –1.
El parámetro clave es la llave de acceso, y tiene el mismo significado que el parámetro clave en la función semget que permite crear o habilitar grupos de semáforos.
El segundo parámetro, tamaño, indica el espacio en bytes de la zona de memoria compartida que se deseacrear. Este espacio es fijo durante su utilización.
El último parámetro es una máscara de bits que definirá los permisos de acceso a la zona de memoria y el modo de adquirir el identificador de la misma. En definitiva, su significado es similar al que se vio para la máscara opción de la citada función semget.
El identificador del segmento que devuelve esta función es heredado por todos losprocesos descendientes del que llama a esta función.
El siguiente trozo de código muestra cómo se crea una zona de memoria de 4096 bytes, donde sólo el propietario va a tener permiso de lectura y escritura:
#define LLAVE (key_t)234 /* clave de acceso */
int shmid; /* identificador del nuevo segmento de memoria compartida */
if((shmid=shmget(LLAVE, 4096, IPC_CREAT | 0600)) ==...
Regístrate para leer el documento completo.