Vous êtes sur la page 1sur 29

UNIVERSIDAD NACIONAL DE SAN ANTONIO ABAD DEL CUSCO

PROGRAMACIN CONCURRENTE Y PARALELA

Regiones Crticas y Regiones Crticas Condicionales


Ing. Ivan Medrano Valencia

Indice
Problemas con semforos Definicin de las regiones crticas Implementacin de las regiones crticas Regiones Crticas condicionales Algunos problemas con Regiones Crticas condicionales

Problemas con semforos


Debido fundamentalmente a errores en la programacin, es decir, en la secuencia de las operaciones wait y signal.
Intercambio de wait y signal:
signal(mutex); Seccin_crtica wait(mutex);

Cambio de wait y signal: Omisin de wait o signal:


wait(mutex); Seccin_crtica wait(mutex); //wait(mutex); Seccin_crtica //signal(mutex);

No exclusin mutua Dificil deteccin

Interbloqueo

Interbloqueo No exclusin mutua


3

Definicin de las regiones crticas


Una regin crtica es una pieza de cdigo que, POR DEFINICIN, siempre se ejecuta bajo exclusin mutua. Las variables que deben ser protegidas de ser accedidas concurrentemente se agrupan en regiones. Estas variables se etiquetan explcitamente como compartidas. Se prohibe que los procesos entren en una regin en la que ya hay otro proceso activo.

Definicin de las regiones crticas


Notacin original Brinch Hansen. Dos componentes:

Una forma de declarar las variables que deben ser accedidas bajo exclusin mutua
var V: compartida T;

donde V es el nombre de la variable y T es el tipo. Una nueva estructura que se usa para codificar la operacin a realizar sobre la variable
region V hacer S

donde V es el nombre de la variable a ser accedida en la regin crtica y S implementa la accin requerida.

Mientras se ejecuta S ningn otro proceso puede acceder a V.

Ejemplo

Las RCs se pueden anidar, pero debe tenerse en cuenta que las RCs no se deben anidar en orden inverso en los procesos, de lo contrario podra producirse un interbloqueo.

REGION CRITICA CONDICIONAL


Problemas con las regiones crticas

Si se anidan las regiones crticas pueden producirse interbloqueos


P: region X do region Y do S1; Q: region Y do region X do S2;

P y Q se quedan esperando Las regiones crticas resuelven la exclusin mutua pero no la sincronizacin en general.

Regiones Crticas Condicionales


7

REGION CRITICA DONDICIONAL


Con los mecanismos vistos hasta ahora (RCs y semforos) el hecho de que un proceso que quiere acceder a un objeto compartido deba esperar a que se cumpla una cierta condicin (espera condicional) no resulta fcil de implementar, al menos si se pretende que dicha espera sea pasiva. La condicin, habitualmente, har referencia al objeto compartido.

RCC

Supngase que un proceso quiere acceder a una variable compartida x pero slo si se cumple la condicin B(x). Una forma simple de implementar la espera condicional pero que implica una espera activa es la siguiente:

RCC

A principios de los 70 Hoare y Brinch Hansen propusieron un mecanismo de alto nivel que permite realizar la espera condicional de forma pasiva: la regin crtica condicional (RCC). Una RCC slo se diferencia de una RC en que dentro de la RCC existe una sentencia espera_a_que B. Dicha primitiva slo puede estar dentro de una RC. Si existen varias RCs anidadas, espera_a_que se asocia con la ms prxima. Esta sentencia produce una espera pasiva. Su semntica es la siguiente: 1. Si la condicin B es cierta el proceso contina por la siguiente sentencia a la espera_a_que. 2. Si la condicin B es falsa el proceso detiene su ejecucin, abandona la RC para permitir a otros procesos entrar en ella y pasa a una cola Qs de espera asociada con la RC.
10

RCC

Qv que es donde espera un proceso cuando quiere entrar a una RC que est ocupada. Constituye la cola de entrada a la RC. Qs que es donde esperan los procesos que evaluaron la condicin de la sentencia espera_a_que a falso.
11

IMPLEMENTACION DE RCC CON SEMAFOROS


Inicio {de ka RCC} wait(v) {ejecuta el equivalente del espera_a_que hasta que se cumpla B(x)} mientras no B(x) hacer Inicio suspendidos_s = suspendidos_s + 1 {inicialmente 0} signal(v) {salida momentnea de la RCC} wait(s) wait(v) {intento de reentrada a la RCC (espera sobre Qv)} fins {en este punto un proceso ha completado la RCC por lo que deben pasarse los procesos suspendidos sobre la cola Qs a la cola Qv} mientras (suspendidos_s > 0) hacer Inicio suspendidos_s = suspendidos_s - 1 signal(s) fins signal(v) Fin {de la RCC}

12

Ejemplo 1.
En un hotel hay 10 vehculos automticos pequeos y otros 10 grandes. Todos ellos estn controlados por un programa con procesos concurrentes (uno por vehculo). Estamos interesados en la parte del programa que controla la entrada en un montacargas en el que cogen hasta 4 vehculos pequeos o 2 vehculos pequeos y 1 grande

