Beruflich Dokumente
Kultur Dokumente
1. CONDICIONES DE COMPETENCIA
En algunos S.O. los procesos que trabajan juntos comparten, con frecuencia, un
espacio común para almacenamiento en el que cada uno puede leer o escribir. El
espacio compartido puede estar en memoria principal o puede tratarse de una
archivo compartido.
2. SECCIONES CRÍTICAS
Sección No Crítica
NO SI
Proceso A
Turn=
0
Sección Crítica
Turn = 1
Sección No Crítica
Proceso B
NO SI
Turn=
1
Sección Crítica
Turn = 0
COMUNICACIÓN ENTRE PROCESOS Pág. 6
A B
repeat
bandera(i) := cierto;
turn := j;
while (bandera(j) and turn=j) do
skip;
Seccion critica
bandera(i) := falso;
P0
SECCIÓN
NO CRÍTICA Continúa en la Sección No
crítica, en la instrucción
siguiente a la que llamó a la
Sección Crítica
Desea entrar a su
Sección Crítica
P0 ENTRA
EN SU SC
Señal 0 := F
COMUNICACIÓN ENTRE PROCESOS Pág. 10
Sección No Crítica
Desea entrar a su
Sección Crítica
Preservar el valor de
bandera
(reg:=bandera)
NO
SI
reg=0
Sección Crítica
Ventajas
• Son aplicables a cualquier número de procesos
• Simple y fácil de verificar
• Puede usarse para designar varias Secciones Críticas. Cada Sección Crítica
puede definirse con su propia variable
Desventajas
• Se emplea espera activa
• Puede producirse inanición: cuando un proceso abandona su Sección Crítica y
hay más de un proceso esperando, la selección es arbitraria. De esta manera
podría denegarse el acceso a algún proceso indefinidamente.
• Puede producirse interbloqueo: supongamos dos procesos P1 y P2, P2 con
prioridad mayor a P1.
Se está ejecutando P1, que ejecuta la instrucción TSL.
P1 es interrumpido por P2. Si P2 intenta ejecutar TSL se le negará el acceso
por el mecanismo de Exclusión mutua. P2 entra en estado de
espera activa.
Como P2 tiene mayor prioridad que P1, P1 no será planificado sino hasta que
P2 termine.
CPU
P1 P2
Sección
Crítica
COMUNICACIÓN ENTRE PROCESOS Pág. 13
4. DORMIR Y DESPERTAR
Las soluciones vistas presentan el inconveniente de la espera ocupada. Lo que
hacen estas soluciones es lo siguiente: cuando un proceso desea entrar a su
sección crítica, verifica si está permitida la entrada. Si no, el proceso se queda
esperando hasta obtener el permiso.
Esto no sólo desperdicia tiempo de CPU, sino también puede presentar efectos
inesperados. Supongamos una computadora con 2 procesos, A y B, donde A tiene
mayor prioridad que B. Las reglas de planificación son tales que A se ejcuta siempre
que esté en estado de listo. Supongamos que B se está ejecutando en su Sección
Crítica. A entra a la cola de Listos para su ejecución. A comienza una espera
ocupada, pero como B nunca se planifica cuando A está en ejecución no tiene
oportunidad de salir de su Sección Crítica, por lo que A hace un ciclo infinito. Esta
situación se denomina, a veces, Problema de la Inversión de Prioridad.
Existen primitivas de comunicación entre procesos que bloquean a la CPU en
vez de desperdiciar su tiempo cuando no se les permite entrar en su Sección Crítica.
Las más sencillas son SLEEP y WAKEUP.
SLEEP es una Llamada al sistema que provoca el bloqueo del proceso que hizo
la llamada.
WAKEUP es una llamada que tiene un parámetro, el proceso por despertar.
Continúa con el
Continúa con el código del
código del Consumidor
PRODUCTOR Productor CONSUMIDOR
Desea entrar a la SC
SI NO
SI NO
Coun Coun
t=N t=0
Count=count-1
Count=count+1
SI NO SI NO
Count Count
=1 =N-1
WAKEUP WAKEUP
Consumidor Productor
COMUNICACIÓN ENTRE PROCESOS Pág. 16
5. SEMÁFOROS
Para solucionar el problema del despertar perdido Dijkstra propuso el uso de una
variable entera para contar el número de despertares almacenados para su uso
posterior.
Presentó un nuevo tipo de variable llamada semáforo.
DOWN: verifica si semáforo > 0 . En ese caso decrementa el valor del semáforo y
continúa (utiliza un despertar almacenado).
Si semáforo=0 el proceso se va a dormir.
La verificación del valor del semáforo y la acción de irse a dormir se realiza
en conjunto, como una única acción atómica e indivisible, lo que garantiza
que al momento de iniciar un proceso con un semáforo, ningún otro proceso
tiene acceso al semáforo hasta que la acción termine o se bloquee.
Procedimiento Productor
Procedimiento Consumidor
COMUNICACIÓN ENTRE PROCESOS Pág. 17
Procedimiento Productor
El proceso se bloquea y se
agrega a la cola de procesos
dormidos en empty
Produce_item
NO
DOWN (empty)
SI
DOWN (mutex)
empty <> 0
Agregar_item
UP (mutex)
UP (full)
El proceso se bloquea y se
agrega a la cola de procesos
dormidos en full
Procedimiento Consumidor
NO
DOWN (full)
SI
full < 0
DOWN (mutex)
Leer_item
UP (mutex)
Consumir_item
OBSERVACIÓN:
Si en el código del productor en lugar de hacer DOWN empty primero y DOWN
mutex después, se invierte el orden podría ocurrir lo siguiente:
1. Un proceso entra a su SC mediante DOWN mutex
2. Luego ejecuta DOWN empty y debe irse a dormir porque empty era 0
3. Se ejecuta el Consumidor que, al encontrar mutex=0 se va a dormir. Ambos
procesos dormirán por siempre.
COMUNICACIÓN ENTRE PROCESOS Pág. 19
CONTADORES DE EVENTOS
Inicialmente in = 0 y out = 0
Contador de Eventos
N := n
in:=0
out:= 0
Procedimiento Productor
Procedimiento Consumidor
COMUNICACIÓN ENTRE PROCESOS Pág. 20
Procedimiento Productor
seq := 0
Produce elemento
NO
SI
Procedim.Consumidor
seq := 0
NO
SI
in >= seq
Retira elemento al
buffer
Advance (out)
Antes de intentar eliminar un elemento
verifica que existan elementos en el buffer.
Si:
MONITORES
Tienen una propiedad importante que los hace muy útiles para implementar la
exclusión mutua: sólo uno de los procesos puede estar activo en el monitor a la vez.
Los monitores son concepto del lenguaje de programación. Los compiladores de los
lenguajes que los incorporan los reconocen y no permiten que un proceso entre al
monitor si existe otro en él, garantizando de esta forma la EXCLUSIÓN MUTUA.
Cuando un proceso llama a un procedimiento del monitor, las 1as instrucciones del
monitor verifican si hay otro proceso activo dentro del monitor. En caso afirmativo el
proceso que hace la llamada será suspendido hasta que otro proceso salga del
monitor.
Ejemplo
monitor Ejemplo
definición de variables enteras;
definición de variables de condición;
Procedimiento Productor;
..........................
..........................
.........................
fin Productor
Procedimiento Consumidor;
..........................
..........................
..........................
fin Consumidor;
fin monitor
COMUNICACIÓN ENTRE PROCESOS Pág. 23
La señal SIGNAL sobre una variable de condición (full o empty) provoca que uno de
los procesos que duermen en esa variable se despierte y entre al monitor. Para ello,
el proceso que ejecutó SIGNAL debe salir del monitor. Esto implica que el enunciado
SIGNAL debe aparecer como último enunciado de un procedimiento de monitor.
Datos Locales
Condic (x)
WAIT(y)
Procedimiento j
Cola de Urgentes
Salida
• Si un proceso que se está ejecutando detecta con SIGNAL que una variable de
condición se ha modificado avisa de tal situación a la cola correspondiente.
MONITOR ProductorConsumidor
Procedimiento agregar
Procedimiento leer
Procedimiento agregar
SI NO
count = N
count := count + 1
SI
SIGNAL (empty) count = 1
NO
FIN
Procedimiento productor
Producir_item
ProductorConsumidor.agregar
NO SI
fin
FIN
COMUNICACIÓN ENTRE PROCESOS Pág. 27
Procedimiento leer
SI NO
count = 0
count := count - 1
SI
SIGNAL (full) Count = N-1
NO
FIN
Procedimiento CONSUMIDOR
ProductorConsumidor.leer
Consumir_item
NO SI
fin
FIN
COMUNICACIÓN ENTRE PROCESOS Pág. 28
TRANSFERENCIA DE MENSAJES
Sincronización
Desde el punto de vista de la sincronización pueden darse los siguientes casos:
1. Envío y Recepción bloqueante: el emisor y el receptor se bloquean hasta que
el mensaje llega a destino. En este caso existe fuerte sincronización.
Direccionamiento
Directo
Implícito
Se utiliza cuando no es posible conocer de antemano el proceso emisor, como es el
caso del proceso servidor de impresoras.
El parámetro origen tendrá un valor de retorno cuando se haya efectuado la
operación de recepción.
Indirecto
Los mensajes no se envían drectamente al emisor sino a una estructura de datos
compartida formada por colas que guardan mensajes temporalmente. Estas
estructuras de datos reciben el nombre de buzones.
E1 R1
BUZÓN
En Rn
PUERTO R
En
Relación Muchos a uno
R1
E BUZÓN
Rn
E BUZÓN R
Puertos: son creados por el proceso receptor y se destruyen cuando dicho proceso
termina
Formato de mensajes
Origen
Destino
Longitud Cabecera
Inf. de control
Tipo
Los mensajes pueden serd eformato FIJO para minimizar procesamiento y costo de
almacenamiento
Si se va a intercambiar una gran cantidad de datos, estos pueden ponerse en un
archivo y el mensaje hará referencia a este archivo.
La autentificación es otro tema crucial. El cifrado de mensaje con clave es muy útil.
COMUNICACIÓN ENTRE PROCESOS Pág. 33