Vous êtes sur la page 1sur 15

Problema produtor-consumidor semforos

Ferramenta de sincronismo fcil de

usar
Semforo S varivel inteira Duas operaes padro modificam S: acquire() e release() Originalmente chamadas P() e

V()

Semforos
Podem ser acessados apenas atravs

de duas operaes indivisveis (atmicas)


acquire(S) { while S <= 0 ; // nenhuma operao S--; } release(S) { S++; }

Semforo como Ferramenta de Sincronizao geral


Semforo binrio o valor inteiro

s pode variar entre 0 e 1


Tambm conhecido como mutex So bloqueios (locks) que oferecem

excluso mtua (mutual exclusion)

Semforo como Ferramenta de Sincronizao geral


Oferece excluso mtua Semaphore S; // inicializado para 1 acquire(S); criticalSection(); release(S);

Semforo contador
Semforo contador o valor inteiro

pode variar por um domnio irrestrito (0 n) So usados para controlar o acesso a determinado recurso que consiste em um nmero finito de instncias Inicializado para o nmero de recursos disponveis Quando o semforo chega a zero, todos os recursos esto sendo usados

O Problema do Buffer Limitado


public class BoundedBuffer implements Buffer { private static final int BUFFER SIZE = 5; private Object[] buffer; private int in, out; private Semaphore mutex; private Semaphore empty; private Semaphore full; // Continua no prximo slide

Construtor BoundedBuffer
public BoundedBuffer() { // o buffer inicialmente est vazio in = 0; out = 0; buffer = new Object[BUFFER SIZE]; mutex = new Semaphore(1); empty = new Semaphore(BUFFER SIZE); full = new Semaphore(0); } public void insert(Object item) { /* prximos slides */ } public Object remove() { /* prximos slides */ } }

O Problema do Buffer Limitado: Mtodo insert()


public void insert(Object item) { empty.acquire(); mutex.acquire(); // acrescenta um item ao buffer buffer[in] = item; in = (in + 1) % BUFFER SIZE; mutex.release(); full.release(); }

O Problema do Buffer Limitado: Mtodo remove()


public Object remove() { full.acquire(); mutex.acquire(); // remove um item do buffer Object item = buffer[out]; out = (out + 1) % BUFFER SIZE; mutex.release(); empty.release(); return item; }

O Problema do Buffer Limitado: Classe Producer


import java.util.Date; public class Producer implements Runnable { private Buffer buffer; public Producer(Buffer buffer) { this.buffer = buffer; } public void run() { Date message; while (true) { // dorme por um tempo SleepUtilities.nap(); // produz um item e o insere no buffer message = new Date(); buffer.insert(message); } } }

O Problema do Buffer Limitado: Classe Consumer


import java.util.Date; public class Consumer implements Runnable { private Buffer buffer; public Consumer(Buffer buffer) { this.buffer = buffer; } public void run() { Date message; while (true) { // dorme por um tempo SleepUtilities.nap(); // consome um item do buffer message = (Date)buffer.remove(); } } }

O Problema do Buffer Limitado: Factory


public class Factory { public static void main(String args[]) { Buffer buffer = new BoundedBuffer(); // agora cria as threads produtor e consumidor Thread producer = new Thread(new Producer(buffer)); Thread consumer = new Thread(new Consumer(buffer)); producer.start(); consumer.start(); } }

Implementaes do Lab05
1. Crie uma classe Semaphore

que se possa tanto implementar um semforo binrio quanto um semforo contador.

Implementaes do Lab05
1. Soluo com excluso mtua

(seo crtica) Implemente a soluo do produtor-consumidor atravs de memria compartilhada e buffer limitado. Use um semforo binrio Use a classe Semaphore e Threads em Java.

Implementaes do Lab05
1. Soluo com sincronismo entre o

produtor e consumidor Implemente a soluo do produtor-consumidor atravs de memria compartilhada e buffer limitado. Use dois semforos contadores Use a classe Semaphore e Threads em Java.

Vous aimerez peut-être aussi