Sunteți pe pagina 1din 31

Programacin Concurrente

Tema 3

Sincronizacin con Semforos

Grado en Informtica

Bibliografa
z

Programacin Concurrente J. Palma et al. Thomson, 2003,


z

Captulo 4

Principles of Concurrent and Distributed Programming M. Ben-Ari. Prentice Hall, 2006 (Segunda Edicion)
Captulo 6

The Little Book of Semaphores Allen B Downey


Presentacin basada en textos de sidelab URJC. (Creative Commons)

Sincronizacin con Semforos


z z
z

Qu es un Semforo? Exclusin Mutua Sincronizacin Condicional

Sincronizacin de Barrera

{ { {

Metodologa de Desarrollo Sincronizacin Avanzada


z

Comunicacin con Buffer

Conclusiones

Qu es un Semforo?
z

Dijkstra (1968), introdujo la primera primitiva de sincronizacin con espera pasiva y la llam Semforo Son herramientas de bajo nivel que permiten la sincronizacin condicional entre procesos y la exclusin mutua en el acceso a las secciones crticas

Dijkstra (1930-2002)

Qu es un Semforo?
z

Un semforo es una Clase (Programacin Orientada a Objetos) o Tipo Abstracto de Datos (Programacin estructurada) En la parte privada tiene un contador de permisos y un conjunto de procesos bloqueados En la E l parte t pblica bli ti tiene mtodos t d ( (o procedimientos) di i t ) para bloquear y desbloquear procesos dependiendo del contador de permisos del semforo

Qu es un Semforo?
z

Valores permitidos:

En general los valores permitidos para un semforo son enteros no negativos. Cuando slo admiten como valor 0 y 1 se denominan semforos binarios.

Qu es un Semforo?
z

Operaciones: wait(s) y signal(s) (operaciones atmicas)


z

wait(s);

Si el valor del semforo es mayor que 0 (s>0), se decrementa una unidad y el proceso contina su ejecucin

s := s - 1

Si el valor del del semforo es cero (s=0) el proceso suspende su ejecucin, pasa al estado bloqueado y se aade al conjunto de procesos bloqueados en el semforo

Qu es un Semforo?
z z

Operaciones (cont.): signal(s);

Si no existen procesos bloqueados en el semforo, incrementa ste y contina la ejecucin s := s + 1

Si existen procesos bloqueados en el semforo, desbloquea algn proceso y contina su ejecucin

Qu es un Semforo?
z

Se puede pensar en un semforo como una caja de bolas

El contador corresponde al nmero de bolas que hay en la caja wait(s);


z z

El proceso que ejecuta wait necesita llevarse una bola de la caja Si no hay bolas, se bloquea hasta que haya

signal(s);
z z

Siempre echa una bola a la caja Si algn l proceso estaba b esperando d b bola, l l la coge y se d desbloquea bl

Qu es un Semforo?
z

Diferentes nombres p para las operaciones p wait y signal g

Las operaciones de gestin del semforo reciben diferentes nombres dependiendo del sistema operativo, lenguaje de programacin y/o librera. release V Descripcin Losnombres que Dijkstra puso originalmente alas operaciones enholands.Vproviene deverhogen (incrementar)yPproviene deportmanteauprolaag (intentar reducir) ALGOL68,elkerneldeLinuxkernelyalgunos libros detexto PascalFC yalgunoslibrosdetexto Procuresignificaobteneryvacate desocupar APIjava.util.concurrent.Semaphore (Java)

acquire P

Down Wait Pend Procure

Up Signal Post Vacate release

10

acquire

Qu es un Semforo?
z

Tipos de Semforos

Segn el valor que puede tomar


z z

Semforos Binarios (0 y 1) Semforos Generales o No negativos FIFO (First In, First Out): Los procesos se desbloquean en orden de llegada Aleatorio: Los procesos se desbloquean aletoriamente

Segn la poltica de desbloqueo


z z

11

Semforos en Pascal-FC
z

Pascal-FC permite el tipo semaforo general (no negativo) ti )


Declaracin y operaciones: var s:semaphore; wait(s); signal(s);
z z

Son procedimientos que ejecutan los procesos Son instrucciones atmicas

initial(s,valorInicial);
z z

Asigna un valor inicial (no negativo) al semforo Solo se puede llamar en la parte secuencial del programa principal (fuera del cobegin coend)

12

Semforos en Pascal-FC
z

Variables de tipo Semforo

Ejemplos varios de declaracin:

var s1,s2:semaphore; arraySemaforo:array [1..5] of semaphore; regSemaforo:record g i:integer; s:semaphore; end;

13

Semforos en Pascal-FC

z z

Slo se pueden definir variables de tipo semforo en el programa principal Se pueden pasar como parmetros a procesos, procedimientos y funciones, necesitan ser parmetros p p por referencia. (var en PascalFC) )

14

Sincronizacin con Semforos


z z

Qu es u un Se Semforo? oo Sincronizacin Condicional


{ {

Exclusin Mutua Sincronizacin Avanzada

{ {

Metodologa de Desarrollo Conclusiones

15

Exclusin Mutua
z

El problema de la Exclusin Mutua

Seccin Crtica
z

Representa una secuencia de instrucciones que debe ejecutar cada proceso sin que haya interferencia con la ejecucin de instrucciones de las secciones crticas de los dems procesos. Normalmente se corresponde con la utilizacin de un cierto recurso comn de acceso exclusivo. Representa las sentencias que pueden ser ejecutadas concurrentemente por todos los procesos

S Seccin i No N Crtica C ti
z

16

Exclusin Mutua
z

Problema de la Exclusin Mutua


{

process proceso; begin repeat preprotocolo; seccion_critica; postprotocolo; seccion_no_critica; i iti forever end;

El preprotocolo y postprotocolo son instrucciones que deben ejecutar los procesos, para garantizar que el acceso a las secciones crticas se realizan cumpliendo li d l los requisitos i it que se le exigen a la solucin Se asume que los procesos finalizan su ejecucin fuera de la seccin crtica

17

Exclusin Mutua
Ejemplo: ambos procesos acceden a una variable compartida cont. Utilizamos un semforo binario (inicializado a 1) Si el valor del semforo es 1 , la seccin crtica est libre Si el valor es 0, la seccin crtica est ocupada por otro proceso

program excMutSem; process type tProceso(var em: semaphore); begin repeat wait(em); cont := cont +1 (* Seccin Crtica *) signal(em); g ( ); (* Seccin No Crtica *) write('Seccion No Critica'); forever end; var mutex:semaphore; p1,p2:tProceso; cont : integer; begin initial( mutex,1); cont := 0; cobegin p1(mutex); p2(mutex); coend; end.
BLP (06-07) 18

18

Exclusin Mutua Generalizada (Multiplex)


z

Se tiene cuando el nmero de procesos que pueden ejecutar la seccin crtica a la vez es N >1 Se implementa con semforos generales asignando inicialmente un valor N al semforo

19

Exclusin Mutua Generalizada

program multiplex; process type tProceso(var acceso: semaphore); begin repeat (* Preprotocolo *) wait(acceso); (* Seccin Crtica *) write('SC '); (* Postprotocolo *) signal(acceso); (* Seccin No Crtica *) write('SNC '); forever end; var acceso:semaphore; p:array [1..5] of tProceso; i:integer; begin initial(acceso,3); cobegin for i:=1 to 5 do p[i](acceso); coend; end. BLP (06-07)

El valor del semforo nos indica los huecos libres que quedan en la seccin crtica

20

20

10

Sincronizacin con Semforos


z z

Qu es u un Se Semforo? oo Sincronizacin Condicional


{ {

Exclusin Mutua Sincronizacin Avanzada

{ {

Metodologa de Desarrollo Conclusiones

21

Sincronizacin Avanzada
z

Todo programa concurrente se puede implementar con sincronizaciones condicionales y exclusiones mutuas Existen variantes de estas formas de sincronizacin que se utilizan habitualmente en la programacin concurrente En este apartado se veremos las ms usuales

22

11

Sincronizacin Condicional
z z

Se produce cuando un proceso debe esperar a que se cumpla una cierta condicin para proseguir su ejecucin Esta condicin slo puede ser activada por otro proceso

Proceso A

PA1

PA2

Proceso B

PB1

PB2

Diagrama de Precedencia

23

program sinccond;

Sincronizacin Condicional Implementacin con Espera Activa


Proceso A PA1 Proceso B PB1

process tPA(var continuar:boolean); begin write('PA1 '); continuar := true; write('PA2 '); end; process tPB(var continuar:boolean); begin write('PB1 '); while not continuar do null; write('PB2 '); end; var continuar: boolean; procA:tPA; procB:tPB; begin continuar := false; cobegin procA(continuar); procB(continuar); coend; end. BLP (06-07)

PA2

PB2

24

24

12

program sinccond;

Sincronizacin Condicional

Implementacin I l t i con Semforos


Proceso A PA1 Proceso B PB1 PB2 PA2

process tPA(var sc:semaphore); begin write('PA1 '); signal(sc); write('PA2 '); end; process tPB(var sc:semaphore); begin write('PB1 '); wait(sc); write('PB2 '); end; var sc: semaphore; procA:tPA; procB:tPB; begin initial(sc,0); cobegin procA(sc); procB(sc); coend; end.

25

25

Rendezvous
z

El Proceso A debe esperar al Proceso B y viceversa

Proceso A

PA1

PA2

Proceso B

PB1

PB2

Diagrama de Precedencia

26

13

program rendezvous;

Sincronizacin Condicional

Implementacin I l t i con Semforos

Proc A P Proc B

PA1 PB1

PA2 PB2

process tPA; begin write('PA1 '); signal(aArraived); wait (bArraived); write('PA2 '); end; process tPB begin write('PB1 '); signal(bArraived); wait(aArraived); write('PB2 '); end; var aArraived bArraived: semaphore; aArraived,bArraived: procA:tPA; procB:tPB; begin initial(aArraived,0);initial(bArraived,0); cobegin procA; procB; coend; end.
27

Diagrama de Precedencia

27

Sincronizacin de Barrera
z

La Sincronizacin de Barrera es una sincronizacin condicional en la que los procesos tienen que esperar a que el resto de procesos lleguen al mismo punto para poder continuar su ejecucin Vamos a estudiar este tipo de sincronizacin con los siguientes requisitos

Programa con N procesos Cada proceso escribe la letra A A y luego la B B Los procesos tienen que esperar que todos hayan escrito la letra A antes de escribir la B

28

14

process type tProceso; begin write('A');

Sincronizacin de Barrera
Aproximacin Incorrecta Puede provocar interbloqueo (deadlock). El ltimo desbloquea, pero slo uno de los procesos que esperan pueden pasar

{} {} {Rendezvous} if nProcesos = NPR then signal(sbarrera); {} wait(sbarrera); write('B'); {Punto crtico} end;

wait(mutex); nProcesos := nProcesos + 1; signal (mutex);

var proc: array [1..NPR] of tProceso; i:integer;

const NPR=... var mutex : semaphore; sbarrera: semaphore; nProcesos: integer;

29

begin nProcesos := 0; initial(sbarrera,0); initial(mutex,1); cobegin for i:=1 to NPR do proc[i]; coend; end.

Sincronizacin de Barrera
2 Aproximacin I Incorrecta t Si se deja la consulta del contador fuera de la Exclusin Mutua, puede ocurrir que dos procesos hagan signal

process type tProceso; var i:integer; begin write('A'); wait(mutexNP); nProcesos:= nProcesos + 1; signal(mutexNP); if nProcesos < NPR then wait(sbarrera) else for i:=1 to NPR-1 do signal(sbarrera); write('B'); end;

const NPR=... var sbarrera: semaphore; nProcesos: integer; mutexMP: semaphore;

initial(sbarrera,0); nProcesos := 0; initial(mutexNP,1);

30

15

Sincronizacin de Barrera
1 Solucin C Correcta t Si el proceso no es el ltimo libera la EM y se bloquea. Si es el ltimo, sale del mutex y desbloquea a los dems procesos
const NPR=... var sbarrera: semaphore; nProcesos: integer; mutexMP: semaphore;

process type tProceso; var i:integer; begin write('A'); wait(mutexNP); nProcesos := nProcesos + 1; if nProcesos < NPR then begin signal(mutexNP); wait(sbarrera); end else begin signal(mutexNP); for i:=1 to NPR-1 do signal(sbarrera); end; write('B'); end; e d;

initial(sbarrera,0); nProcesos := 0; initial(mutexNP,1);

31

No puede utilizarse en un bucle con reentrada podra producir inanicin

Sincronizacin de Barrera

process type tProceso; var i:integer; begin write('A'); wait(mutexNP); nProcesos := nProcesos + 1; signal(mutexNP); if nProcesos = NPR then for i:=1 to NPR do signal(sbarrera);

2 Aproximacin I Incorrecta t Si se deja la consulta del contador fuera de la Exclusin Mutua, puede ocurrir que dos procesos hagan signal

wait(sbarrera); write('B'); end;

const NPR=... var sbarrera: semaphore; nProcesos: integer; mutexMP: semaphore;

initial(sbarrera,0); nProcesos := 0; initial(control.emNProcesos,1);

32

No puede utilizarse en un bucle con reentrada podra producir inanicin

16

Sincronizacin de Barrera

process type tProceso; var i:integer; begin write('A'); wait(mutexNP); nProcesos := nProcesos + 1; if nProcesos = NPR then for i:=1 to NPR do signal(sbarrera); signal(mutexNP); wait(sbarrera); write('B'); end;

1 Solucin Correcta En la rama del if el proceso deja el semforo preparado para cuando l mismo ejecute un wait i
const NPR=... var sbarrera: semaphore; nProcesos: integer; mutexMP: semaphore;

initial(sbarrera,0); nProcesos := 0; initial(control.emNProcesos,1);

33

No puede utilizarse en un bucle con reentrada podra producir inanicin

Sincronizacin de Barrera
2 Solucin correcta turnstile (Torno)

process type tProceso; begin write('A'); wait(mutex); nProcesos := nProcesos + 1; signal (mutex); if nProcesos = NPR then signal(sbarrera); wait(sbarrera); {Torno} signal(sbarrera); { } write('B'); end;

const NPR=... var mutex : semaphore; sbarrera: semaphore; nProcesos: integer;

cont := 0; initial(barrera,0); initial(mutex,1);

Torno: El patrn -un wait y un signal sucesivos- ocurre a menudo y tiene un nombre Turnstie (Torno), porque slo permite el paso de un proceso a la vez y adems permite ser bloqueado para parar todos los procesos. Si inicialmente vale 0 el torno est bloqueado.

34

17

Barrera reutilizable
z

A menudo un conjunto de Hilos/Procesos que cooperan realizan una serie de pasos en un blucle y se sincronizan en una barrera cada vuelta. Para esta aplicacin necesitamos una barrera reutilizable para la entrada y la salida

35

Barrera reutilizable (con Tornos)


Inicialmente el primer torno est bloqueado y el segundo abierto. Cuando todos llegan al primero cerramos el segundo y abrimos b i el l primero
torno1: semaphore; torno2: semaphore; mutex: semaphore;

process type tProceso; begin repeat write('A'); wait(mutex); cont := cont+1; if (cont=NPR) then begin wait(torno2); {bloquea el segundo torno} signal(torno1); {desbloquea el primero} end; signal(mutex); wait(torno1); {primer torno} signal(torno1); write('B'); {Punto crtico}

wait(mutex); cont := cont-1; if (cont=0) then begin wait(torno1); {bloquea el primero} signal(torno2); {desbloquea el segundo} end; signal(mutex); wait(torno2); {segundo torno} signal(torno2); forever; end;

36

cont : integer;

initial(torno1,0); initial(torno2,1); initial(mutex,1); cont :=0;

18

Estudiantes Fumadores
z

Se desea implementar un ciclo de 4 procesos que se ejecuntan concurrentemente, cada proceso muestran Ax (siendo x el nmero del proceso) y se espera antes de salir a los dems. El ltimo proceso muestra - y desbloquea a los dems Si se necesita usar una nica barrera en un bucle, debe tenerse control de los desbloqueos de los procesos

37

Barrera reutilizable (con Tornos)


Inicialmente el primer torno est bloqueado y el segundo abierto. Cuando todos llegan al primero cerramos el segundo y abrimos b i el l primero
sb: semaphore; desbloqueo: semaphore; mutex: semaphore;

process type tProceso; begin write('A'); wait(mutex); cont := cont+1; if (cont<NPROCESOS) then begin signal(mutex); wait(sb); signal(desbloqueo); end else signal(mutex); wait(torno1); {primer torno} signal(torno1); write('B'); {Punto crtico}

wait(mutex); cont := cont-1; if (cont=0) then begin g wait(torno1); {bloquea el primero} signal(torno2); {desbloquea el segundo} end; signal(mutex); wait(torno2); {segundo torno} signal(torno2); initial(torno1,0); end;

38

cont : integer;

initial(torno2,1); initial(mutex,1); cont :=0;

19

Sincronizacin con Semforos


z z
z

Qu es un Semforo? Exclusin Mutua Sincronizacin Condicional


Sincronizacin de Barrera Metodologa de Desarrollo

{ {

Sincronizacin Avanzada
z

Comunicacin con Buffer

Conclusiones

39

Metodologa de Desarrollo
z

A medida que los programas concurrentes se hacen ms complejos, se hace necesario seguir una metodologa que permita guiar el desarrollo de los mismos A continuacin se definen una serie de pasos que se pueden seguir para crear un programa concurrente partiendo de unos requisitos

40

20

Metodologa de Desarrollo
z

1) Definir la arquitectura de los procesos


Nmero de Procesos Tipo de Procesos

z z

2) Implementar lo que tiene que hacer cada proceso de forma secuencial (en el lenguaje que utilicemos) 3) Determinar los puntos de sincronizacin en el cdigo

Sincronizacin Condicional o Exclusin Mutua? Nmero de Semforos Necesarios


z z

Se pueden bloquear todos los procesos juntos? Se puede desbloquear cualquiera de ellos?

4) Programacin de wait y signal definiendo las variables necesarias para controlar la sincronizacin 5) Gestin de variables

Inicializacin de booleanas a true/false, contadores a 0 Bajo Exclusin Mutua si son compartidas

41

Comunicacin con Buffer


z z

z z

Hasta ahora hemos visto cmo los procesos se comunican con una variable Es habitual que los procesos se comuniquen con un buffer con varias posiciones para almacenar temporalmente informacin El buffer permite que se pueda ir insertando informacin aunque no est preparado el proceso encargado de usarla El problema tpico con el que se estudia la comunicacin con buffer es

El Problema de los Productores Consumidores

42

21

Comunicacin con Buffer

Productores Consumidores
z

Procesos

Los Productores son procesos que generan datos Los Consumidores son procesos que consumen los datos en el orden en que se generan Cada productor genera un nico dato cada vez Un consumidor slo puede consumir un dato cuando ste haya sido generado por el productor Todos los productos se consumen

Restricciones

43

Comunicacin con Buffer

Productores Consumidores
z

Sincronizacin

Los consumidores deben de bloquearse cuando no tengan datos que consumir Los productores deben bloquearse cuando el buffer est lleno Se utilizar un buffer para almacenar los datos producidos antes de ser consumidos

Comunicacin

44

22

Comunicacin con Buffer

Productores Consumidores
var buffer:tBuffer; i:integer; prod:array [1..5] of tProductor; cons:array [1..3] of tConsumidor; begin inicializar(buffer); cobegin for i:=1 to 5 do prod[i](buffer); for i:=1 to 3 do cons[i](buffer); coend; end. process type tProductor (var buffer:tBuffer); var dato: integer; begin repeat dato := random(200); insertar(dato,buffer); forever end; process type tConsumidor (var buffer:tBuffer); var dato: integer; begin repeat sacar(dato,buffer); writeln(dato); forever end; 45

45

Comunicacin con Buffer Buffer Circular


posSacar 1 8 2

type tBuffer = record datos: array [1..MAXDATOS] of integer; posInser, posSacar:integer; end; procedure inicializar(var buffer:tBuffer); begin buffer.posInser p := 1; buffer.posSacar := 1; end; procedure insertar(dato:integer; var buffer:tBuffer); begin buffer.datos[buffer.posInser]:= dato; buffer.posInser := buffer.posInser MOD MAXDATOS + 1; end; procedure sacar(var dato:integer; var buffer:tBuffer); begin dato:=buffer.datos[buffer.posSacar]; buffer.posSacar := buffer.posSacar MOD MAXDATOS + 1; end;

* * * *
6 posInser 5

46

23

Comunicacin con Buffer

Productores Consumidores
z

Falta incorporar los puntos de sincronizacin

Sincronizacin Condicional
z z

Un productor se bloquear antes de insertar un dato si el buffer est lleno Un consumidor se bloquear antes de leer un dato si el buffer est vaco Las variables de control del buffer deben estar bajo exclusin mutua

Exclusin Mutua
z

47

Comunicacin con Buffer

Productores Consumidores
z

Declaramos los semforos necesarios


type tBuffer = record datos: array [1..MAXDATOS] of integer; posInser, posSacar: integer; nProductos,nHuecos,em:semaphore; end;

Inicializamos los semforos


procedure inicializar(var buffer:tBuffer); begin buffer.posInser := 1; buffer.posSacar := 1; initial(buffer.nProductos,0); initial(buffer.nHuecos,MAXDATOS); initial(buffer.em,1); end;

48

24

Comunicacin con Buffer


z

Insertar

procedure insertar(dato:integer; var buffer:tBuffer); begin wait(buffer.nHuecos); wait(buffer.em); buffer.datos[buffer.posInser]:= dato; buffer.posInser := buffer.posInser MOD MAXDATOS + 1; signal(buffer.em); signal(buffer.nProductos); end;

49

Comunicacin con Buffer


z

Sacar

procedure sacar(var dato:integer; var buffer:tBuffer); begin wait(buffer.nProductos); wait(buffer.em); dato := buffer.datos[buffer.posSacar]; buffer.posSacar := buffer.posSacar MOD MAXDATOS + 1; signal(buffer.em); signal(buffer.nHuecos); end;

50

25

Sincronizacin con Semforos


z z
z

Qu es un Semforo? Exclusin Mutua Sincronizacin Condicional

Sincronizacin de Barrera

{ { {

Metodologa de Desarrollo Sincronizacin Avanzada


z

Comunicacin con Buffer

Conclusiones

51

Conclusiones
z

Ventajas de los Semforos

Permiten resolver de forma sencilla y eficiente la sincronizacin de procesos concurrentes Se pueden usar para implementar de forma muy sencilla el problema de la Exclusin Mutua Estn presentes en la mayora de lenguajes y libreras de soporte a la concurrencia

52

26

Conclusiones
z

Desventajas de los Semforos


Son primitivas de muy bajo nivel Omitir un simple signal lleva a interbloqueo Omitir un simple wait lleva a la violacin de la Exclusin Mutua Colocar las operaciones wait/signal en los lugares no adecuados llevan a comportamientos errneos del p g programa No estructuran el cdigo del programa (libertad total para acceder a las variables compartidas), lo que hace que los cdigos sean difciles de mantener y de rastrear errores

53

Conclusiones
z

Puesto que los semforos tienen ciertas desventajas, existen otras herramientas de sincronizacin de espera pasiva con mayor nivel de abstraccin

Modelo de Memoria Compartida


z z z z z z z

Semforos Monitores Regiones Crticas Regiones Crticas Condicionales Sucesos Buzones R Recursos Envo asncrono Envo sncrono o cita simple Invocacin Remota o cita extendida

Modelo de Paso de Mensajes


z z z

54

27

Problema de la Comida de los Filsofos (Dijsktra 1965)


z

Enunciado

Cinco filsofos dedican su vida a pensar y a comer (estas dos acciones son finitas en el tiempo). Los filsofos comparten una mesa rodeada de cinco sillas, cada una de un filsofo. En el centro de la mesa hay comida y en la mesa cinco palillos y cinco platos. De vez en cuando, un filsofo siente hambre, se sienta y trata de coger los dos palillos que hay cerca de l y come sin soltar los palillos, cuando termina de comer suelta los palillos. El problema a solucionar es crear un ritual (algoritmo que permita comer a los filsofos)

55

Problema de la Comida de Filsofos (Enunciado)

0 4 0 1 1 4 3 3 2 2

Los N palillos son los recursos compartidos por los filsofos.

56

28

Problema de la Comida de los Filsofos


z

Los filsofos representan procesos/hilos interactivos que realizan el siguiente bucle: process type filosofo (name : integer); begin repeat Pensar; Coger palillos; Comer; Soltar Palillos; forever end;

57

Problema de la Comida de los Filsofos


z

Asumimos: Cada filsofo tiene una variable local i que lo identifica con valores (0..4) De forma similar los palillos estn numerados de 0 a 4.
z

Por lo tanto el filosofo i tiene el palillo i a la derecha y el i+1 a la izquierda

Limitaciones

Slo 5 palillos (por los recortes de fondos de la Universidad) Un filsofo necesita 2 palillos para comer Un filsofo slo puede coger el palillo de su izquierda y el de su derecha
z

Por tanto un filoso hambriento debe esperar a que su vecino suelte el palillo.

58

29

Problema de la Comida de los Filsofos


z

Suponemos p q que los filsofos saben como comer y como pensar.. ,nuestro trabajo es hacer una versin de cogerPalillos y soltarPalillos que satisfaga las siguientes restricciones:

59

Un palillo slo puede estar en posesin de un filsofo al mismo tiempo (Exclusin mutua). Slo puede comer si tiene los dos palillos (sincronizacin condicional) di i l) Debemos evitar el deadlock y el livelock Debemos evitar el starvation de un filosofo esperando un palillo. Debe ser posible que ms de un filsofo coma al mismo tiempo

Problema de la Comida de los Filsofos


z

1.Raliza 1 Raliza una solucin que consiga la exclusin mutua en el uso de los palillos. Problema?

60

30

Problema de la Comida de los Filsofos (otras soluciones)


z

Solucin 1:

Si como mximo N-1 filsofos se sientan a la mesa.. al final uno siempre tendr dos palillos Usa un semforo general para representar N-1 sillas disponibles Evitar la espera circular. Hacer uno de los filsofos diferente (zurdo).

Solucin 12

61

Problema: Estudiantes Fumadores


z

z z

Cuatro amigos estn estudiando en la biblioteca cada x tiempo les apetece fumar pero no salen hasta que todos tienen ganas de fumar. Cuando al cuarto tambin le apetece fumar dice Vamos a fumar, desbloquea a los otros y salen a fumar Estn un rato fumando y vuelven a entrar, el proceso se repite. Simula el problema con semforos. Intenta realizarlo con un contador y una nica barrera.

z z

62

31

S-ar putea să vă placă și