Ejemplo 1.

Ejemplo 1.

Ejemplo 2.
Supngase que existen 4 montones de papeles y que hay que coger uno de cada montn y grapar los cuatro juntos. El proceso debe repetirse hasta que se acaben los montones (que contienen el mismo nmero de papeles).

Ejemplo 2.

Ejemplo 2.

Ejemplo 3.
Sea una carretera por la que circulan coches en los dos sentidos. La carretera cruza un ro donde slo es posible la circulacin de coches en un sentido (ver figura). Sobre el puente pueden estar varios coches del mismo sentido. Se pide disear un protocolo que permita circular a los coches sobre el puente y realizar un programa siguiendo tal protocolo. En este programa cada coche estar representado por un proceso. Se debe conseguir que: a) No haya interbloqueos. Dos coches de diferentes sentidos no pueden bloquearse en medio del puente. b) El protocolo que permite el paso de los coches sobre el puente sea justo. No se puede favorecer a los coches de algn sentido a costa de perjudicar a los otros.

El protocolo ser el siguiente: 1. El puente ser una variable compartida por los procesos. Cada vehculo (proceso) deber indicar el sentido de circulacin (Norte>Sur Sur->Norte). As, programando el acceso al puente como RC se evitaran los interbloqueos si se controla el nmero de vehculos de cada sentido dentro del puente. 2. Cada 10 vehculos que pasen en un sentido (cada cierto tiempo) se invertir el sentido que tiene preferencia de paso por el puente. Habr que controlar, por tanto, el nmero de vehculos de cada sentido que pasan el puente. Este nmero debe incrementarse cada vez que un vehculo entra en el puente, pues en caso contrario el nmero de vehculos que cruzan el puente entre dos cambios consecutivos del sentido de preferencia de paso dependera de la longitud del puente. 3. Un vehculo que llega al puente en el sentido que no tiene preferencia, podr cruzarlo si dentro del puente no hay ningn vehculo en el sentido preferente (contrario) y si no hay ningn vehculo de dicho sentido esperando entrar al puente.

Ejemplo 3.

Ejemplo 3.

Ejemplo 3.

Problema: Productor-Consumidor (1)


program pcRCC; const TamaoBuffer = 5; type TipoBuffer = record Items: array[1..TamaoBuffer] of char; ProxEnt: integer; (*cdigo del productor ProxSal: integer; Cuantos: integer; end; begin var (*inicializar Buffer*) Buffer : shared TipoBuffer; cobegin Productor; Consumidor; coend; procedure PonerEnBuffer(ch: char); end; begin Buffer.Items[Buffer.ProxEnt] := ch; Buffer.ProxEnt := Buffer.ProxEnt mod TamaoBuffer; Buffer.Cuantos := Buffer.Cuantos +1; end; procedure SacarDeBuffer(var ch: char); begin ch := Buffer.Items[Buffer.ProxSal]; Buffer.ProxSal := Buffer.ProxSal mod TamaoBuffer; Buffer.Cuantos := Buffer.Cuantos -1; end;

y consumidor*)

24

Problema: Productor-Consumidor (2)


process Productor; var item : char; begin for item := a to z do region Buffer when Buffer.Cuantos < TamaoBuffer do PonerEnBuffer(item); end;

process Consumidor; var local : char; begin repeat region Buffer when Buffer.Cuantos <> 0 do SacarDeBuffer(local); write(local); until local = z; writeln end;
25

Problema: Lectores-Escritores (1)


Precedencia a Lectores
var v: shared record Lectores,Escritores : integer end; process Lector (ident: integer); begin region v do Lectores := Lectores +1; region v when Escritores = 0 do; Leer; region v do Lectores := Lectores 1; end; process Escritor (ident: integer); begin region v when Lectores = 0 do Escritores := Escritores +1; region v do begin Escribir; Escritores := Escritores 1; end; end;
26

Problema: Lectores-Escritores (2)


Precedencia a Escritores
var v: shared record Lectores,Escritores : integer end; process Lector (ident: integer); begin region v when Escritores = 0 do Lectores := Lectores +1; Leer; region v do Lectores := Lectores 1; end; process Escritor (ident: integer); begin region v do Escritores := Escritores +1; region v when Lectores = 0 do begin Escribir; Escritores := Escritores 1; end; end;
27

Problema: Filosofos de cena


var v: shared T; palillos: array [0..N-1] of boolean; process type filosofos(nom: integer); begin repeat sleep(random(5)); (*Pensando*) region v when palillos[nom] do palillos[nom] := false; region v when palillos[(nom mod N) + 1] do palillos[(nom mod N) + 1] := false; sleep(random(5)); (*Cenando*) region v do begin palillos[nom] := true; palillos[(nom mod N) + 1] := true; end; forever end;

28

Evaluacin de las RCC


Limitaciones

Pueden estar dispersas en el texto del programa La integridad de una estructura de datos compartida es facilmente daada Dificiles de implementar eficientemente

29

Vous aimerez peut-être aussi