Buscar

Jantar dos Filosofos

Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original

Sistemas Operacionais
O Jantar dos Filósofos
Problemática
	O problema do jantar dos filósofos é uma problema clássico no campo da programação concorrente. Ele serve para comparar vários formalismos e provê programas concorrentes. É um problema suficientemente simples para ser tratado, ainda que bastante desafiante. Em geral, o problema do jantar dos filósofos é um problema genérico e abstrato que é utilizado para explicar diversas situações indesejáveis que podem ocorrer em problemas que tem como principal ideia a exclusão mútua.
Contexto
	O problema é estabelecido em uma comunidade isolada de 5 filósofos. Os filósofos engajam-se somente em duas atividades: pensar e comer. As refeições são feitas comunitariamente em uma mesa – uma travessa de spaghetti - é colocado no centro de uma mesa com 5 pratos e 5 garfos, que é interminavelmente reabastecido. Infelizmente, o spaghetti é irremediavelmente emaranhado e um filósofo necessita de 2 garfos para comer. Cada filósofo pode pegar os garfos ao seu lado esquerdo e direito, mas somente 1 garfo em um tempo. 
O que Implementar?
Um filósofo come somente se ele tem 2 garfos.
Nenhum de dois filósofos pode reter o mesmo garfo simultaneamente.
Não pode existir deadlock.
Nenhum filósofo entra em starvation.
Comportamento do programa concorrente é eficiente sob ausência de contenção (dois processos ou duas thread concorrem pelo mesmo recurso).
Implementação
# -*- coding: utf-8 -*-
# -*- coding: ISO-8859-1 -*-
import thread
import time, random
import threading
 
# Criando lista de semáforos. Cada Semáforo é representado por um 'garfo'
garfo = list()
# Preenchendo a lista
for i in range(5):
 garfo.append(threading.Semaphore(1))
def filosofo(f):
 # Cada filósofo 'f' representa uma posição na lista de semáforos
 f = int(f)
 while True:
 # O filósofo atual pega o garfo da esquerda. Se o garfo já estiver sendo utilizado o filósofo esperará até que fique livre
 garfo[f].acquire()
# O filósofo atual pega o garfo da direita. Se o garfo já estiver sendo utilizado o filósofo esperará até que fique livre
 garfo[(f + 1) % 5].acquire()
 print "Filósofo %i comendo..." %f
 time.sleep(random.randint(1, 5))
 garfo[f].release()
 garfo[(f + 1) % 5].release()
 print "Filósofo %i pensando..." %f
 time.sleep(random.randint(1, 10))
 
for i in range(5):
 print "Filósofo", i
 thread.start_new_thread(filosofo, tuple([i]))
while 1: pass
Referências
http://www.inf.ufsc.br/~bosco/ensino/ine5645/Laboratorio%202-Janta%20dos%20Filosofos.docx
http://3.bp.blogspot.com/_9cWeEbYXAEI/SgPd4_eaZSI/AAAAAAAAARI/k7z1l2fG_G4/s1600-h/pic1.gif
http://ces33.blogspot.com.br/2009/05/o-problema-do-barbeiro-dorminhoco-com.html
http://wiki.python.org.br/SemaforosDeadlockhttp://wiki.python.org.br/SemaforosDeadlock
Equipe:
Antônio Matheus Cavalcante da Silva
Calebe Tavares Arruda Alves Pinheiro
Esdras Emanuel Mariano Moreira
Jefferson Costa Severo
José Valdemir Vitor Lima

Teste o Premium para desbloquear

Aproveite todos os benefícios por 3 dias sem pagar! 😉
Já tem cadastro?

Outros materiais