Algo de historia: Unix System V parte el año 1983 y varias versiones se crearon. La versión más exitosa fue la 4, SVR4 (System V Release 4). Esta versión de Unix incluyó los mecanismos de comunicación entre procesos que hoy se conocen como System V IPC. Posteriormente POSIX "Portable Operating System Interface" estandariza los mecanismos de IPC y crea otra API para IPC. Como SVR4 fue muy difundida y está presente en muchos sistemas actuales, POSIX incluye también el API de IPC de SVR4.
En esta página se describe la API de POSIX
(posterior a SVR4) por mayor simplicidad y mejor diseño de su interfaz
comparada con los llamados del sistema SVR4. Visite este
material para estudiar los llamados del sistema SVR4.
Algunas estructuras de datos son creadas globalmente en el sistema, el cual no maneja un contador de referencias. La estructura permanece en el sistema hasta que es removida por un proceso o la máquina es "rebooted". (Parecido a procesos zombies). En caso de ser necesario, con los comandos ipcs e ipcrm se puede listar y remover estos mecanismos de comunicación entre procesos.
Ver ejemplos aquí:
Se trata de un sistema productor-consumidor sin mecanismos de
sincronización. Ver en particular:
shm-posix-producer.c : Crea la zona de memoria compartida y escribe en ella.
shm-posix-consumer.c : Abre la zona creada, la lee y luego remueve la zona de memoria del sistema.
Un semáforo es
un entero cuyo valor nunca baja de cero y su modificación se desarrolla de manera atómica, es decir, no hay cambios de contextos ni interrupciones durante su modificación. Las siguientes operaciones pueden modificar
ese valor entero:
sem_post() para incrementar el valor en uno y
sem_wait() para reducirlo en uno.
Si el valor de un semáforo ya es cero,
entonces sem_wait() bloquea el proceso que la invocó hasta que el semáforo toma un valor sobre cero.
Los Semáforos POSIX vienen en dos tipos: Semáforos con nombre
(named semaphores) y sin nombre (unnamed semaphores).
Los semáforos con nombre son identificados con un string de la forma "/algún_nombre". Varios procesos pueden operar sobre el mismo semáforo usando el mismo nombre en el llamado a sem_open(). Usted puede revisar el directorio /dev/shm/ y debería identificar el recurso creado por el sistema para manejar su zona de memoria.
Los semáforos sin nombre no tienen string que los identifique. En este caso el semáforo
debe ser puesto en una zona de memoria de acceso común a varias hebras o
procesos relacionados. Éstos no pueden ser usados por procesos no relacionados entre sí.
POSIX define un API para el manejo de semáforos, para mayor
información revisar páginas man de:
sem_open(): Crea un semáforo.
sem_close(): Cierra un semáforo.
sem_unlink(): remueve el semáforo.
sem_wait(): decrementa en uno el valor del semáforo si éste es mayor que 0, si el valor del semáforo es cero, sem_wait se bloquea hasta que el semáforo sea mayor que cero.
sem_post(): incrementa el valor del semáforo.
Otros llamados son: sem_destroy, sem_getvalue, sem_init.
Vea este ejemplo productor consumidor empleando memoria compartida y semáforos POSIX. El diagrama de arquitectura simplificado se este ejemplo se muestra en la figura 1.