Problemas Clássicos de Sincronização - FECENS

6
 FACENS  - Faculdade de Engenharia de Sorocaba Problemas Cl´ assicos de Sincro niza¸c˜ ao Fil´ osofos Jantando O pr obl ema dos l´osofos jan tan do foi introduzid o e solu- cionado por Dijkstra em 1965. Neste problema, 5 os ofo s es ao sentados ao redor de uma mesa redonda e cada osofo tem um prato de espaguete. Entre cada prato h´ a um garfo e o es- paguete est´a ao escorreg adio que o osofo precisa de 2 garfos para comˆ e-l o. A vida do osofo consiste em p er ´ ıodos alternados de comer e de pensar. Quando o l´osofo ca com fome, ele tenta pegar o garfo da direita e o da esquerda, um de cada vez, em qualquer ordem. Boas solu¸ oes  auencia de  deadlock  auencia de  starvation  alto grau de paralelismo – 5 osofos com fome, 2 podem comer Uma boa solu¸ ao para o probl ema dos osof os j ant and o ´ e n˜ ao permitir que o corr a  deadlock , ou seja, quando todos os osofos param esperando que algu´ em lib ere o garfo. Outra situa¸ ao qu e dev emo s e vit ar ´ e  starvation onde todos os osofos tentam con- tinuar a executar a tentativa de pegar os garfos, mas n˜ao a nenhu m prog resso, ou seja, todos passam fome. Al´ em disso , se temos 5 osofos com fome e temos 5 garfos seria interes- sante deixar 2 osofos comer obtendo assim um alto grau de paralelismo. Solu¸ c˜ ao  ´ Obvia Fil´ osofo i: while (true ) pensa(); wait(garfo[i]); wait( garfo[(i+1) % N]); come(); signal(garfo[i]); signa l(gar fo[(i +1) % N]); O procedimento  wait(garfo(i))  esper a at´ e que o garfo es- peci cado esteja dispo ıvel e ent˜ao, p ega-o . O garfo  i  ´ e o gar fo da esquerda e o garfo i+1 ´ e o garfo da direita. Esta solu¸ c˜ ao n˜ ao est´ a correta p ois se os 5 osofos pegarem seus garfos esquerdos simultaneamente, nenhum ser´ a capaz de pegar o garfo direito e haver´ a um deadlock . O programa ´ obvio poderia ser modicado da seguinte maneira. O osofo, ap´ os pegar o garf o esquerdo verica se o garf o direito est´a dispo n´ ıvel. Se n˜ ao estive r d ispon´ ıvel , ele devolv e o garfo esquerdo e espera por um tempo e ent˜ao repete o procedimento. Esta solu¸ ao n˜ ao func ion a se os osofos tentam pegar os garfos esquerdos simultaneamente. Ent˜ ao todos v˜ ao devolver os garfos e esperar por um tempo. Se o tempo de espera ´ e igu al para todos, ent˜ ao todos v˜ ao tentar pegar o garfo simulta neamente e assim por diante , para sempre. Solu¸ ao com lo ck Fil´ osofo i: while (true ) pensa(); wait(lock); wait(garfo[i]); wait( garfo [(i+1 ) % N]); come(); signa l(gar fo[(i +1) % N]); signal(garfo[i]); signal(lock); Um aprimoramento que n˜ ao resulta em  deadlock  nem em fome ´ e proteger os procedimentos com um sem´ aforo bin´ ario (lock). An tes de comcar a pegar um dos garfos, o osofo faria um  wait  no sem´aforo e ap´ os comer e devolver os garfos, faria um  signal  no sem´ aforo. Nes te caso, apenas um osofo por vez pode estar comendo. Profa. Tiemi Christine Sakata  1

Transcript of Problemas Clássicos de Sincronização - FECENS

Page 1: 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

Page 2: 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 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

Page 3: 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 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

Page 4: 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 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

Page 5: 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 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