Final Concurrencia
Final Concurrencia
CONDICION DE CARRERA:
Ocurre cuando dos o más procesos que están trabajando juntos comparten
algún dato modificable que cada proceso puede leer o escribir y el resultado
final depende del orden de ejecución. (Nota: Este problema no sucede en
monoprogramación).
DESHABILITACION DE INTERRUPCIONES:
En un sistema monoprocesador la solución mas simple seria que cada
proceso deshabilite las interrupciones después de entrar a la SC y las
rehabilite después de salir de la SC. Entonces, el proceso puede examinar y
actualizar la memoria compartida sin temor que intervenga otro proceso.
Por lo pronto no es bueno dar a los procesos de usuario el poder de
deshabilitar las interrupciones, si uno de los procesos lo hiciera y nunca
lo volviera a activar seria el fin del sistema. Si el sistema es
multiprocesador se vería afectada la CPU donde se ejecutó la
Deshabilitación.
Se dice que es conveniente que el mismo kernel deshabilite las
interrupciones, es una técnica útil dentro del S.O pero no como
mecanismo para la exclusión mutua.
ALTERNANCIA ESTRICTA:
Se cuenta con un variable turno (que al principio es 0) que lleva la cuenta
de a qué proceso le toca entrar a su sección critica.
Esta solución genera espera ocupada, lo cual debe evitarse, ya que
desperdicia tiempo de la CPU.
La espera ocupada solo se utiliza cuando hay expectativa razonable de que
la espera será corta; esto nos quiere decir, que no es bueno tomar turnos
cuando uno de los procesos es más lento que el otro.
Esta situación viola la condición 3: el proceso esta siendo bloqueado por un
porceso que no está en su sección critica.
Esta solución requiere que los dos procesos alternen de manera estricta al
entrar en sus regiones criticas.
Este algoritmo evita las condiciones de carrera, pero no es buena solución al
violar la condición 3.
SOLUCIÓN DE PETERSON:
Cuando un proceso quiere entrar a la sección critica llama a una función
entrar_seccion con su propio número de proceso como parámetro, indica
su interés estableciendo su elemento del arreglo y fija turno a 0.
Cuando otro proceso quiere hacer uso de su región critica llama a
entrar_seccion y se quedara esperando hasta que interesado[0] sea
Falso, evento que solo ocurre cuando el proceso que esta en la sección
critica llama a salir_seccion.
Si en el caso que ambos proceso llaman a entrar_seccion casi en
simultaneo, ambos almacenaran su número de proceso en turno, cualquier
almacenamiento que se haya hecho último es el que cuenta, el primero se
sobreescribe y se pierde.
SEMAFOROS:
MUTEX:
FILMINA 6
Sabiendo que:
Especificación de la sincronización
Sentencia await:
Variantes
INTERFERENCIA:
Un proceso interfiere con otro, si se ejecuta una asignación que invalida una
aserción en el otro proceso.
• Variables disjuntas
Ejemplo
co x = x+1; // y = y+1; oc
Las pruebas correspondientes
{x == 0} x = x+1; {x == 1}
{y == 0} y = y+1; {y == 1}
• Aserciones debilitadas
Una aserción debilitada contempla más estados que una aserción que
puede ser cierta para el mismo proceso aislado.
• Invariantes globales:
• Sincronización:
Justicia fuerte:
(1) es justa incondicional, y
(2) toda acción atómica condicional elegible es eventualmente ejecutada,
asumiendo que su condición se torna verdadera con “infinita” frecuencia
FILMINA 8
Condiciones necesarias:
- Exclusión mutua: A lo sumo un proceso a la vez está ejecutando su
sección crítica
- Ausencia de deadlock (Bloqueo mutuo o Interbloqueo): Si dos o más
procesos tratan de entrar a sus secciones críticas, al menos uno
tendrá éxito.
- Ausencia de retardo innecesario: Si un proceso está tratando de
entrar a su SC y los otros están ejecutando sus SNC o terminaron, el
primero no está impedido de entrar a su SC.
- Eventual ingreso: Un proceso que está intentando entrar a su SC
eventualmente lo hará
Las primeras 3 son para la propiedad de seguridad y la ultima es de vida.
Esta solución tiene como objetivo hacer átomico el await de grano grueso,
para esto se usa alguna instrucción especial test-and-set (TS).
La instrucción TS toma 2 argumento booleano: lock (compartido) y un
código de condición local initial. TS setea initial al valor de lock, luego
setea lock a verdadero(true).
Al utilizarse variable de lockeo de este modo, se lo llama spin locks pues los
procesos “dan vueltas” (spin) mientras esperan que se libere el lock.
Requieren de un planificador fuertemente justo para cumplir las 4
propiedades. Una política débilmente justo es aceptable (rara vez todos los
procesos están simultáneamente tratando de entrar a su SC).
Aunque la última solución es correcta, puede llevar a baja performance si
varios procesos están compitiendo por el acceso a una SC. Esto es porque
lock es una variable compartida y todo proceso demorado continuamente la
referencia. Esto causa “memory contention”
Spin locks no controla el orden de los procesos demorados entonces es
posible que alguno no entre nunca si el planificador no es fuertemente justo
(condición de competencia).
SOLUCIONES JUSTAS:
Algoritmo TIE-BREAKER:
Algoritmo Ticket:
Es una solución para N-procesos más fácil de entender que el N procesos
del Tie-Breaker. Se usan contadores enteros para ordenar procesos. Acá se
reparten números y se espera turno: Los clientes toman un número mayor
a cualquier otro que espera ser atendido; luego esperan hasta que todos los
clientes con un número más chico sean atendidos. La ausencia de deadlock
y de demora innecesaria resultan de que los valores de turno son únicos.
Con planificador débilmente justo se asegura eventual ingreso.
Desventajas: Contadores crecientes, overflow (desbordamiento).
Algoritmo Bakery:
Contador compartido:
Arboles:
Barreras Simétricas:
Programación Concurrente:
- múltiples procesos cooperantes: con memoria compartida y con
pasaje de mensajes.
Tipos de Speedup:
- Lineal o perfecto (speedup = p)
- Sublineal (Speedup < p) caso tipico, algo gano de velocidad
- Superlineal (speedup > p) caso raro.
Ejemplo: