Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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