Problemas Classicos SO
O Jantar dos Filósofos
• Cinco filósofos sentam-se à mesa circular
Aula 7: Problemas Clássicos de Sincronização
• Passam a vida pensando ou comendo
• O jantar dos filósofos
• Para comer usam dois garfos: um de cada lado
• Leitores/escritores
• Cada garfo é compartilhado por dois filósofos
• Barbeiro Dorminhoco
Sérgio Campos
Jantar dos Filósofos
Jantar dos Filósofos
semaphore garfo[5];
semaphore garfo[5];
2
filosofo(i) { while (true) { think(); if (i != 5) { wait(garfo[i]); wait(garfo[i+1 % 5]); eat(); signal(garfo[i]); signal(garfo[i+1 % 5]);
} else { wait(garfo[i+1 % 5]); wait(garfo[i]); eat(); signal(garfo[i+1 % 5]); signal(garfo[i]); };
};
Neste caso o ciclo é quebrado,
}
filosofo(i) { while (true) { think(); wait(garfo[i]); wait(garfo[i+1 % 5]); eat(); signal(garfo[i]); signal(garfo[i+1 % 5]);
};
}
Funciona ?
O problema deste código é que todo mundo pode pegar um garfo, e ao pegar o segundo não está disponivel. permite alocação e espera circulares
porque o 5 pega ao contrario.
Se o escalonador não for
Funciona ? viciado, não irá ocorrer inanicao
Sérgio Campos
3
Sérgio Campos
4
Jantar dos Filósofos
Leitores/Escritores
• Outras soluções existem:
• Alguns processos lêem o valor das variáveis compartilhadas: leitores;
• e.g. acessar garfos em exclusão mútua: mais complicado.
• Outros processos lêem e escrevem: escritores.
• Generalizações:
• Leitores podem ler de modo concorrente;
• Grafo não circular;
• Mas escritores só podem executar em exclusão mútua • Drinking philosophers:
• Para jantar são precisos todos os garfos compartilhados;
• Mas para beber apenas alguns são usados. Sérgio Campos
5
6
Sérgio Campos
Leitores/Escritores
Leitores/Escritores
semaphore escrevendo = 1, lendo = 1; int leitores = 0;
Problema: leitores podem sufocar escritores!
leitor() { while (true) { wait(lendo); leitores++; if (leitores == 1) wait(escrevendo); signal(lendo); le(); wait(lendo); leitores--; if (!leitores)