Problemas Clássicos de Sincronização - FECENS
-
Upload
herval-junior -
Category
Documents
-
view
105 -
download
0
Transcript of Problemas Clássicos de Sincronização - FECENS
5/14/2018 Problemas Cl ssicos de Sincroniza o - FECENS - slidepdf.com
http://slidepdf.com/reader/full/problemas-classicos-de-sincronizacao-fecens 1/5
FACENS - Faculdade de Engenharia de Sorocaba
Problemas Classicos de Sincronizacao
Filosofos Jantando
O problema dos filosofos jantando foi introduzido e solu-cionado por Dijkstra em 1965. Neste problema, 5 filosofos estaosentados ao redor de uma mesa redonda e cada fil osofo temum prato de espaguete. Entre cada prato ha um garfo e o es-paguete esta tao escorregadio que o filosofo precisa de 2 garfospara come-lo.
A vida do filosofo consiste em p erıodos alternados de comere de pensar. Quando o filosofo fica com fome, ele tenta pegar ogarfo da direita e o da esquerda, um de cada vez, em qualquerordem.
Boas solucoes
• ausencia de deadlock
• ausencia de starvation
• alto grau de paralelismo – 5 filosofos com
fome, 2 podem comer
Uma boa solucao para o problema dos filosofos jantando e naopermitir que o corra deadlock , ou seja, quando todos os filosofosparam esperando que alguem lib ere o garfo. Outra situacao quedevemos evitar e starvation onde todos os filosofos tentam con-tinuar a executar a tentativa de pegar os garfos, mas n ao hanenhum progresso, ou seja, todos passam fome. Alem disso,se temos 5 filosofos com fome e temos 5 garfos seria interes-sante deixar 2 filosofos comer obtendo assim um alto grau deparalelismo.
Solucao Obvia
Filosofo i:
while (true)
pensa();
wait(garfo[i]);
wait(garfo[(i+1) % N]);
come();
signal(garfo[i]);
signal(garfo[(i+1) % N]);
O procedimento wait(garfo(i)) espera ate que o garfo es-pecificado esteja disponıvel e entao, pega-o. O garfo i e o garfoda esquerda e o garfo i+1 e o garfo da direita. Esta solucao naoesta correta p ois se os 5 filosofos pegarem seus garfos esquerdossimultaneamente, nenhum sera capaz de pegar o garfo direito ehavera um deadlock .
O programa obvio poderia ser modificado da seguinte maneira.O filosofo, apos pegar o garfo esquerdo verifica se o garfo direitoesta disponıvel. Se nao estiver disponıvel, ele devolve o garfoesquerdo e espera por um tempo e entao repete o procedimento.Esta solucao nao funciona se os filosofos tentam pegar os garfosesquerdos simultaneamente. Entao todos vao devolver os garfose esperar por um tempo. Se o tempo de espera e igual paratodos, entao todos vao tentar pegar o garfo simultaneamente eassim por diante, para sempre.
Solucao com lock
Filosofo i:
while (true)
pensa();
wait(lock);
wait(garfo[i]);
wait(garfo[(i+1) % N]);
come();
signal(garfo[(i+1) % N]);signal(garfo[i]);
signal(lock);
Um aprimoramento que nao resulta em deadlock nem emfome e proteger os procedimentos com um semaforo binario(lock). Antes de comecar a pegar um dos garfos, o fil osofofaria um wait no semaforo e apos comer e devolver os garfos,faria um signal no semaforo. Neste caso, apenas um filosofopor vez pode estar comendo.
Profa. Tiemi Christine Sakata 1
5/14/2018 Problemas Cl ssicos de Sincroniza o - FECENS - slidepdf.com
http://slidepdf.com/reader/full/problemas-classicos-de-sincronizacao-fecens 2/5
FACENS - Faculdade de Engenharia de Sorocaba
Solucao Assimetrica
while (true)
pensa();
if (i % 2 == 0)
wait(garfo[i]);
wait(garfo[(i+1) % N]);else
wait(garfo[(i+1) % N]);
wait(garfo[i]);
come();
signal(garfo[(i+1) % N]);
signal(garfo[i]);
Suponha que todos os filosofos estao com fome.
Cenario com paralelismo:
• F 0 est a comendo
• F 2 pega garfos 2 e 3.
• F 1 nao pega garfo nenhum.
Cenario em que nao ha paralelismo:
• F 0 est a comendo
• F 1 pega o garfo 2
• F 4 pega o garfo 4
• F 2 nao consegue pegar o garfo 2
• F 3 nao consegue pegar o garfo 4
Solucao do livro Tanenbaum
semaforo lock;
semaforo filosofo[N] = {0, 0, 0, ..., 0}
int estado[N] = {T, T, T, ...,T}
while (true)
pensa();
pega_garfos();
come();
solta_garfos();
pega_garfos()
wait(lock);
estado[i] = H;
testa_garfos(i);
signal(lock);
wait(filosofo[i]);
testa_garfos(int i)
if (estado[i] == H && estado[fil_esq] != E &&
estado[fil_dir] != E)
estado[i] = E;
signal(filosofo[i]);
solta_garfos()
wait(lock);
estado[i] = T;
testa_garfos(fil_esq);
testa_garfos(fil_dir);
signal(lock);
Nesta solucao, temos que cada filosofo pode estar no estado T(thinking), E (eating) ou H (hungry). Um filosofo so pode passar
para o estado E se nenhum vizinho estiver comendo. Os vizinhosdo filosofo i sao definidos pelas macros fil esq e fil dir.
Profa. Tiemi Christine Sakata 2
5/14/2018 Problemas Cl ssicos de Sincroniza o - FECENS - slidepdf.com
http://slidepdf.com/reader/full/problemas-classicos-de-sincronizacao-fecens 3/5
FACENS - Faculdade de Engenharia de Sorocaba
Leitores e Escritores
• Dois tipos de processos: leitores e escritores
• Leitores: apenas leem as informacoes
• Escritores: alteram os dados
• Exemplo: reserva de passagem aerea
Um exemplo do conceito de leitores e escritores e um sistemade reserva de passagens aereas. Os leitores sao aqueles que pre-cisam de informacao de voo. Note que o sistema pode permitirque varios leitores estejam ativos em um determinado tempo p oisa base de dados nao e alterada por ninguem. Os escritores saoaqueles que desejam reservar um lugar em um determinado voo.O sistema nao deve permitir que alguem escreva ou leia enquantoum um escritor esta ativo. Portanto, e preciso implementar umapolıtica de exclusao mutua sempre que houver um grupo de es-critores e leitores.
Solucao de Courtois
leitor:
while(true)
wait(lock);
numl = numl + 1;if (numl == 1) wait(db);
signal(lock);
le_db();
wait(lock);
numl = numl - 1;
if (numl == 0) signal(db);
signal(lock);
Solucao de Courtois
escritor:
while(true)
wait(db);
escreve_db();
signal(db);
Nesta solucao, o primeiro leitor que receb e acesso ao bancode dados faz um wait(db) impedindo de um escritor escrever.Os leitores subsequentes incrementam um contador numl e aoterminar a leitura, esse contador e decrementado. Quando todosos leitores terminam sua execucao, o semaforo db e l iberado aoescritor.
Nesta solucao, se enquanto um leitor esta usando o banco de
dados, aparece um outro leitor, o segundo leitor e admitido. Seum escritor aparece, mas se existe leitores ativos constantemente,o escritor nunca sera desbloqueado.
Outra solucao requer que o escritor, assim que estiver pronto,faca sua escrita o mais r apido p ossıvel, ou seja, se um escritorestiver esperando para acessar a RC, nenhum outro leitor poderainiciar a leitura. Neste caso, os leitores podem sofrer paralisacao.
Houre (1974) propos uma outra solucao para este problema.Assim que um escritor termina, todos os leitores em espera re-cebem permissao para execucao. Em seguida, assim que o grupode leitores termina, o escritor que estava esperando pode comecare assim sucessivamente.
Profa. Tiemi Christine Sakata 3
5/14/2018 Problemas Cl ssicos de Sincroniza o - FECENS - slidepdf.com
http://slidepdf.com/reader/full/problemas-classicos-de-sincronizacao-fecens 4/5
FACENS - Faculdade de Engenharia de Sorocaba
Barbeiro Adormecido
O problema do barbeiro adormecido acontece em uma bar-bearia. A barbearia tem um barbeiro, uma cadeira de barbeiro en cadeiras para os clientes esperarem. Quando um cliente chega,ele tem que acordar o barbeiro. Se um cliente chega e o barbeiroesta trabalhando, ele senta se houver cadeira vazia ou vai emborase todas as cadeiras estiverem ocupadas.
Solucao 1
semaforo lock = 1, barbeiro = 0, clientes = 0;
int cesperando = 0;
Barbeiro:
while (true)
wait(clientes);
wait(lock);
cesperando = cesperando + 1;
signal(barbeiro);
signal (lock);
corta_cabelo();
Solucao 1
Cliente:
wait(lock);
if (cesperando < CADEIRAS)
cesperando = cesperando + 1;
signal(clientes);
signal(lock);
wait(barbeiro);
cabelo_cortado();
else
signal(lock);
O semaforo clientes conta os clientes que esperam,barbeiro indica se o barbeiro esta ocupado e lock e utilizadopara exclusao mutua. Quando o barbeiro chega para trabalhar,ele fica dormindo ate algum cliente chegar. Quando um clientechega, ele acorda o barbeiro. Se outro cliente chega logo emseguida, o segundo cliente sera bloqueado ate que o primeirocliente libere o lock.
Quando o corte de cabelo termina, o cliente sai da barbearia.O barbeiro entretanto, tenta receber o proximo cliente e naausencia de clientes, ele volta a dormir.
Solucao 2
semaforo cadeiras = 5;
semaforo barbeiro = 0;
semaforo clientes = 0;
semaforo cabelo_cortado = 0;
Barbeiro:
while (true)
wait(clientes);
signal(barbeiro);
corta_cabelo();
signal(cabelo_cortado);
Solucao 2
Cliente:
if (trywait(cadeiras) == 0)
signal(clientes);
wait(barbeiro);
wait(cabelo_cortado);
signal(cadeiras);
O comando trywait tenta executar um wait no semaforocadeira, ou seja, tenta decrementar o valor de cadeira. Sefosse executado apenas um wait, formaria uma fila dos clientesque nao conseguem sentar na cadeira.
Nesta solucao, adicionamos um semaforo para sincronizar ocorte do cabelo e outro para limitar o numero de clientes es-perando na cadeira.
Profa. Tiemi Christine Sakata 4
5/14/2018 Problemas Cl ssicos de Sincroniza o - FECENS - slidepdf.com
http://slidepdf.com/reader/full/problemas-classicos-de-sincronizacao-fecens 5/5
FACENS - Faculdade de Engenharia de Sorocaba
Solucao 3
semaforo cadeiras = 5;
semaforo barbeiro = 0;
semaforo clientes = 0;
semaforo cabelo_cortado = 0;
semaforo levantou = 0;
Barbeiro:
while (true)
wait(clientes);
signal(barbeiro);
corta_cabelo();
signal(cabelo_cortado);
wait(levantou);
Solucao 3
Cliente:
if (trywait(cadeiras) == 0)
signal(clientes);
wait(barbeiro);
wait(cabelo_cortado);
signal(levantou);
signal(cadeiras);
Nesta solucao, um semaforo levantou foi adicionado paraque o barbeiro saiba que o cliente levantou e deixar outro cliente
sentar.
Profa. Tiemi Christine Sakata 5