sincronización de procesosumh2269.edu.umh.es/wp-content/uploads/sites/1051/... · arco...
TRANSCRIPT
Sincronización de procesos
ARCO
ARCO Sincronización
Contenido
Procesos concurrentes.
El problema de la seccion critica
Problemas clásicos de comunicación y
sincronización.
Mecanismos de comunicación y
sincronización.
ARCO Sincronización
Procesos concurrentes
Los procesos llevan a cabo tareas para lograr un objetivo comun.
Interaccionan entre ellos para:Competir por recursos
Compartir recursos
ES NECESARIA LA COMUNICACION y
LA SINCRONIZACION (orden) ENTRE
ELLOS
ARCO Sincronización
Procesos concurrentes
El método mas sencillo de comunicación entre los procesos de un programa concurrente, es el uso común de unas variables de datos.
Sin embargo el uso de este mecanismo
puede hacer que la ejecución de un proceso
interfiera en las acciones del otro.
ARCO Sincronización
Ejemplo
ARCO Sincronización
Productor-consumidor
Un proceso produce datos que son posteriormente procesados por otro proceso
i.e.: el manejador de teclado y el programa
que recoge los caracteres de un buffer
Lo más cómodo es emplear un buffer circular
ARCO Sincronización
Código del productor
El productor no puede escribir en el buffer si está lleno
Comparte con el consumidor: el buffer y el contador
do {
...
produce un nuevo elemento (elemento_p)
...
while (contador == MAX_ELEMENTOS) haz_nada;
buffer[indice_p] = elemento_p;
indice_p = (indice_p + 1) % MAX_ELEMENTOS;
contador = contador + 1;
} while (TRUE);
ARCO Sincronización
Código del consumidor
El productor no puede leer del buffer si está vacío
Comparte con el consumidor: el buffer y el contadordo {
while (contador == 0) haz_nada;
elemento_c = buffer[indice_c];
indice_c = (indice_c + 1) % MAX_ELEMENTOS;
contador = contador - 1;
...
consume el elemento (elemento_c)
...
} while (TRUE);
ARCO Sincronización
Condiciones de carrera
El código anterior no funciona por existir condiciones de carrera al actualizar el contador
Veamos qué ocurre al ejecutar la sentencia: contador = contador + 1;
ProductorConsumidor
load r0, contador load r0, contador
add r0, 1 sub r0, 1
store contador, r0 store contador, r0
Problema: la modificación del contador no es
atómica
ARCO Sincronización
Atomicidad
Una operación se dice que es atómica (en un sistema uniprocesador) cuando se ejecuta con las interrupciones deshabilitadas
Las referencias y las asignaciones son
atómicas en la mayoría de los sistemas.
Esto no es siempre cierto para matrices,
estructuras o números en coma flotante
Si el HW no proporciona operaciones
atómicas, éstas no pueden construirse por
SW
ARCO Sincronización
Sincronización
Persona A Persona B
3:00 Mira en la nevera. No hay leche
3:05 Va a la tienda
3:10 Llega a la tienda
3:15 Deja la tienda
3:20 Llega a casa y guarda la leche
3:25
3:30
Mira en la nevera. No hay leche
Va a la tienda
Llega a la tienda
Deja la tienda
Llega a casa y ...
ARCO Sincronización
¿Cuál es el problema planteado?
Alguien necesita leche, pero no tanta
Exclusión mutua: es el mecanismo que asegura
que sólo un proceso está haciendo algo en un
instante determinado
Sección crítica: es la sección de código, o
colección de operaciones, en el que se actualizan
variables comunes o se ejecuta código común.
Cuando un proceso está ejecutando código de su SC, ningún otro proceso puede estar en su SC
ARCO Sincronización
Seccion Critica
Para evitar este tipo de errores, hay que identificar las regiones de los procesos en donde se acceden a recursos compartidos y dotarlas de la posibilidad de ejecucion como si fueran
una única instruccion
ARCO Sincronización
Seccion Critica
Seccion Critica: Aquellas partes de los procesos concurrentes que no pueden ejecutarse de forma concurrente.
Los procesos deben de acceder en
Exclusion Mutua
ARCO Sincronización
Problema de la Sección Critica
Sistema compuesto por n procesos
Cada uno tiene un (mismo) fragmento de
código:
sección crítica
Sólo uno de los procesos en cada instante
puede ejecutar en la sección crítica
Cuando un proceso está ejecutando en la
sección crítica, ningún otro puede hacerlo
ARCO Sincronización
Para conseguir dicha exclusión mutua se deben de implementar protocolos software o hardware que impidan o bloqueen el acceso a una SC mientras está siendo utilizada por otro proceso.
Solución general:do {
protocolo de entrada
sección crítica
protocolo de salida
resto de la sección
} while (TRUE);
Problema de la Sección Critica
ARCO Sincronización
Problema de la sección crítica
Toda solución debe cumplir tres condiciones
Exclusión mutua
Progreso
Espera limitada
ARCO Sincronización
Tipos de soluciones
Soluciones soft. basadas en variables de control (DecKer,Peterson,..)
Soluciones hw. basadas en instrucciones máquina específicas (test-and-set o
swap)
Soluciones basadas en primitivas del SO
Soluciones basadas en regiones críticas y
monitores
ARCO Sincronización
Problemas clásicos de comunicacióny sincronización
El problema del productor-consumidor
El problema de los lectores-escritores
Comunicación cliente-servidor
ARCO Sincronización
Problema del productor-consumidor
ARCO Sincronización
El problema de los lectores-escritores
ARCO Sincronización
Comunicación cliente-servidor
Primitivas del SO para comunicación y sincronizacion
ARCO Sincronización
Primitivas del SO
Mecanismos de comunicaciónTuberías (pipes, FIFOS)
Paso de mensajes
Mecanismos de sincronizacionServicios del sistema operativo:
Señales (asincronismo)
Tuberías (pipes, FIFOS)
Semáforos
Paso de mensajes
Las operaciones de sincronización deben ser
atómicas
ARCO Sincronización
Semáforos
Introducidos por Dijkstra en los años 60
Es un tipo especial de variable que sólo puede ser
accedida por dos primitivas P y V
P (semáforo): operación atómica que espera hasta que la variable
semáforo sea positiva, en este momento la
decrementa en 1
V (semáforo): operación atómica que incrementa la variable semáforo
en 1
¿Cómo quedaría el problema de la sección crítica
con semáforos?
ARCO Sincronización
Operaciones sobre Semáforos
Wait(s) {
s = s - 1;
if (s < 0) {
<Bloquear al proceso>
}
}
signal(s) {
s = s + 1;
if (s <= 0)
<Desbloquear a un proceso bloqueado por la
operacion wait>
}
}
ARCO Sincronización
Características de los semáforos
Son independientes de la máquina
Son simples
Pueden trabajar con varios procesos
Doble uso de los semáforos:
Exclusión mutua
Sincronización
ARCO Sincronización
Secciones críticas con semáforos
Wait(s); /* P(s) entrada en la seccion critica */
< seccion critica >
signal(s); /* V(S) salida de la seccion critica */
El semáforo debe tener valor inicial 1
ARCO Sincronización
EJEMPLO USO SEMAFOROS
P0
Valor del
semáforo (s)
wait(s)
signal(s)
signal(s)
signal(s)
wait(s)
desbloquea
Desbloquea
wait(s)
1
1
0
-1
-2
-1
0
P1
P2
Ejecutando código de la sección crítica
Proceso bloqueado en el semáforo
ARCO Sincronización
Productor-consumidor
Restricciones:
El consumidor espera a que haya datos en el buffer
El productor espera a que haya buffers vacíos
Sólo un único proceso puede manipular el buffer a la vez
Semáforos:
smf_llenos, smf_vacíos y exmut
Inicialización:
smf_llenos = 0
smf_vacíos = número_de_buffers
exmut = 1
ARCO Sincronización
ProductorConsumidor
P (smf_vacíos);
P (exmut);
Produce un dato;
V (exmut);
V (smf_llenos);
P (smf_llenos);
P (exmut);
Consume el dato;
V (exmut);
V (smf_vacíos);
¿Por qué el productor hace P(smf_vacíos) y V(smf_llenos)?
¿Es importante el orden en que se ejecutan las
primitivas P y V?
¿Cómo podemos extender el problema si hay dos
consumidores?
ARCO Sincronización
Lectores-escritores
Descripción:
Los escritores acceden a la BBDD cuando no haya
ningún otro escritor y ningún lector. Semáforo escribir
Los lectores acceden cuando no haya ningún escritor
accediendo o esperando. Semáforo leer
Variables compartidas: LA, LE, EA, EE. A estas variables
accederemos en exclusión mutua. Semáforo exmut
ARCO Sincronización
Iniciación
leer = escribir = 0
exmut = 1
LA = EA = LE = EE = 0
Además:
Los escritores tienen prioridad sobre los lectores
ARCO Sincronización
LectorEscritor
P (exmut);
if ((EA + EE) == 0) {
V (leer);
LA = LA + 1;
} else {
LE = LE + 1;
}
V (exmut);
P (leer);
Leemos los datos;
P (exmut);
LA = LA - 1;
if (LA == 0 && EE > 0) {
V (escribir);
EA = EA + 1;
EE = EE - 1;
}
P (exmut);if (( EA + LA + EE) ==
0){V (escribir);EA = EA + 1;
} else {EE = EE + 1;
}V (exmut);P (escribir);Escribimos los datos;P (exmut);EA = EA - 1;if (EE > 0) {
V (escribir);EA = EA + 1;EE = EE - 1;
} else while (LE > 0) {V (leer);LA = LA + 1;LE = LE - 1;
}V (exmut);
ARCO Sincronización
Problema del barbero dormilón
Problema: 1 barbero y N sillas de espera
Si un cliente entra y no hay sillas, se va
Semáforos:clientes: número de clientes en espera sin contar el que
está en la silla del peluquero
barberos: número de barberos inactivos
exmut: exclusión mutua
Variable compartida:esperando: número de clientes esperando
Inicialmente:clientes=0 barberos=0 exmut=1 esperando=0
ARCO Sincronización
Barbero Cliente
do {
P(exmut);
if (esperando < SILLAS) {
esperando=esperando + 1;
V(clientes);
V(exmut);
P(barberos);
/* Se corta el pelo */
} else {
V(exmut);
}
} while (PELOLARGO);
do {
P(clientes);
P(exmut);
esperando=esperando-
1;
V(barberos);
V(exmut);
/* Corta el pelo */
} while (TRUE);
ARCO Sincronización
Problema del puente estrecho
Por un puente sólo pueden pasar o coches que suben o coches que bajan.
Solución:
Variables compartidas:int contadorsubida = 0, contadorbajada = 0;
semaforo exmut_s, exmut_b, puente;
Iniciación:
Los semáforos inicialmente deben valer 1
No se tratan los problemas de inanición