Sei sulla pagina 1di 4

El problema Productor/Consumidor

El problema Productor/Consumidor es uno de los ejemplos clsicos de acceso a recursos compara tidos que debe arbitrarse mediante algn mecanismo de concurrencia que implemente la exclusin u o mtua. u A continuacin se proporcionan versiones que implementan la exclusin mtua mediante la utio o u lizacin de: o Monitores Java: monitores restringidos a una unica variable de condicin impl o cita. Monitores Signal and Continue: modelo general de monitores con ms de una variable de condia cin. o El problema Productor/Consumidor consiste en el acceso concurrente por parte de procesos productores y procesos consumidores sobre un recurso comn que resulta ser un buer de elementos. Los u productores tratan de introducir elementos en el buer de uno en uno, y los consumidores tratan de extraer elementos de uno en uno. Para asegurar la consistencia de la informacin almacenada en el buer, el acceso de los produco tores y consumidores debe hacerse en exclusin mtua. Adicionalmente, el buer es de capacidad o u limitada, de modo que el acceso por parte de un productor para introducir un elemento en el buer lleno debe provocar la detencin del proceso productor. Lo mismo sucede para un consumidor que o intente extraer un elemento del buer vac o. Los cheros proporcionados para la versin nativa de Java estan en el directorio ProdConsJava o y los de la versin general de monitores en el directorio ProdConsMonitor. Los cheros son los o siguientes: ProducerConsumerTest.java chero principal Producer.java clase Producer Consumer.java clase Consumer Buer.java monitor Buer CircularQueue.java cola concreta CircularQueue Queue.java cola abstracta Queue En el caso de la versin general de monitores se necesitan adems los siguientes cheros para impleo a mentar variables de condicin: o Semaphore.java clase Semaphore (tal como lo deni E. W. Dijkstra) o Monitor.java monitor de bajo nivel o variable mtex u Condition.java clase Condition. Implementa variables de condicin. o La aplicacin como tal queda recogida en el chero ProducerConsumerTest.java. En l se impleo e menta el mtodo void main(String[] args) que ejecuta el conjunto de la aplicacin. La ejecucin e o o consiste en la creacin de dos objetos de las clases Producer y Consumer, para as operar con dos o productores y dos consumidores. Una vez creadas las instancias de cada clase, se invoca el mtodo e start() de cada productor y consumidor para iniciar la ejecucin en paralelo de cada uno de estos o Threads. La clase Producer implementa la lgica de un proceso productor. Dentro del mtodo run() o e produce un nuevo elemento de tipo Object y a continuacin lo introduce en el buer invocando al o mtodo Put(Object) de la clase Buer denido para ello. Entre elemento y elemento introducido e se hace dormir al proceso un tiempo aleatorio.

La clase Consumer implementa la lgica de un proceso consumidor. El cometido del proceso es o extraer un elemento del buer invocando al mtodo Object Get() de la clase Buer denido para e ello, a continuacin el proceso se hace dormir un tiempo aleatorio. o La clase Buer es un monitor de usuario. Arbitra el acceso concurrente por parte de productores y consumidores mediante la ejecucin en exclusin mtua de los mtodos correspondientes. Obsrvese o o u e e la diferencia entre el modelo nativo Java y el modelo general. En particular la clase Buer dene los siguientes mtodos: e public /*synchronized (slo Java nativo)*/ Object Get() o public /*synchronized (slo Java nativo)*/ void Put(Object value) o El constructor de la clase Buer mantiene en realidad una instancia de la clase abstracta Queue que toma como valor concreto una instancia de la clase concreta CircularQueue que se pasa como parmetro. a La clase CircularQueue implementa una cola circular de capacidad limitada, y se declara como extensin de la clase Queue, esto es as porque la clase Queue es una clase abstracta que o declara los mtodos con los que deber contar cualquier clase que pretenda implementar Buer. e a CircularQueue es en la prctica una implementacin de Queue aunque ser posibles otras ima o an plementaciones. Los mtodos denidos en la clase CircularQueue son: e public int Rank() tamao ocupado de la cola n public int Free() espacio libre en la cola public boolean IsFull() indicacin de cola llena o public void Put(Object value) mtodo de introduccin de un elemento en la cola e o public Object Get() mtodo de extraccin de un elemento de la cola e o En esta ocasin los mtodos no son declarados sincronizados porque la lgica de resolucin de la o e o o exclusin mtua queda reservada para la clase Buer. La clase CircularQueue se encarga excluo u sivamente de la lgica de almacenamiento y recuperacin de elementos de la estructura de datos o o denida para ello. 1. Probar el ejemplo 2. Supngase que la implementacin es tal que los Threads bloqueados en una variable de condio o cin readquieren el monitor por orden de bloqueo (la cola de Threads de la variable de condicin o o es FIFO). Es posible obtener una traza como la siguiente?: Consumer Consumer Producer Producer Producer Producer Consumer Consumer #0: #1: #0: #0: #0: #0: #1: #0: [ get [ get [ put ] [ put ] 56 ] 55 ] ... ... 55 ... 56 ...

Si es asi, cmo corregiria el cdigo proporcionado para que las trazas salieran en orden? o o

El problema Productor/Consumidor con broadcast


