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().
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().
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.
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
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
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:
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/

Produtor Consumidor com Semaforo

  • 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/