Você está na página 1de 5

FACENS - Faculdade de Engenharia de Sorocaba

Problemas Clssicos de Sincronizao a ca


Filsofos Jantando o
Filsofo i: o 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 at que o garfo ese pecicado esteja dispon e ento, pega-o. O garfo i o garfo vel a e da esquerda e o garfo i+1 o garfo da direita. Esta soluo no e ca a est correta pois se os 5 lsofos pegarem seus garfos esquerdos a o simultaneamente, nenhum ser capaz de pegar o garfo direito e a haver um deadlock. a O programa obvio poderia ser modicado da seguinte maneira. O lsofo, aps pegar o garfo esquerdo verica se o garfo direito o o est dispon a vel. Se no estiver dispon a vel, ele devolve o garfo esquerdo e espera por um tempo e ento repete o procedimento. a Esta soluo no funciona se os lsofos tentam pegar os garfos ca a o esquerdos simultaneamente. Ento todos vo devolver os garfos a a e esperar por um tempo. Se o tempo de espera igual para e todos, ento todos vo tentar pegar o garfo simultaneamente e a a assim por diante, para sempre.

Soluo Obvia ca

O problema dos lsofos jantando foi introduzido e soluo cionado por Dijkstra em 1965. Neste problema, 5 lsofos esto o a sentados ao redor de uma mesa redonda e cada lsofo tem o um prato de espaguete. Entre cada prato h um garfo e o esa paguete est to escorregadio que o lsofo precisa de 2 garfos a a o para com-lo. e A vida do lsofo consiste em per o odos alternados de comer e de pensar. Quando o lsofo ca com fome, ele tenta pegar o o garfo da direita e o da esquerda, um de cada vez, em qualquer ordem.

Boas soluoes c Soluo com lock ca


ausncia de deadlock e ausncia de starvation e alto grau de paralelismo 5 lsofos com o fome, 2 podem comer Filsofo i: o 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 no resulta em deadlock nem em a fome proteger os procedimentos com um semforo binrio e a a (lock). Antes de comear a pegar um dos garfos, o lsofo c o faria um wait no semforo e aps comer e devolver os garfos, a o faria um signal no semforo. Neste caso, apenas um lsofo a o por vez pode estar comendo.

Uma boa soluo para o problema dos lsofos jantando no ca o e a permitir que ocorra deadlock, ou seja, quando todos os lsofos o param esperando que algum libere o garfo. Outra situao que e ca devemos evitar starvation onde todos os lsofos tentam cone o tinuar a executar a tentativa de pegar os garfos, mas no h a a nenhum progresso, ou seja, todos passam fome. Alm disso, e se temos 5 lsofos com fome e temos 5 garfos seria intereso sante deixar 2 lsofos comer obtendo assim um alto grau de o paralelismo.

Profa. Tiemi Christine Sakata

FACENS - Faculdade de Engenharia de Sorocaba

Soluo Assimtrica ca e
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]);

Soluo do livro Tanenbaum ca


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]);

Suponha que todos os lsofos esto com fome. o a Cenrio com paralelismo: a F0 est comendo a F2 pega garfos 2 e 3. F1 no pega garfo nenhum. a

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);

Cenrio em que no h paralelismo: a a a F0 est comendo a F1 pega o garfo 2 F4 pega o garfo 4 F2 no consegue pegar o garfo 2 a F3 no consegue pegar o garfo 4 a

Nesta soluo, temos que cada lsofo pode estar no estado T ca o (thinking), E (eating) ou H (hungry). Um lsofo s pode passar o o para o estado E se nenhum vizinho estiver comendo. Os vizinhos do lsofo i so denidos pelas macros fil esq e fil dir. o a

Profa. Tiemi Christine Sakata

FACENS - Faculdade de Engenharia de Sorocaba

Leitores e Escritores
Dois tipos de processos: leitores e escritores Leitores: apenas lem as informaoes e c Escritores: alteram os dados Exemplo: reserva de passagem area e

Um exemplo do conceito de leitores e escritores um sistema e de reserva de passagens areas. Os leitores so aqueles que pree a cisam de informao de vo. Note que o sistema pode permitir ca o que vrios leitores estejam ativos em um determinado tempo pois a a base de dados no alterada por ningum. Os escritores so a e e a aqueles que desejam reservar um lugar em um determinado vo. o O sistema no deve permitir que algum escreva ou leia enquanto a e um um escritor est ativo. Portanto, preciso implementar uma a e pol tica de excluso mtua sempre que houver um grupo de esa u critores e leitores.

