soluçoes
Inibição de interrupções Solução simples para as primitivas enter e leave que impede as trocas de contexto dentro da seção crítica. Ao entrar, a tarefa desativa (mascara) as interrupções que possam provocar trocas de contexto e reativa ao sair da seção crítica.
Busy wait
Espera ativa ou espera ocupada, basicamente o que essas soluções fazem é:
– Se entrada na região critica não for permitida espera até que o acesso seja liberado. Conseqüência: desperdício de tempo de CPU.
• Problema da inversão de prioridade: Processo não prioritário está na sua região critica e é interrompido. Processo prioritário é selecionado mas entra em espera ativa. O processo não prioritário nunca vai ter a chance de sair da região crítica Soluções com Busy Wait. Testar permissão de entrada pode resultar em problema. O que é testado é uma variável compartilhada dois processos podem simultaneamente concluir que a região crítica está livre
Algoritmo de Peterson int turn = 0 = indica de quem é a vez int wants[2] = {0, 0}; = indica se a tarefa i quer acessar void enter (int task)= task pode valer 0 ou 1 int other = 1 - task = indica a outra tarefa interested[task] = 1= task quer acessar a seção crítica turn = task while ((turn == task) && wants[other]) = espera ocupada void leave (int task) [wants[task] = 0 = task libera a seção crítica
Soluções para o problema de inconsistência dos dados, consistência de dados pode ser garantida através de vários mecanismos de incronização, software, hardware e mecanismos disponibilizados pelo hardware. Desabilitando interrupções, software, mecanismos genéricos de uma linguagem de programação
Algoritmos de Dekker e Lamport, recursos do SO, semáforos, troca de mensagens, monitores.
O algoritmo de Decker = O Decker resolve o problema da exclusão mútua, demostrando que é possível resolver o problema inteiramente por software, sem exigir instruções de