Prévia do material em texto
Estudo de Caso #01 Sistemas Operacionais – O Problema do Jantar dos Filósofos No estudo de hoje somos apresentados a um problema de Sincronização trazido por Dijkstra em 1995 chamado “O Problema do Jantar dos Filósofos”, onde é nos apresentado o seguinte problema: Cinco filósofos estão assentados a uma mesa circular representada na figura 2.45, cada um dos filósofos alterna entre duas atividades, pensar ou comer. Nesta mesa há cinco pratos com espaguete e ao lado de cada prato um garfo, porém para que o filósofo possa comer é necessário que ele utilize dois garfos, porém ele só pode pegar um garfo de cada vez, caso consiga, ele pode comer por um tempo determinado e voltar a pensar. A questão aqui é: Como Criar uma regra para que cada filósofo execute sua atividade sem que jamais fique travado? A solução mais “óbvia” seria cada um esperar um tempo fixo para que o outro garfo estivesse disponível, porém teríamos um problema onde se todos pegassem um garfo geraria uma espera infinita por outro garfo, causando assim um travamento, onde podemos chamar de deadlock ou impasse. Mas e se o filósofo devolvesse o garfo a mesa ao não identificar o próximo garfo? Ainda assim teríamos um problema, pois agora em vez de um, tempo de espera, geraríamos um loop infinito, causando assim o travamento, nesse caso chamamos de starvation ou o morrer de fome. Outra possível solução seria em vez de criarmos um tempo fixo, deixarmos aleatório, a ideia pode funcionar bem, porém não é algo 100% eficaz, pois assim como em uma rede de área local Ethernet, pode acontecer de dois pacotes de diferentes maquinas serem enviados ao mesmo tempo, e em algum momento acabarem colidindo. Então como resolver? A resposta é simples, basta criarmos um semáforo binário, onde ele será responsável por controlar se um filósofo está comendo, pensando, ou com fome, gerando assim uma notificação ao vizinho e uma ordem nos tempos de cada um, pois o filosofo só poderá trocar de função quando seus vizinhos não estiverem comendo. A teoria apresentada é muito eficaz, pois nos ajuda a entender como organizar e sincronizar o código, evitando assim o travento da função.