Está en la página 1de 26

Programacin Concurrente y Distribuida

TEMA 4 Regiones Crticas Condicionales

Regiones Crticas Condicionales

1. Introduccin 2. Definicin de Regin Crtica Condicional (RCC) 3. Resolucin de problemas con RCC 4. Inconvenientes de las RCC

1. Introduccin
Hemos visto que los semforos son ms eficientes que la espera ocupada. Por otra parte, tambin presentan algunos inconvenientes y aunque son ms sencillos que la espera ocupada, las soluciones a los problemas de exclusin mutua y sincronizacin generan protocolos complejos y difciles de mantener. Por otra parte, el tratamiento de la sincronizacin y la exclusin mutua se realizan con las mismas primitivas. Sera deseable disponer de una herramienta que tratara de forma distinta la exclusin mutua de la sincronizacin.
3

Programacin Concurrente y Distribuida. Curso 2012-13

1. Introduccin
Para paliar estos problemas se introdujo el concepto de Regin Crtica Condicional (RCC). La RCC constituye un mecanismo estructurado que permite diferenciar entre el control de acceso a la seccin crtica de la implementacin de las condiciones de sincronizacin.

Programacin Concurrente y Distribuida. Curso 2012-13

2. Definicin de Regin Crtica Condicional


Fueron propuestas por C. A. R. Hoare en 1972. El uso de RCC hace que el compilador imponga restricciones al uso de variables compartidas. Por tanto, su uso indebido es detectado en tiempo de compilacin. Para que el compilador puede detectar el uso incorrecto de estas variables, deben ser declaradas de una forma especial:
var i.j: integer; resource SC: i,j;

Programacin Concurrente y Distribuida. Curso 2012-13

La nica restriccin es que una variable no puede pertenecer a ms de un recurso

2. Definicin de Regin Crtica Condicional


Todas las variables compartidas deben pertenecer a un recurso. El acceso a las variables compartidas debe hacerse a travs de la instruccin especial:
region identificador do begin S1; . . . Sn; end;

Programacin Concurrente y Distribuida. Curso 2012-13

Donde identificador se refiere al recurso al que vamos a acceder, y que contiene las variables compartidas.
6

2. Definicin de Regin Crtica Condicional


La RCC garantiza que el cdigo que contiene se ejecuta en exclusin mutua. Los procesos que quieren acceder a la RCC slo lo consiguen en caso de que sta est libre. En caso contrario, se bloquean en la cola asociada a la RCC en espera de su turno para entrar. Cuando el proceso que hace uso de la RCC la abandona, cede el turno al primer proceso de la cola de espera, o la libera si no hay ninguno.

Programacin Concurrente y Distribuida. Curso 2012-13

2. Definicin de Regin Crtica Condicional


Aunque se permite el uso anidado de RCC, hay que tener cuidado de no provocar interbloqueos:

Programacin Concurrente y Distribuida. Curso 2012-13

process P1; begin . . . region R1 do region R2 do S; . . . end;

process P2; begin . . . region R2 do region R1 do S; . . . end;

2. Definicin de Regin Crtica Condicional


Las RCC tambin nos permiten resolver el problema de la implementacin de las condiciones de sincronizacin:
region identificador when condicion do begin S1; . . . Sn; end;

Programacin Concurrente y Distribuida. Curso 2012-13

De esta forma, la condicin booleana condicion nos permite implementar condiciones de sincronizacin, considerando su evaluacin parte de la RCC y garantizando de esta forma la exclusin mutua en la evaluacin de la condicin.

2. Definicin de Regin Crtica Condicional


La ejecucin de una RCC se realiza de la siguiente forma:
1. El proceso debe conseguir acceso en exclusin mutua a la RCC antes de entrar. De no conseguirlo se queda bloqueado en la cola de entrada. 2. Una vez conseguido el acceso evala la condicin booleana. Si es cierta, prosigue la ejecucin. En caso contrario, libera la RCC y se bloquea en la cola de eventos, que est asociada a la condicin. 3. Cuando un proceso sale de la RCC, primero intenta desbloquear a uno de la cola de eventos (que reevalan la condicin). Si ninguno de ellos cumple la condicin, se libera al primero de la cola de entrada. De estar vaca, la RCC queda libre.
10

Programacin Concurrente y Distribuida. Curso 2012-13

2. Definicin de Regin Crtica Condicional


Grficamente tendra el siguiente efecto:
COLA DE ENTRADA
Programacin Concurrente y Distribuida. Curso 2012-13

b := false; . . . region r when b do 2 begin S1; . . . Sn; end;

COLA DE EVENTOS

11

4. Problemas clsicos de concurrencia


El problema del productor-consumidor
program prodcon; const Nproc=6; N=10; var elementos, cola, frente, i: integer; recurso: array[1..N] of item; resource buffer: cola, frente, recurso, elementos;

Programacin Concurrente y Distribuida. Curso 2012-13

12

4. Problemas clsicos de concurrencia


