Você está na página 1de 11

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-Jan
ta%20dos%20Filosofos.docx

http://3.bp.blogspot.com/_9cWeEbYXAEI/SgPd4_eaZSI/AAAAAA
AAARI/k7z1l2fG_G4/s1600-h/pic1.gif

http://ces33.blogspot.com.br/2009/05/o-problema-do-barbeiro-dorm
inhoco-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

Você também pode gostar