Sei sulla pagina 1di 3

UNIVERSIDAD NACIONAL JORGE BASADRE GROHMANN | FACULTAD DE INGENIERÍA

ESCUELA PROFESIONAL DE INGENIERÍA EN INFORMÁTICA Y SISTEMAS


CURSO: ALGORITMOS Y PROGRAMACIÓN PARALELA
CICLO DE ESTUDIOS: CUARTO | SEMESTRE ACADÉMICO: 2018 - II

PRÁCTICA : “EL PROBLEMA DEL PRODUCTOR CONSUMIDOR”


I. CONTENIDO

En esta guía de laboratorio se expondrá las primitivas de sincronización conocidas como monitores.

II. OBJETIVOS ESPECÍFICOS

 Conocer el funcionamiento de los monitores.


 Analizar las diferentes aplicaciones que tienen los monitores en la programación concurrente.

III. MATERIAL Y EQUIPO

 Práctica : El problema del productor consumidor.


 Apuntes de las sesiones teóricas (Capítulo 5).
 Libro “Programación concurrente” de Tomás Palma.
 Un computador con Eclipse Gavab (Pascal FC incluido) instalado.

IV. FUNDAMENTO TEÓRICO

El problema del productor-consumidor es un ejemplo clásico de problema de sincronización de multi-


procesos. El programa describe dos procesos, productor y consumidor, ambos comparten un buffer de
tamaño finito. La tarea del productor es generar un producto, almacenarlo y comenzar nuevamente;
mientras que el consumidor toma (simultáneamente) productos uno a uno. El problema consiste en que el
productor no añada más productos que la capacidad del buffer y que el consumidor no intente tomar un
producto si el buffer está vacío.

Queremos garantizar que el consumidor no coja los datos más rápido que les está produciendo el
productor. Más concreto: (Formella, 2001)

 El productor puede generar sus datos en cualquier momento.


 El consumidor puede coger un dato solamente cuando hay alguno.
 Para el intercambio de datos se usa una cola a la cual ambos tienen acceso, así se garantiza
el orden correcto.

Como la exclusión mutua está implícita en los monitores no es necesario un esfuerzo extra para proteger la
región crítica. En otras palabras, esta variante funciona con cualquier cantidad de productores y
consumidores sin otra modificación. Es relevante el hecho de que el uso de monitores hace muchos menos
probable la aparición de conflictos que cuando se usan semáforos.

La solución del problema del productor consumidor por medio de monitores es mucho más sencilla que en
el caso de semáforos y regiones críticas. Además, todo el código correspondiente al buffer compartido
queda localizado dentro del monitor, por lo que podemos cambiar su implementación sin al código de
sincronización del productor y consumidor. (Palma Méndez, 2006)

V. PROCEDIMIENTO

EJEMPLO 1:

Programe el problema del productor/consumidor en base al trozo de código fuente que está a continuación
(extraído de los apuntes de las sesiones teóricas).

monitor buffer;
export inserta, extrae;
const N=10;
var ne: integer {número de elementos de la cola en un momento dado}
frente, final: integer;
clleno, cvacio: condition;
cola: array[0..N-1] of integer;

Página 1 de 3
UNIVERSIDAD NACIONAL JORGE BASADRE GROHMANN | FACULTAD DE INGENIERÍA
ESCUELA PROFESIONAL DE INGENIERÍA EN INFORMÁTICA Y SISTEMAS
CURSO: ALGORITMOS Y PROGRAMACIÓN PARALELA
CICLO DE ESTUDIOS: CUARTO | SEMESTRE ACADÉMICO: 2018 - II

procedure inserta(x: integer);


begin
if ne=N then
delay(clleno);
cola[final]:=x;
final:=(final+1)mod N;
ne:=ne+1;
resume(cvacio);
end;

function extrae:integer;
begin
if ne=0 then
delay(cvacio);
extrae:=cola[frente];
frente:=(frente+1)mod N;
ne:=ne-1;
resume(clleno);
end;
begin
frente:=0;
final:=0;
ne:=0;
end;

buffer.inserta(elemento);
elemento:=buffer.extrae;

EJEMPLO 2:

Transcriba el siguiente código fuente y haga la interpretación de cómo funciona cada procedimiento y como
resuelve el problema del productor/consumidor

program ProdCons2;

monitor canal;

export escribe, lee;


var n : integer ;
leido : boolean ;
cdatos, cleido : condition ;

procedure lee (var m: integer) ;


begin
if leido then
delay(cdatos) ;
m := n ;
leido := true ;
resume(cleido) ;
end;

procedure escribe (m: integer);


begin
if not leido then
delay(cleido) ;
n := m;
leido := false ;
resume(cdatos)
end;

Página 2 de 3
UNIVERSIDAD NACIONAL JORGE BASADRE GROHMANN | FACULTAD DE INGENIERÍA
ESCUELA PROFESIONAL DE INGENIERÍA EN INFORMÁTICA Y SISTEMAS
CURSO: ALGORITMOS Y PROGRAMACIÓN PARALELA
CICLO DE ESTUDIOS: CUARTO | SEMESTRE ACADÉMICO: 2018 - II

begin
leido := true ;
end;

process productor;
var m: integer;
begin
repeat
m:=random(20) ;
canal.escribe(m) ;
forever
end ;

process consumidor;
var m: integer;
begin
repeat
canal.lee(m);
writeln(m);
forever
end;

begin
cobegin
productor; consumidor;
coend ;
end.

VI. ACTIVIDAD PROPUESTA

Resuelva los siguientes ejercicios usando el mecanismo de monitores:

Una serie de procedimientos llaman a un procedimiento BLOQUEAR(n) de un monitor, donde n es un


número entero entre 1 y 10. Todos los procesos que llaman a este procedimiento son bloqueados hasta
que otro proceso llama al procedimiento LIBERAR del mismo monitor. Los procesos bloqueados hasta el
momento deben ser liberados en el orden establecido por el parámetro n. Cuando todos estos procesos
han sido liberados el proceso liberador podrá continuar.

VII. BIBLIOGRAFÍA

Ari B. (1982). Principles of Concurrent Programming. First edition. USA: Prentice-Hall International.
Galli, R. (2015). Principios y algoritmos de concurrencia. España: Create Space.
Morera Pascual, J. M. (2002). Conceptos de sistemas operativos. España: Amábar.
Palma J., Garrido M., Sánchez F. & Quesada A. (2006). Programación Concurrente. Primera edición.
España: Paraninfo
Tanenbaum A. (2003). Sistemas Operativos Modernos. Segunda Edición. México: Prentice Hall

Página 3 de 3

Potrebbero piacerti anche