O documento descreve a implementação de um problema clássico de sistemas operacionais chamado produtor-consumidor usando semáforos. O problema envolve processos produtores colocando itens em uma fila para processos consumidores consumirem. Semáforos controlam o acesso à fila para garantir que apenas um produtor ou consumidor acesse a fila de cada vez. O documento detalha as classes Java para produtores, consumidores e fila e explica como os semáforos coordenam os processos.
1. Sistemas Operacionais I – Faculdade de Informática de Pres. Prudente
Problemas Clássicos de Sistemas Operacionais: Produtor Consumidor com Semáforo
Gisele Fernanda Alves de Azevedo
Trabalho de Sistemas Operacionais I – Prof. Drº Robson Siscoutto
Aluna: Gisele Fernanda Alves de Azevedo
Problemas Clássicos de Sistemas Operacionais:
Produtor Consumidor com Semáforo
Descrição do problema:
Em Sistemas Operacionais, semáforo é conhecido como uma variável
protegida ou tipo abstrato de dados que tem por função o controle de
acesso de recursos compartilhados em um ambiente de multitarefas.
Semáforos são utilizados na resolução do problema Produtor e Consumidor,
que é um problema clássico em Sistemas Operacionais que busca
exemplificar de forma clara situações de impasses que ocorrem no
gerenciamento de processos de um Sistema Operacional e suas soluções.
Partindo do principio de que cada processo executado em um Sistema
Operacional tem a possibilidade de utilizar determinados recursos
oferecidos, e que quando um recurso X está sendo utilizado por um
processo A, nenhum outro processo poderá utilizar este mesmo recurso,
encontramos um problema no momento em que um processo B tenta
utilizar o recurso X que já está em uso. Com os Semáforos, é eliminado
problema da espera ociosa.
Através do conceito de dormir e acordar garante-se que um
processo nunca irá ficar consumindo processamento à toa, ou seja, se
quiser utilizar um recurso e não conseguir este processo irá dormir, e só
será acordado quando o recurso que ele deseja utilizar ficar disponível
novamente.
Implementação detalhada do algoritmo:
Programa principal:
No programa principal é feito apenas a instanciação do ProcuctQueue(),
Producer() e Consumer(). O objeto pq da classe ProductQueue será enviado
por parâmetro para os construtores de Producer() e Consumer().
2. Sistemas Operacionais I – Faculdade de Informática de Pres. Prudente
Problemas Clássicos de Sistemas Operacionais: Produtor Consumidor com Semáforo
Gisele Fernanda Alves de Azevedo
Classe Producer:
Classe Consumer:
As classes Producer() e Consumer() serão uma extensão da Classe
Thread(), em seu construtor será chamado o método start(), que executará
o método run(), dentro dele haverá um que vai de 0 até 4, este controlará
a chamada do métodos putProductIntoQ() e getProductFromQ() da classe
ProcuctQueue().
3. Sistemas Operacionais I – Faculdade de Informática de Pres. Prudente
Problemas Clássicos de Sistemas Operacionais: Produtor Consumidor com Semáforo
Gisele Fernanda Alves de Azevedo
Classe ProcuctQueue:
Nesta classe iremos declarar duas variáveis do tipo semáforo semProd que
já recebera de inicio o valor 1 e semCon que recebera valor 0, estas
variáveis serão usadas pelos métodos putProductIntoQ() e
getProductFromQ(). As variáveis semProd e senCon farão as chamados
métodos acquire() e release(), estas farão o controlar de quem ficará
bloqueado ou liberado.
Funcionamento do programa:
As classes Producer() e Consumer() funcionam como duas Threads,
em seus métodos run() há um for que vai de 0 a 4, este controla o
funcionamento dos métodos da classe ProcuctQueue(). Dentro da classe
ProcuctQueue() temos as variáveis semProd e semCon elas são do tipo
semáforo, ou seja, através dos métodos acquire() e release() controla quem
fica bloqueado e quem é executa.
4. Sistemas Operacionais I – Faculdade de Informática de Pres. Prudente
Problemas Clássicos de Sistemas Operacionais: Produtor Consumidor com Semáforo
Gisele Fernanda Alves de Azevedo
O primeiro a ser executado é o método PutProductIntoQ() pois o
valor da variável semProd que o controla já recebe inicialmente o valor 1 e
logo após é decrementado (por causa do método acquire()) (linha11 da
classe ProcuctQueue()), então o produtor produtos o valor que está no for e
dá permissão (acorda) a variável senCon (através do método release()) o
valor de i da classe Producer() é incrementado (porém ela fica bloqueada),
logo a variável senCon decrementa seu valor, consome o valor produzido,
acorda a variável senProd, incrementa o valor de i da classe Consumer e
fica bloqueada novamente. Isso se repete até que os for da classe
Producer() e Consumer() finalizem.
Perceba que o valor do semáforo controla os acessos através dos
métodos acquire() e release(), assim quando o produtor está produzindo o
consumidor está bloqueado e é acordado somente quando o produtor
termina.
Teste de mesa:
Passo 1:
Variável: Valor:
i (Producer()) 0
i (Consumer()) 0
semProd 0
semCon 0
Passo 2:
Variável: Valor:
i (Producer()) 1
i (Consumer()) 0
semProd 0
semCon 1
Passo 3:
Variável: Valor:
i (Producer()) 1
i (Consumer()) 1
semProd 1
semCon 0
5. Sistemas Operacionais I – Faculdade de Informática de Pres. Prudente
Problemas Clássicos de Sistemas Operacionais: Produtor Consumidor com Semáforo
Gisele Fernanda Alves de Azevedo
Passo 4:
Variável: Valor:
i (Producer()) 2
i (Consumer()) 1
semProd 0
semCon 1
Passo 5:
Variável: Valor:
i (Producer()) 2
i (Consumer()) 1
semProd 1
semCon 0
Passo 6:
Variável: Valor:
i (Producer()) 3
i (Consumer()) 2
semProd 0
semCon 1
Passo 7:
Variável: Valor:
i (Producer()) 3
i (Consumer()) 3
semProd 1
semCon 0
6. Sistemas Operacionais I – Faculdade de Informática de Pres. Prudente
Problemas Clássicos de Sistemas Operacionais: Produtor Consumidor com Semáforo
Gisele Fernanda Alves de Azevedo
Passo 8:
Variável: Valor:
i (Producer()) 4
i (Consumer()) 3
semProd 0
semCon 1
Passo 9:
Variável: Valor:
i (Producer()) 4
i (Consumer()) 3
semProd 1
semCon 0
Passo 10:
Variável: Valor:
i (Producer()) 4
i (Consumer()) 4
semProd 0
semCon 1
Saída do programa:
7. Sistemas Operacionais I – Faculdade de Informática de Pres. Prudente
Problemas Clássicos de Sistemas Operacionais: Produtor Consumidor com Semáforo
Gisele Fernanda Alves de Azevedo
Instruções de execução:
Programa feito em linguagem Java, o programa utilizado para
compilação foi o NetBeans IDE 7.4, não é necessário nenhuma entrada de
dados para execução.
Referências:
TANENBAUM, Andrew S. Sistemas Operacionais: projeto e
implementação. Andrew S. Tanenbaum e Albert S. Woodhull; trad. Edson
Furmankiewicz. - 2ª Ed. - Porto Alegre, Bookman, 2000.
http://www.dca.ufrn.br/~affonso/DCA2401/2004_1/programas.html
http://www.ebah.com.br/content/ABAAAgD0oAG/so-semaforos
http://sandeepin.wordpress.com/2012/01/21/producer-consumer-problem-solution-
using-semaphore/