Você está na página 1de 19

Sistemas Operacionais Cincia da Computao

Gerncia de Processos
Comunicao Interprocessos
Problemas Clssicos

Material produzido por Prof. Humberto


Brando
humberto@bcc.unifal-mg.edu.br

Prof. Douglas Castilho


douglas@bcc.unifal-mg.edu.br

Universidade Federal de Alfenas


verso da aula: 0.4
Problemas Clssicos

A rea de sistemas operacionais apresenta diversos


problemas interessantes de sincronizao;

Existem alguns problemas clssicos de sincronizao;

Diversos problemas prticos so variaes destes clssicos;

Suas solues podem ser utilizadas ou estendidas.


Problemas Clssicos na CIP

1: Jantar dos Filsofos


Jantar dos Filsofos

Dijkstra, em 1965, formulou e resolveu (utilizando o seu


mtodo - semforos) um dos clssicos problemas de CIP:

O Jantar dos Filsofos;

Este problema se tornou to famoso, que, se voc inventar


uma nova tcnica para CIP, est automaticamente
obrigado a demonstrar o quo elegante e eficiente sua
tcnica resolve o problema do Jantar dos Filsofos.

Serve basicamente para comparao com as outras


primitivas j inventadas at o momento; (benchmark)
Jantar dos Filsofos

O problema pode ser exposto de uma forma simples:

Cinco filsofos sentam em uma mesa circular;


Cada um com um processamento independente;

Cada um possui um prato de espaguete;

O espaguete est escorregadio e cada filsofo precisa de


dois garfos para comer
Recursos necessrios para comer;

Entre cada par de pratos, existe um garfo;


Recursos limitados, dado a quantidade de filsofos;
Jantar dos Filsofos - Formulao

Dinmica do problema:

A vida do filsofo se resume a:


Comer;
Pensar;

Nunca comem e pensam ao mesmo


tempo...

Cada linha independente, pensa e


depois come...
Jantar dos Filsofos Geral do algoritmo base

Quando um filsofo fica com fome, ele


tenta pegar os garfos da direita e da
esquerda;
no necessariamente nesta ordem;

O importante pegar um de cada vez;

Se conseguir os dois garfos, ele ir


comer;

Posteriormente coloca os garfos na


mesa;

E volta a pensar;
Jantar dos Filsofos - Formulao

A questo fundamental :

Voc capaz de desenvolver um algoritmo para o Jantar dos


Filsofos que faa o que deve fazer e nunca trave?
Jantar dos Filsofos

Soluo bvia
Jantar dos Filsofos
Algoritmo apresentado a soluo bvia;
take_fork pega o garfo....
Esta funo bloqueia a thread caso o garfo esteja sendo utilizado...
put_fork devolve o garfo...
Esta funo acorda threads que se bloquearam pela
indisponibilidade de garfo...
Jantar dos Filsofos

Onde esto os semforos?


Jantar dos Filsofos

Onde est o erro do algoritmo?


Algoritmo trivial... Mas contem erro

Um situao de erro ocorre de forma simples...


Imagine que todos os filsofos resolvam comer...
Todos capturam o garfo do lado esquerdo...
Quando tentarem pegar o garfo do lado direito, nenhum
encontrar disponibilidade, ento todos os threads sero
bloqueados!!! (DEADLOCK)
Outro algoritmo trivial...

O algoritmo anterior pode ser adaptado...


Se (filsofo estiver com o garfo esquerdo na mo E garfo direito
estiver ocupado) ento
o filsofo devolve o garfo esquerdo e reinicia seu procedimento, ao
invs de dormir...

O algoritmo est correto agora?


Outro algoritmo trivial...
Exemplo de execuo...

Todos os filsofos podem em sincronismo pegar


os garfos com a mo esquerda...
Cada um verifica se pode pegar o da direita (e
nenhum vai poder)...
Todos devolvem seus garfos da mo esquerda.
Reiniciando o processo...
Outro algoritmo trivial... Mas errado...

Esta situao na qual todos os programas continuam


executando indefinidamente, mas falham ao tentar
progredir, conhecida como starvation;

Deadlock != Starvation
Jantar dos Filsofos

Algoritmo do Jantar dos Filsofos (modelado por


Dijkstra (1965))
Algoritmo do Jantar dos Filsofos
(modelado por Dijkstra (1965))
Algoritmo do JF (modelado por Dijkstra (1965))