Escolar Documentos
Profissional Documentos
Cultura Documentos
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.
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.
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]);
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
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);
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.
Soluo 3 ca
semaforo semaforo semaforo semaforo semaforo cadeiras = 5; barbeiro = 0; clientes = 0; cabelo_cortado = 0; levantou = 0;
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.