Deadlocks (impasses)
Exemplos de recursos impressoras, drives, tabelas, memória, tempo de processador Sequência de eventos necessária para usar um recurso Solicitar recurso Usar recurso Liberar recurso Se o pedido for negado Pode bloquear e esperar semáforo ou espera ociosa Pode falhar, retornando código de erro
O problema do deadlock Um conjunto de processos bloqueados cada qual mantendo um recurso e aguardando por um recurso mantido por outro processo do conjunto. Semaphore x=1; Semaphore y=1; void t1( void) { down( &x); down( &y); } void t2( void) { down( &y); down( &x); }
Grafo de alocação Processo de recursos Classe de recurso com 4 instâncias Pi solicita instância de Ri P i R j B solicita S (1 instância de cada tipo de recurso) Pi está mantendo uma instância de Ri P i Rj A detém (mantém) R (1 instância de cada tipo de recurso)
Caracterização do deadlock O deadlock pode acontecer se 4 condições ocorrerem simultaneamente: 1) Exclusão mútua: apenas um processo pode utilizar o recurso de cada vez; 2) Posse e espera: um processo que detém pelo menos um recurso, está aguardando para adquirir recursos adicionais mantidos por outros processos; 3) Não-preempção: um recurso pode ser liberado apenas voluntariamente pelo processo que o detém; 4) Espera circular: existe um conjunto de processos {P0, P1,, Pn} aguardando, de tal forma que P0 está aguardando um recurso mantido por P1, P1 está aguardando um recurso mantido por P2,, Pn-1 está aguardando um recurso de Pn e Pn está aguardando um recurso mantido por P0.
Exemplo de um grafo de alocação de recursos Grafo com mais de uma instância de cada tipo de recurso
Grafo de alocação de recursos com um ciclo mas sem deadlock
Detecção de deadlocks com um recurso de cada tipo Quando se tem um grafo com um recurso de cada tipo, um ciclo indica a presença deadlock
Fatos Se o grafo não contiver ciclos => não há deadlock Se o grafo contiver ciclo(s): Se houver apenas uma instância de cada tipo de recurso => deadlock Se houver várias instâncias de cada tipo de recurso => possibilidade de deadlock
Detecção de deadlocks com vários recursos de cada tipo Algoritmo 1) Procura-se um processo desmarcado, Pi, para o qual a i-ésima linha de R (Ri) seja menor ou igual ao disponível (A): Ri <= A? 2) Se este processo for encontrado, adiciona-se a i-ésima linha de C à A, marca-se o processo como terminado e volta-se ao passo 1 A = A+Ci 3) Se não existir esse processo, o algoritmo termina Ao final do algoritmo, se existirem processos desmarcados, significa que irá ocorrer um deadlock
Detecção de deadlocks com vários recursos de cada tipo Exemplo E = [4 2 3 1] A = [2 1 0 0] C = 0 0 1 0 2 0 0 1 0 1 2 0 R = 2 0 0 1 1 0 1 0 2 1 0 0 E: vetor de recursos existentes A: vetor de recursos disponíveis (available) C: matriz de alocação atual (current) R: matriz de requisições Ri <= A? A = A+Ci R3<=A A = A+C3 A=[2 2 2 0] Ri <= A? A = A+Ci R2<=A A = A+C2 A=[4 2 2 1] Ri <= A? A = A+Ci R1<=A A = A+C1 A=[4 2 3 1] A=E!!!
Métodos para tratar deadlocks Ignora-se o problema e finge-se que nunca vai ocorrer (algoritmo do avestruz). usado por muitos sistemas operacionais de uso geral (Linux, Windows) Permite-se que o sistema entre em deadlock e depois faz-se a recuperação Assegura-se que o sistema nunca entrará num estado de deadlock
Eliminação (morte) de processos Algoritmos de recuperação de deadlocks grosseiro mas simples. Usual em sistemas de uso geral (Windows e Linux) mas improvavél em sistemas de tempo real. Rollback (reversão de estado) necessário gravar o estado do processo periodicamente para ser utilizado quando necessário (deadlock). e.g. pontos de recuperação do Windows Preempção retira-se um recurso de determinado processo, devolvendo-se aquele mais tarde (depende da natureza do processo e do recurso)
Algoritmos para evitar deadlocks Trajetória de recursos Análise de estados seguros e inseguros um estado é seguro se não está em deadlock e existe uma ordem de escalonamento na qual todos os processos possam ser executados até sua conclusão. O sistema pode garantir que todos os processos terminarão estado inseguro: pode até ser que todos os processos terminem mas esta garantia não pode ser dada.
Algoritmos para evitar deadlocks Trajetória de recursos A solicita Printer A libera Printer
Algoritmos para evitar deadlocks Análise de estados seguros e inseguros o primeiro estado é seguro porque há uma ordem de escalonamento (BCA) que permite que todos os processos terminem. Já o segundo estado é inseguro porque permite apenas que B termine: A e C necessitarão de 5 recursos e estarão disponíveis apenas 4. seguro inseguro
Prevenção de deadlocks Ataca-se a condição de posse-e-espera Os processos solicitam todos os seus recursos antes de começar. Processo nunca tem de esperar Problema: pode-se não saber quais são os recursos necessários já no início
Prevenção de deadlocks Ataca-se a condição de espera circular Recursos ordenados Pedido de recursos feitos por ordem numérica Grafo de recursos nunca terá ciclos
Bibliografia [1] Real-Time Systems and Programming Languages. Burns A., Wellings A. 2nd edition [2] Análise de Sistemas Operacionais de Tempo Real Para Applicações de Robótica e Automação. Aroca R. V. Dissertação de Mestrado. [3] Operating System Concepts. Silberschatz, Galvin, Gagne. 8 th edition [4] Sistemas Operacionais Modernos. Tanenbaum 2a edição