Ejemplos java y C/linux

Tutoriales

Enlaces

Licencia

Creative Commons License
Esta obra está bajo una licencia de Creative Commons.
Para reconocer la autoría debes poner el enlace http://www.chuidiang.org

Memoria compartida en C para Linux

La memoria compartida, junto con los semáforos y las colas de mensajes, son los recursos compartidos que pone unix a disposición de los programas para que puedan intercambiarse información.

En C para unix es posible hacer que dos procesos (dos programas) distintos sean capaces de compartir una zona de memoria común y, de esta manera, compartir o comunicarse datos.

La forma de conseguirlo en un programa es la siguiente:

Hasta ahora se indicado lo mínimo y más básico para poder utilizar memoria compartida. Hay más funciones que permiten hacer más cosas con la memoria compartida. Además, para un uso más "serio" y "correcto", sería necesario añadir algo como semáforos.

Por ejemplo, si los datos que deseamos compartir son muy grandes, es bastante probable que mientras un proceso intenta escribir en la memoria, otro esté leyendo. Si lo intentan de forma totalmente descontrolada y a la vez, los datos que leen pueden ser incoherentes (hay otro que está escribiéndolos en ese momento y todavía no ha terminado).

Para evitar esto existen los semáforos. Se pondría un semáforo para acceder a la memoria, de forma que cuando un proceso lo está haciendo, el semáforo se pone "rojo" y ningún otro proceso puede acceder a ella. Cuando el proceso termina, el semáforo se pone "verde" y ya podría acceder otro proceso.

Comandos de Unix útiles

Unos comandos de UNIX que nos pueden resultar de utilidad son ipcs y ipcrm.

ipcs nos da un listado de recursos compartidos que están creados en ese momento, es decir, listado de memorias compartidas como las que hemos tratado en esta página, de semáforos y de colas.

ipcrm nos permite eliminar algunos de estos recursos. Si paramos el programa con un Ctrl-C o simplemente sale de forma anormal, el recurso (la memoria compartida) no se libera y queda en el sistema. La forma de borrarla sería con este comandos.

Es bastante normal mientras desarrollamos y depuramos nuestro programa que se nos caiga, lo abortemos, etc. El número de memorias compartidas que podemos crear está limitado en UNIX, así que a la cuarta o quinta prueba empezaremos a obtener errores de que no se pueden crear las memorias. ipcrm nos permite eliminar  las memorias que se nos han quedado "pendientes" en nuestras pruebas.

El Ejemplo

Aquí hay dos fuentes de ejemplo en C sobre UNIX de memoria compartida p1.c y p2.c. Son dos programas que comparten memoria. El primero crea la memoria de tamaño 100 int y empieza a escribir en el primero entero, con espera de un segundo, los números del 1 al 10. Es segundo programa lee, a intervalos de un segundo, el número guardado en el primer entero y lo muestra en pantalla.

Para ejecutarlos, compilarlos en primer lugar con make p1 p2 (no es necesario fichero Makefile) o bien con g++ p1.c -o p1   y g++ p2.c -o p2.   Luego en dos shell distintas, ejecutar en la primera p1 y en la segunda p2 Desde que arrancamos p1 tenemos unos diez segundos para arrancarp2 y ver el efecto deseado.

Estadísticas y comentarios

Numero de visitas desde el 4 Feb 2007: