Programación de Sistemas Concurrentes y Distribuidos

21
Programación de Sistemas Concurrentes y Distribuidos J. Ezpeleta-P. Álvarez 1 Univ. de Zaragoza Lección 5: Sincronización de procesos mediante semáforos • Introducción Estados de un proceso Semáforos: sintaxis y semántica Técnicas de programación con semáforos: el problema de la sección crítica el problema de la barrera el caso de productores/consumidores Algunos ejercicios sencillos

Transcript of Programación de Sistemas Concurrentes y Distribuidos

Page 1: Programación de Sistemas Concurrentes y Distribuidos

Programación de Sistemas Concurrentes y Distribuidos J. Ezpeleta-P. Álvarez 1 Univ. de Zaragoza

Lección 5: Sincronización de procesos mediante semáforos

• Introducción

• Estados de un proceso

• Semáforos: sintaxis y semántica

• Técnicas de programación con semáforos:

– el problema de la sección crítica

– el problema de la barrera

– el caso de productores/consumidores

• Algunos ejercicios sencillos

Page 2: Programación de Sistemas Concurrentes y Distribuidos

Programación de Sistemas Concurrentes y Distribuidos J. Ezpeleta-P. Álvarez 2 Univ. de Zaragoza

Introducción

• La sincronización por espera activa tiene inconvenientes:

– los algoritmos son difíciles de diseñar y verificar

– se mezclan variables del problema a resolver y del método de resolución

– en los casos de multi-programación, se ocupa innecesariamente el procesador “haciendo nada”

• Los semáforos son una de las primeras soluciones

– son una solución conceptual, que puede implementarse de diferentes formas

– propuestos por Dijkstra en 1968

Page 3: Programación de Sistemas Concurrentes y Distribuidos

Programación de Sistemas Concurrentes y Distribuidos J. Ezpeleta-P. Álvarez 3 Univ. de Zaragoza

Estados de un proceso

• Para multitarea, y un proceso P, P.state es su estado

Page 4: Programación de Sistemas Concurrentes y Distribuidos

Programación de Sistemas Concurrentes y Distribuidos J. Ezpeleta-P. Álvarez 4 Univ. de Zaragoza

Estados de un proceso

• Para multitarea, y un proceso P, P.state es su estado

Page 5: Programación de Sistemas Concurrentes y Distribuidos

Programación de Sistemas Concurrentes y Distribuidos J. Ezpeleta-P. Álvarez 5 Univ. de Zaragoza

Semáforos: sintaxis y semántica

• Semáforo: instancia de un tipo abstracto de dato

– S=(k,L)

• tal que ...

– k es un natural

– L es un conjunto de procesos

• con dos instrucciones atómicas...

– wait

– signal

Page 6: Programación de Sistemas Concurrentes y Distribuidos

Programación de Sistemas Concurrentes y Distribuidos J. Ezpeleta-P. Álvarez 6 Univ. de Zaragoza

Semáforos: sintaxis y semántica

• Declaración

• Semántica de las operaciones (atómicas) cuando la invoca P:

semaphore S := (S0,{})

if S.V > 0

S.V := S.V - 1

else

S.L := S.L + {P}

P.state := blocked

wait(S)

Page 7: Programación de Sistemas Concurrentes y Distribuidos

Programación de Sistemas Concurrentes y Distribuidos J. Ezpeleta-P. Álvarez 7 Univ. de Zaragoza

Semáforos: sintaxis y semántica

• Semántica de las operaciones (atómicas) cuando la invoca P:

• Propiedad: un semáforo S cumple el siguiente invariante

if S.L = {}

S.V := S.V + 1

else

S.L := S.L - {Q}

Q.state := ready

signal(S)

S.V = S0 + #signal(S) - #wait(S)

Page 8: Programación de Sistemas Concurrentes y Distribuidos

Programación de Sistemas Concurrentes y Distribuidos J. Ezpeleta-P. Álvarez 8 Univ. de Zaragoza

El problema de la sección crítica

• Ejemplo: la sección crítica

signal(mutex) signal(mutex)

SC SC

wait(mutex) wait(mutex)

SNC SNC

Process Q Process P

semaphore mutex := (1,{})

loop forever loop forever

p1

p2

q1

q2

Page 9: Programación de Sistemas Concurrentes y Distribuidos

Programación de Sistemas Concurrentes y Distribuidos J. Ezpeleta-P. Álvarez 9 Univ. de Zaragoza

Semáforos: sintaxis y semántica

• Semántica alternativa para semáforos: versión “busy-wait”

await S.V > 0

S.V := S.V - 1

wait(S)

S.V := S.V + 1 signal(S)

semaphore S := (S0,{})

Page 10: Programación de Sistemas Concurrentes y Distribuidos

Programación de Sistemas Concurrentes y Distribuidos J. Ezpeleta-P. Álvarez 10 Univ. de Zaragoza

Semáforos: sintaxis y semántica

• En realidad, S.L no hace falta, y podemos identificar S con S.V

await S > 0

S := S - 1

wait(S)

S := S + 1 signal(S)

semaphore S := S0

Page 11: Programación de Sistemas Concurrentes y Distribuidos

Programación de Sistemas Concurrentes y Distribuidos J. Ezpeleta-P. Álvarez 11 Univ. de Zaragoza

Semáforos: sintaxis y semántica

• ¿Cuál es el matiz entre ambas versiones?

S := S + 1 signal(S)

if S.L = {}

S.V := S.V + 1

else

S.L := S.L - {Q}

Q.state := ready

signal(S)

Page 12: Programación de Sistemas Concurrentes y Distribuidos

Programación de Sistemas Concurrentes y Distribuidos J. Ezpeleta-P. Álvarez 12 Univ. de Zaragoza

Semáforos: sintaxis y semántica

• Existe un caso especial: los semáforos binarios

• Declaración

– con S0: 0..1

• Semántica de las operaciones (atómicas) cuando la invoca P:

binary semaphore S := S0

await S = 1

S := 0

wait(S)

await S = 0

S := 1

signal(S)

Page 13: Programación de Sistemas Concurrentes y Distribuidos

Programación de Sistemas Concurrentes y Distribuidos J. Ezpeleta-P. Álvarez 13 Univ. de Zaragoza

El problema de la sección crítica semaphore S := S0

S0 tokens

signal(S)

wait(S)

M(S) = S0 + #signal(S) - #wait(S)

S

Page 14: Programación de Sistemas Concurrentes y Distribuidos

Programación de Sistemas Concurrentes y Distribuidos J. Ezpeleta-P. Álvarez 14 Univ. de Zaragoza

El problema de la sección crítica semaphore S := S0

signal(S)

wait(S)

M(S) = S0 + #signal(S) - #wait(S)

S

Page 15: Programación de Sistemas Concurrentes y Distribuidos

Programación de Sistemas Concurrentes y Distribuidos J. Ezpeleta-P. Álvarez 15 Univ. de Zaragoza

El problema de la sección crítica

• Ejemplo: la sección crítica para dos procesos

• ¿Y para n procesos?

Page 16: Programación de Sistemas Concurrentes y Distribuidos

Programación de Sistemas Concurrentes y Distribuidos J. Ezpeleta-P. Álvarez 16 Univ. de Zaragoza

El problema de la barrera

• Ejemplo: algoritmo para dos procesos iterativos que sincronizan cada iteración mediante una barrera

espera a P espera a Q

cálculos locales cálculos locales

loop forever loop forever

Process Q Process P

????

Page 17: Programación de Sistemas Concurrentes y Distribuidos

Programación de Sistemas Concurrentes y Distribuidos J. Ezpeleta-P. Álvarez 17 Univ. de Zaragoza

Productores/consumidores

• Ejemplo:

– tenemos un sistema con un proceso productor y un consumidor

– y un buffer intermedio de capacidad infinita

usa(d) append(d,buffer)

consume(d,buffer) produce(d)

loop forever loop forever

el_tipo d el_tipo d

Process consumidor Process productor

. . .

queue el_tipo buffer

Page 18: Programación de Sistemas Concurrentes y Distribuidos

Programación de Sistemas Concurrentes y Distribuidos J. Ezpeleta-P. Álvarez 18 Univ. de Zaragoza

Productores/consumidores

• Ejercicio 1: mismo enunciado, pero con un buffer de capacidad 1

• Ejercicio 2: mismo enunciado, pero con un buffer de capacidad N

• Ejercicio 3: dar un esquema de solución al problema de la barrera para n procesos

Page 19: Programación de Sistemas Concurrentes y Distribuidos

Programación de Sistemas Concurrentes y Distribuidos J. Ezpeleta-P. Álvarez 19 Univ. de Zaragoza

Algunos ejercicios sencillos

Process P1 Process P2

a c

b d

• Ejercicio 4: completar los procesos siguientes de manera que “d” no se puede ejecutar hasta que “a” haya acabado

• Ejercicio 5: completar los procesos siguientes de manera que P2 puede ejecutar “d” si se ha ejecutado “e” ó “a”

Process P1 Process P2 Process P3

loop forever loop forever loop forever

a c e

b d f

Page 20: Programación de Sistemas Concurrentes y Distribuidos

Programación de Sistemas Concurrentes y Distribuidos J. Ezpeleta-P. Álvarez 20 Univ. de Zaragoza

Algunos ejercicios sencillos

Page 21: Programación de Sistemas Concurrentes y Distribuidos

Programación de Sistemas Concurrentes y Distribuidos J. Ezpeleta-P. Álvarez 21 Univ. de Zaragoza

Algunos ejercicios sencillos