Nesta soluo, o primeiro leitor que recebe acesso ao banco ca de dados faz um wait(db) impedindo de um escritor escrever. Os leitores subseqentes incrementam um contador numl e ao u terminar a leitura, esse contador decrementado. Quando todos e os leitores terminam sua execuo, o semforo db liberado ao ca a e escritor. Nesta soluo, se enquanto um leitor est usando o banco de ca a dados, aparece um outro leitor, o segundo leitor admitido. Se e um escritor aparece, mas se existe leitores ativos constantemente, o escritor nunca ser desbloqueado. a Outra soluo requer que o escritor, assim que estiver pronto, ca faa sua escrita o mais rpido poss c a vel, ou seja, se um escritor estiver esperando para acessar a RC, nenhum outro leitor poder a iniciar a leitura. Neste caso, os leitores podem sofrer paralisao. ca Houre (1974) props uma outra soluo para este problema. o ca Assim que um escritor termina, todos os leitores em espera recebem permisso para execuo. Em seguida, assim que o grupo a ca de leitores termina, o escritor que estava esperando pode comear c e assim sucessivamente.

Soluo de Courtois ca
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);

Soluo de Courtois ca
escritor: while(true) wait(db); escreve_db(); signal(db);

Profa. Tiemi Christine Sakata

FACENS - Faculdade de Engenharia de Sorocaba

Barbeiro Adormecido

O semforo clientes conta os clientes que esperam, a barbeiro indica se o barbeiro est ocupado e lock utilizado a e para excluso mtua. Quando o barbeiro chega para trabalhar, a u ele ca dormindo at algum cliente chegar. Quando um cliente e chega, ele acorda o barbeiro. Se outro cliente chega logo em seguida, o segundo cliente ser bloqueado at que o primeiro a e cliente libere o lock. Quando o corte de cabelo termina, o cliente sai da barbearia. O barbeiro entretanto, tenta receber o prximo cliente e na o ausncia de clientes, ele volta a dormir. e

Soluo 2 ca
O problema do barbeiro adormecido acontece em uma barbearia. A barbearia tem um barbeiro, uma cadeira de barbeiro e n cadeiras para os clientes esperarem. Quando um cliente chega, ele tem que acordar o barbeiro. Se um cliente chega e o barbeiro est trabalhando, ele senta se houver cadeira vazia ou vai embora a se todas as cadeiras estiverem ocupadas. semaforo semaforo semaforo semaforo Barbeiro: while (true) wait(clientes); signal(barbeiro); corta_cabelo(); signal(cabelo_cortado); cadeiras = 5; barbeiro = 0; clientes = 0; cabelo_cortado = 0;

Soluo 1 ca
semaforo lock = 1, barbeiro = 0, clientes = 0; int cesperando = 0;

Soluo 2 ca
Barbeiro: while (true) wait(clientes); wait(lock); cesperando = cesperando + 1; signal(barbeiro); signal (lock); corta_cabelo(); Cliente: if (trywait(cadeiras) == 0) signal(clientes); wait(barbeiro); wait(cabelo_cortado); signal(cadeiras);

Soluo 1 ca
Cliente: wait(lock); if (cesperando < CADEIRAS) cesperando = cesperando + 1; signal(clientes); signal(lock); wait(barbeiro); cabelo_cortado(); else signal(lock); O comando trywait tenta executar um wait no semforo a cadeira, ou seja, tenta decrementar o valor de cadeira. Se fosse executado apenas um wait, formaria uma la dos clientes que no conseguem sentar na cadeira. a Nesta soluo, adicionamos um semforo para sincronizar o ca a corte do cabelo e outro para limitar o nmero de clientes esu perando na cadeira.

Profa. Tiemi Christine Sakata

FACENS - Faculdade de Engenharia de Sorocaba

Soluo 3 ca
semaforo semaforo semaforo semaforo semaforo cadeiras = 5; barbeiro = 0; clientes = 0; cabelo_cortado = 0; levantou = 0;

Barbeiro: while (true) wait(clientes); signal(barbeiro); corta_cabelo(); signal(cabelo_cortado); wait(levantou);

Soluo 3 ca
Cliente: if (trywait(cadeiras) == 0) signal(clientes); wait(barbeiro); wait(cabelo_cortado); signal(levantou); signal(cadeiras);

Nesta soluo, um semforo levantou foi adicionado para ca a que o barbeiro saiba que o cliente levantou e deixar outro cliente sentar.

Profa. Tiemi Christine Sakata