Baixe o app para aproveitar ainda mais
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
Compartilhar