Semáforos:
En 1965 Dijkstra sugirió usar una variable entera para
contar el número de señales de despertar guardadas para uso futuro. En esta
propuesta se introdujo un nuevo tipo de variable, llamada semáforo. Un semáforo
podía tener el valor 0, indicando que no había señales de despertar guardadas,
o algún valor positivo si había una o más señales de despertar pendientes.
Dijkstra propuso tener dos operaciones: DOWN y UP. La
operación DOWN aplicada a un semáforo verifica si el valor es mayor que 0; de
ser así, decremento el valor (esto es, gasta una señal de despertar almacenada)
y continúa. Si el valor es 0, el proceso se pone a dormir sin completar la operación
DOWN por el momento. La verificación del valor, su modificación y la acción de
dormirse, si es necesaria, se realizan como una sola acción atómica
indivisible. Se garantiza que una vez que una operación de semáforo se haya
completado o bloqueado. Esta atomicidad es absolutamente indispensable para
resolver los problemas de sincronización y evitar condiciones de competencia.
Monitores:
Un monitor es una colección de procedimientos, variables y estructuras
de datos que se agrupan en un tipo especial de módulo o paquete. Los procesos
pueden invocar los procedimientos de un monitor en el momento en que deseen,
pero no pueden acceder directamente a las estructuras de datos internas del
monitor desde procedimientos declarados afuera del mismo.
Los monitores poseen una propiedad especial que los hace
útiles para lograr la exclusión mutua: solo un proceso puede estar activo en un
monitor en un momento dado. Los monitores son una construcción de lenguaje de
programación, así que el compilador sabe que son especiales y puede manejar las
llamadas a procedimientos de monitos de una forma diferente a como maneja otras
llamadas a procedimientos. Por lo regular, cuando un proceso invoca un
procedimiento de monitor, las primeras instrucciones del procedimiento
verifican si hay algún otro proceso activo en ese momento dentro del monitor.
Si así es, el proceso invocador se suspende hasta que el otro proceso abandona
el monitor. Si ningún otro proceso está usando el monitor, el proceso invocador
puede entrar.
Problemas clásicos de sincronización entre procesos
En este problema existe un determinado objeto que puede ser
un archivo, un registro dentro de un archivo, etc., que va a ser utilizado y
compartido por una serie de procesos concurrentes. Algunos de estos procesos
sólo van a acceder al objeto sin modificarlo, mientras que otros van a acceder
al objeto para modificar su contenido. Esta actualización implica leerlo,
modificar su contenido y escribirlo. A los primeros procesos se les denomina
lectores y a los segundos se les denomina escritores. En este tipo de problemas
existe una serie de restricciones que han de seguirse:
• Sólo se permite que un escritor tenga acceso al objeto al
mismo tiempo. Mientras el escritor esté accediendo al objeto, ningún otro proceso
lector ni escritor podrá acceder a él.
• Se permite, sin embargo, que múltiples lectores tengan
acceso al objeto, ya que nunca van a modificar el contenido del mismo.
No hay comentarios:
Publicar un comentario