Sincronización de procesos - diseño de sistemas operativos (2812)

Anuncio
Sincronización de
procesos
Contenido
•  Procesos concurrentes.
•  El problema de la seccion critica
•  Problemas clásicos de comunicación y
sincronización.
•  M e c a n i s m o s d e c o m u n i c a c i ó n y
sincronización.
DSO 2014
2
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
DSO 2014
3
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.
DSO 2014
4
Sincronización
Ejemplo
Procesador 2
Procesador 1
Lee PID
Registro o
posición de memoria
PID = 500
PID = 500
Lee PID
Incrementa y
asigna PID
PID = 501 Escribe PID
PID = 501
PID = 500
Incrementa y
asigna PID
PID = 501
PID = 501
DSO 2014
5
Escribe PID
Sincronización
DSO 2014
6
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);
DSO 2014
7
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 contador
do {
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);
DSO 2014
8
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;
Productor
Consumidor
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
DSO 2014
9
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
DSO 2014
10
Sincronización
DSO 2014
11
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
DSO 2014
12
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
DSO 2014
13
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
DSO 2014
14
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
DSO 2014
15
Sincronización
Problema de la Sección Critica
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);
DSO 2014
16
Sincronización
Problema de la sección crítica
•  Toda solución debe cumplir tres condiciones
– Exclusión mutua
– Progreso
– Espera limitada
DSO 2014
17
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
(impartido en ARCO 2007-2008)‫‏‬
•  Soluciones basadas en regiones críticas y
monitores
DSO 2014
18
Sincronización
Problemas clásicos de comunicación
y sincronización
•  El problema del productor-consumidor
•  El problema de los lectores-escritores
•  Comunicación cliente-servidor
DSO 2014
19
Sincronización
Problema del productorconsumidor
Proceso
Consumidor
Proceso
Productor
Flujo de
datos
Mecanismo de
comunicación
DSO 2014
20
Sincronización
El problema de los lectores-escritores
Lector
Lector
Escritor
Lector
Escritor
Recurso
DSO 2014
21
Sincronización
Comunicación clienteservidor
Computador
Computador
Petición
Proceso
cliente
Proceso
servidor
S.O.
Respuesta
DSO 2014
22
Sincronización
Primitivas del SO para
comunicación y sincronizacion
Primitivas del SO
–  Mecanismos de comunicación
•  Tuberías (pipes, FIFOS)
•  Paso de mensajes
–  Mecanismos de sincronizacion
•  Servicios del sistema operativo:
■  Señales (asincronismo)
■  Tuberías (pipes, FIFOS)
■  Semáforos
■  Paso de mensajes
•  Las operaciones de sincronización deben ser
atómicas
DSO 2014
24
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?
DSO 2014
25
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>
}
}
DSO 2014
26
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
DSO 2014
27
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
DSO 2014
28
Sincronización
DSO 2014
29
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
DSO 2014
30
Sincronización
Productor
Consumidor
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?
DSO 2014
31
Sincronización
Lectores-escritores
•  Descripción:
• 
Los escritores acceden a la BBDD cuando no haya
ningún otro escritor y ningún lector.
• 
• 
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.
• 
DSO 2014
Semáforo escribir
Semáforo exmut
32
Sincronización
Iniciación
•  leer = escribir = 0
•  exmut = 1
•  LA = EA = LE = EE = 0
•  Además:
Los escritores tienen prioridad sobre los
lectores
DSO 2014
33
Sincronización
Lector
Escritor
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;
}
DSO 2014
34
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);
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
DSO 2014
barberos=0
35
exmut=1
esperando=0
Sincronización
Barbero
Cliente
do {
P(clientes);
P(exmut);
esperando=esperando-1;
V(barberos);
V(exmut);
/* Corta el pelo */
} while (TRUE);
DSO 2014
36
do {
P(exmut);
if (esperando < SILLAS) {
esperando=esperando + 1;
V(clientes);
V(exmut);
P(barberos);
/* Se corta el pelo */
} else {
V(exmut);
}
} while (PELOLARGO);
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
DSO 2014
37
Sincronización
Descargar