Sincronización de procesosumh2269.edu.umh.es/wp-content/uploads/sites/1051/... · ARCO...

Post on 17-Mar-2020

4 views 0 download

Transcript of Sincronización de procesosumh2269.edu.umh.es/wp-content/uploads/sites/1051/... · ARCO...

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