El problema del productor-consumidor
process Productor; begin repeat producir elemento; region buffer when elementos < N do begin recurso[frente]:=item; frente := (frente+1) mod N; elementos := elementos+1; end forever end;

Programacin Concurrente y Distribuida. Curso 2012-13

13

3. Resolucin de problemas con RCC


El problema del productor-consumidor
process Consumidor; begin repeat region buffer when elementos > 0 do begin item := recurso[cola]; cola := (cola+1) mod N; elementos := elementos-1; end consumir elemento; forever end;

Programacin Concurrente y Distribuida. Curso 2012-13

14

3. Resolucin de problemas con RCC


El problema del productor-consumidor
begin elementos:=0; cola:=0; frente:=0; cobegin Productor; Consumidor; coend end

Programacin Concurrente y Distribuida. Curso 2012-13

15

4. Problemas clsicos de concurrencia


El problema de los lectores y los escritores
program lecesc; const nlector=10; nescritor=5; var nl, i: integer; resource datos: nl;

Programacin Concurrente y Distribuida. Curso 2012-13

16

4. Problemas clsicos de concurrencia


El problema de los lectores y los escritores
process type Lector(id:integer); begin repeat region datos do nl:=nl+1; LEER EL RECURSO; region datos do nl:=nl-1; . . . forever end; process type Escritor(id:integer); begin repeat region datos when nl=0 do ESCRIBIR EL RECURSO; . . . forever end;

Programacin Concurrente y Distribuida. Curso 2012-13

17

4. Problemas clsicos de concurrencia


El problema de los lectores y los escritores
var Lectores: array[1..nlector] of Lector; Escritores: array[1..nescritor] of Escritor; begin nl:=0; cobegin for i := 1 to nlector do Lectores[i](i); for i := 1 to nescritor do Escritores[i](i); coend end

Programacin Concurrente y Distribuida. Curso 2012-13

18

4. Problemas clsicos de concurrencia


El problema de los lectores y los escritores (prioridad en escritura)
program lecesc; const nlector=10; nescritor=5; var escribiendo: boolean; nl, nee, i: integer; resource datos: nl, escribiendo, nee;

Programacin Concurrente y Distribuida. Curso 2012-13

19

4. Problemas clsicos de concurrencia


El problema de los lectores y los escritores (prioridad en escritura)
process type Lector(id:integer); begin repeat region datos when not escribiendo and nee=0 do nl:=nl+1; LEER EL RECURSO; region datos do nl:=nl-1; . . . forever end;

Programacin Concurrente y Distribuida. Curso 2012-13

20

4. Problemas clsicos de concurrencia


El problema de los lectores y los escritores (prioridad en escritura)
process type Escritor(id:integer); begin repeat region datos do nee:=nee+1; region datos when not escribiendo and nl=0 do begin nee:=nee1-1; escribiendo:=true; end; ESCRIBIR EL RECURSO; region datos do escribiendo:=false; . . . forever end;

Programacin Concurrente y Distribuida. Curso 2012-13

21

4. Problemas clsicos de concurrencia


El problema de los lectores y los escritores (prioridad en escritura)
var Lectores: array[1..nlector] of Lector; Escritores: array[1..nescritor] of Escritor; begin nl:=0; nee:=0; escribiendo:=false; cobegin for i := 1 to nlector do Lectores[i](i); for i := 1 to nescritor do Escritores[i](i); coend end

Programacin Concurrente y Distribuida. Curso 2012-13

22

4. Problemas clsicos de concurrencia


El problema de la comida de los filsofos
program filosofos; const N=5; var libre: array[1..N]of boolean; i: integer; resource cubiertos: libre;

Programacin Concurrente y Distribuida. Curso 2012-13

23

4. Problemas clsicos de concurrencia


El problema de la comida de los filsofos
process type filosofo(id: integer); begin repeat PIENSA; region cubiertos when libre[i] and libre[(i mod N)+1] do begin libre[i]:=false; libre[(i mod N)+1]:=false; end COME; region cubiertos do begin libre[i]:=true; libre[(i mod N)+1]:=true; end forever 24 end;

Programacin Concurrente y Distribuida. Curso 2012-13

4. Problemas clsicos de concurrencia


El problema de la comida de los filsofos
var Filosofos: array[1..N] of filosofo; begin for i := 1 to N do libre[i]:=true; cobegin for i := 1 to N do Filosofos[i]; coend end

Programacin Concurrente y Distribuida. Curso 2012-13

25

4. Inconvenientes de las RCC


Las RCC estn dispersas por el cdigo, con lo cual, una pequea modificacin en las secciones de la SC obliga a revisar todo el cdigo buscando las RCC afectadas. Una vez que un proceso accede a la RCC puede hacer cualquier operacin con las variables que contiene. Aunque son ms estructuradas que los semforos, su implementacin resulta ms costosa.

Programacin Concurrente y Distribuida. Curso 2012-13

26

También podría gustarte