En el problema Productor/Consumidor con broadcast todos los consumidores obtienen todos los elementos en el orden en que son producidos por los productores. Todos los consumidores obtienen los elementos en el mismo orden. Dicho de otro modo, cada vez que un productor produce un elemento lo envia (hace un broadcast) a cada uno de los consumidores. En esta variante el mtodo Get queda declarado como Object Get(int id) donde id identica e al consumidor correspondiente. Solucinar el problema segn el criterio: u 1. Sin usar monitores Buer del problema Productor/Consumidor clsico. Programe un monitor a que encapsule NC arrays de elementos, tantos como consumidores. Supngase 1 productor y o NC consumidores (fcil). Supnganse ahora NP productores (intermedio). a o 2. Sin usar monitores Buer del Problema Productor/Consumidor clsico. Reprograme el apartaa do anterior con un monitor que encapsule un unico array de elementos (dif cil). 3. Usando solo monitores Buer del problema Productor/Consumidor clsico. Este monitor no se a puede modicar. Supngase 1 productor y NC consumidores (fcil). o a 4. Supnganse ahora NP productores. Si la solucin del apartado anterior tiene algn problema o o u Cmo la modicaria? (intermedio). o

El problema Productor/Consumidor con secuencias atmicas o de operaciones Put/Get


En el problema Productor/Consumidor con secuencias atmicas de operaciones Put/Get los o productores realizan secuencias de operaciones Put no entrelazables con otras operaciones Put de otros productores y los consumidores realizan secuencias de operaciones Get no entrelazables con otras operaciones Get de otros consumidores. Suponiendo 2 productores y 2 consumidores una ejecucin correcta es: o a1 a2 a3 --->| |---> b1 b2 a1 +->-| b1 b2 --->| |---> a2 a3 y una incorrecta es: a1 a2 a3 --->| |---> a1 b1 b2 +->-| b1 b2 --->| |---> a2 a3 Ahora los mtodos quedan declarados como: e void Put(Object[] elems): pone de forma no entrelazada en el buer los elementos del array elems. Object[] Get(int n): obtiene n elementos del buer. Programar una solucin al problema: o 1. usando invocaciones a los mtodos Put/Get del problema Productor/Consumidor clsico. e a 2. como mtodos nuevos sin usar invocaciones a los mtodos Put/Get del problema Produce e tor/Consumidor clsico. a

Generacin de n meros primos o u


Una manera de obtener nmeros primos en paralelo consiste en disponer de mltiples procesos u u trabajadores que interaccionan con un gestor central de la forma que se describe a continuacin. o El gestor genera candidatos a nmero primo para los procesos trabajadores que lo soliciten y u almacena adecuadamente los resultados de estos trabajadores. Cada proceso trabajador realiza de forma c clica los siguientes pasos: Obtencin de un candidato, o comprobacin de si es primo y noticacin del resultado. o o Cada trabajador solicita un nmero candidato a ser primo al gestor. Con cada invocacin el gestor u o devuelve un nuevo candidato (nmeros impares a partir de 3) en orden creciente a los trabajadores. u El gestor devuelve el valor 0 cuando ya se han obtenido los N primos deseados. Para determinar si un candidato es primo, el trabajador deber comprobar si es divisible por los a nmeros primos ms pequeos (hasta la ra cuadrada del candidato es suciente). Para ello, cada u a n z trabajador guarda una tabla de los nmeros primos ordenados de menor a mayor y aade un nuevo u n nmero a esta tabla cuando lo necesita para comprobar un candidato. El nmero primo que necesita u u aadir lo consigue del gestor, pasndole el n a ndice de la tabla del primo que le falta. Es suciente con pasar el ndice de la tabla de primos porque la relacin de primos es la misma en las tablas que o disponen gestor y trabajadores. Un trabajador puede ser detenido en una peticin de nmero primo (debido a que el gestor an o u u no tiene el primo en la posicin solicitada). El sistema no se bloquear porque todos los primos ms o a a pequeos sern generados tarde o temprano por otros trabajadores. n a Una vez determinado si el candidato es primo o no, el trabajador lo indica al gestor. El gestor deber atender a los resultados de los candidatos en orden creciente con el objetivo de introducirlos en la a tabla (si son primos) de forma ordenada. Esto signica que si el resultado no es el esperado deber dea tenerse al trabajador. Cuando el gestor obtenga el resultado esperado entonces deber avanzarse al a siguiente resultado esperado. Adems si el resultado del candidato es primo, el gestor lo introduce a en la tabla e incrementa el correspondiente contador. Se proporciona el chero Primers.java (principal) y los cheros incompletos Treballador.java (proceso trabajador) y Gestor.java (monitor de usuario que gestiona la obtencin de los nmeros o u primos). Realizar los siguientes apartados: 1. Completar la solucin y probarla. o 2. Supngase que no nos amos de los trabajadores a la hora de calcular si un candidato es primo o o no. Dar un mismo candidato a 3 trabajadores y decidir si es primo o no por mayoria. 3. Supongase que pueden haber trabajadores que no completen, es decir que pidan un nuevo candidato pero no lleguen a informar al gestor sobre si es primo o no. Programar una solucin o basada en el wait con timeout que temporice transcurrido un intervalo y evite el bloqueo indenido por espera del resultado de un candidato.

Potrebbero piacerti anche