Sistemas Operacionais Deadlocks Deadlocks • Problema • Modelo do Sistema • Caracterização • Métodos para Manipulação • Prevenção • Evitar • Detecção • Recuperação Objetivos • Devenvolver uma descrição de deadlocks, os quais impedem que conjuntos de processos concorrentes completem suas tarefas • Apresentar diferentes métodos para prevenir ou evitar deadlocks em um sistema computacional O Problema de Deadlocks • Conjunto de processos bloqueados cada um mantendo um recurso e esperando para adquirir um recurso, mantido por um outro processo no conjunto • Exemplo: – Sistema com 2 disk drives – P1 e P2 cada um mantendo um disk drive e cada um necessitando de um outro • Exemplo: semáforos A e B, iniciados com 1 P0 P1 wait (A); wait(B) wait (B); wait(A) Exemplo para Atravessar uma Ponte • Tréfego somente em uma direção • Cada seção da ponte pode ser vista como um recurso • Se ocorre deadlock, pode ser resolvido se um carro voltar (preempção de recursos e rollback) • Diversos carros podem ter que voltar se ocorre deadlock • Pode causar starvation Modelo do Sistema • Tipos de recursos R1, R2, . . ., Rm CPU cycles, memory space, I/O devices • Cada tipo de recurso Ri tem Wi instâncias • Cada processo utiliza um recurso da seguinte forma: – pedido – uso – liberação Caracterização de Deadlock Deadlock ocorre se e somente se quatro condições se mantiverem simultaneamente • Mutual exclusion: somente um processo de cada vez pode usar um recurso • Hold and wait: um processo mantendo pelo menos um recurso e está esperando para adquirir recursos adicionais mantidos por outros processos Caracterização de Deadlock • No preemption: um recurso só pode ser liberado voluntariamente pelo processo que o mantém, após o processo completar a sua tarefa • Circular wait: existe um conjunto {P0, P1, …, P0} de processos esperando, tal que P0 está esperando por um recurso que está atribuído P1, P1 está esperando por um recurso que está atribuído a P2, …, Pn–1 está esperando por um recurso que está atribuído Pn, e Pn está esperando por um recurso que está atribuído a P0 Grafo de Alocação de Recursos Grafo : um conjunto de vértices V e um conjunto de arestas E • V está particionado em dois tipos: – P = {P1, P2, …, Pn}, o conjunto de todos os processos no sistema – R = {R1, R2, …, Rm}, o conjunto de todos os tipos de recursos no sistema • aresta de pedido – aresta direcionada P1 Rj • aresta de atribuição – aresta direcionada Rj Pi Grafo de Alocação de Recursos • Processo • Tipo de recurso com 4 instâncias • Pi solicita instância de Rj •Pi •Rj • Pi está mantendo uma instância de Rj •Pi •Rj Exemplo de um Grafo de Alocação de Recursos Grafo de Alocação de Recursos com Deadlock Grafo de Alocação de Recursos com Ciclo sem Deadlock Fatos Básicos • Grafo – não contém ciclos não há deadlock – contém um ciclo se houver • somente uma instância por tipo de recurso, então ocorre deadlock • diversas instâncias por tipo de recurso, então pode correr deadlock Métodos de Manipulação de Deadlock • Garante que o sistema nunca entra num estado de deadlock • Permite que o sistema entre num estado de deadlock e então recupera • Ignora o problema e pretende que deadlocks nunca ocorram no sistema; usado por muitos sistemas operacionais, incluindo o UNIX Prevenção de Deadlock • Mutual Exclusion – – não é necessária para recursos compartilháveis – deve se manter para recursos que não podem ser compartilhados Prevenção de Deadlock • Hold and Wait – deve guarantir que sempre que um processo solicite um recurso, ele não mantém qualquer outro recurso – Exige que os processos solicitem e sejam alocados todos os seus recursos antes de iniciar a execução, ou permite que o processo solicite recursos somente quando não tenha nenhum outro – Baixa utilização de recursos; possibilita starvation Prevenção de Deadlock • No Preemption – – Se um processo que está mantendo alguns recursos e solicita um outro recurso que não pode ser imediatamente alocado todos os recursos que ele mantém devem ser liberados – Recursos com preempção são adicionados a lista de recursos do processo que está esperando – Processo serão reiniciados somente quando ele puder recuperar seus recursos anteriores, além dos novos que está solicitando Prevenção de Deadlock • Circular Wait – – impõe uma ordenação total de todos os tipos de recursos – requer que cada processo solicite recursos em uma ordem crescente de enumeração Evitar Deadlock Requer que o sistema tenha alguma informação adicional disponível a priori • Modelo mais simples e útil requer que cada processo declare o número máximo de recursos de cada tipo que pode precisar • Algoritmo de deadlock-avoidance examina dinamicamente o estado de alocação de recursos para garantir que nunca ocorra um condição de espera circular (circular-wait) Evitar Deadlock • Estado de alocação de recursos é definido – pelo número de recursos disponíveis e alocados – demanda máxima dos processos Estado Seguro • Quando um processo solicita um recurso disponível, o sistema deve decidir se com a alocação imediata deste recurso, o sistema permanece em um estado seguro • O sistema está em um estado seguro se exite uma seqüência <P0, P2, …, Pn> de todos os processos o sistema é tal que para cada Pi, o recurso que Pi ainda pode solicitar e pode ser satisfeito pelos recursos correntemente disponíveis + recursos mantido por todos os Pj, com j < i Estado Seguro • Isto é: – Se Pi necessita de recursos que não estão disponíveis imediatamente, então Pi pode esperar até que todos Pj tenham teminado – Quando Pj termina, Pi pode obter os recursos necessários, executar, retornar os recursos alocados e terminar – Quando Pi termina, Pi +1 pode obter seus recursos necessários, e assim por diante. Fatos Básicos • Se um sistema está num – estado seguro não ocorre deadlocks – estado inseguro pode ocorrer deadlock • Evitar garante que um sistema nunca entrará em um estado inseguro Algoritmos Avoidance • Única instânica de um tipo de recurso usar um grafo de alocação de recurso • Múltiplas instâncias de um tipo de recurso o banker’s algorithm Esquema do Grafo de Alocação de Recursos • Aresta de demanda (claim edge) Pi Rj indica que processo Pj pode solicitar o recurso Rj; representado por uma linha tracejada • Claim edge converte para aresta de pedido (request edge) quando um processo solicita um recurso • Aresta de pedido converte para aresta de atribuição (assignment edge) quando o recurso é alocado ao processo • Quando um recurso é liberado por um processo, a aresta de atribuição se converte para uma claim edge • Recursos devem ser declarados no sistema a priori Grafo de Alocação de Recursos Grafo de Alocação de Recursos em Estado Inseguro Algoritmo do Grafo de Alocação de Recursos • Suponha que o processo Pi solicite um recurso Rj • O pedido pode ser garantido somente se a conversão da aresta de pedido (request edge) para aresta de atribuição (assignment edge) não resulta numa formação de um ciclo no grafo de alocação de recursos Banker´s Algorithm • Mútiplas instâncias • Cada processo deve a priori declarar a sua demanda de uso máxima • Quando um processo solicita um recurso ele pode ter que esperar • Quando um processo consegue todos os seus recursos, ele deve liberá-los numa quantidade de tempo finita Estrutura de Dados: Banker´s Algorithm Suponha n = número de processos, m = número de tipos de recursos • Available: Vetor de tamanho m. Se Available [j] = k, existem k instâncias dos recursos do tipo Rj disponíveis • Max: matriz n x m. Se Max [i,j] = k, então processo Pi pode pedir até k instâncias do recurso do tipo Rj Estrutura de Dados: Banker´s Algorithm • Allocation: matriz n x m. Se Allocation[i,j] = k então Pi está alocando k instâncias de Rj • Need: matriz n x m. Se Need[i,j] = k, então Pi pode necessitar de mais k instâncias de Rj para terminar sua tarefa Need [i,j] = Max[i,j] – Allocation [i,j] Algoritmo Seguro 1. Deixe Work e Finish serem vetores de tamanho m e n, respectivamente. Inicie: Work = Available Finish [i] = false for i = 0, 1, …, n- 1 2. Encontre um i tal que ambos: (a) Finish [i] = false (b) Needi Work Se não existe tal i, vá para o passo 4 3. Work = Work + Allocationi Finish[i] = true vá para o passo 2 4. Se Finish [i] == true tara todo i, então o sistema está em um estado seguro Algoritmo de Pedido de Recurso por Processo Pi Request = vetor de pedido para o processo Pi. If Requesti [j]=k então processo Pi quer k instâncias do recurso de tipo Rj 1.Se Requesti Needi vá para o passo 2. Caso contrário, raise error condição de erro, uma vez que o processo excedeu sua demanda máxima 2.Se Requesti Available, vá para o passo 3. Caso contrário Pi deve esperar, uma vez que os recursos não estão disponíveis Algoritmo de Pedido de Recurso por Processo Pi 3.Pretende alocar recursos pedidos para Pi modificando o estado da seguinte forma: Available = Available – Request; Allocationi = Allocationi + Requesti; Needi = Needi – Requesti; Se safe os recursos são alocados a Pi Se unsafe Pi deve esperar e o estado de alocação antigo é restaurado Exemplo do Algoritmo do Banqueiro • 5 Processos P0 até P4; 3 tipos de recursos: A (10), B (5), e C (7) instâncias • Snapshot do tempo T0: Allocation Max Available AB C ABC ABC P0 010 753 332 P1 200 322 P2 302 902 P3 211 222 P4 002 433 Exemplo do Algoritmo do Banqueiro • O conteúdo da matriz Need é definido como Max–Allocation P0 P1 P2 P3 P4 Need ABC 743 122 600 011 431 • O sistema está em um estado seguro, porque a seqüência < P1, P3, P4, P2, P0> satisfais o critério de segurança Exemplo: Pi solicita (1,0,2) • Verfique que Request Available (que é, (1,0,2) (3,3,2) true) Allocation Need Available ABC ABC ABC P0 010 743 230 P1 302 020 P2 301 600 P3 211 011 P4 002 431 Exemplo: Pi solicita (1,0,2) • Execução do algoritmo de segurança mostra que a seqüência < P1, P3, P4, P0, P2> satisfais a necessidade de segurança • O pedido para (3,3,0) pelo P4 pode ser garantido? • O pedido para (0,2,0) pelo P0 pode ser garantido? Detecção de Deadlock • Permite ao sistema entrar num estado de deadlock • Algoritmo de Deteção • Esquema de Recuperação Única Instância para Cada Tipo de Recurso • Mantém grafo wait-for – Nós são processos – Pi Pj se Pi está esperando por Pj • Periodicamente invoca um algoritmo que busca por um ciclo no grafo. Se existe um ciclo, existe deadlock • Um algoritmo para detectar um ciclo em um grafo requer operações da ordem de n2, onde n é o número de vértices no grafo Grafo de Alocação de Recurso e Grafo Wait-For Resource-Allocation Graph Corresponding Wait-For Graph Diversas Instâncias de um Tipo de Recurso • Available: Um vetor de tamanho m indica o número de recursos disponíveis de cada tipo • Allocation: Uma matriz n x m define o número de recursos de cada tipo correntemente alocado para cada processo • Request: Uma matriz n x m indica o pedido corrente de cada processo. Se Request [ij] = k, então o processo Pi está pedindo mais k instâncias do tipo de recurso Rj Algoritmo de Detecção 1.Deixe Work e Finish serem vetores de tamanho m e n, respectivamente. Inicie: (a) Work = Available (b) For i = 1,2, …, n, if Allocationi 0, then Finish[i] = false;otherwise, Finish[i] = true 2.Encontre um índice i tal que ambos: (a)Finish[i] == false (b) Requesti Work Se tal i não existe, vá para o passo 4 Algoritmo de Detecção 3.Work = Work + Allocationi Finish[i] = true vá para o passo 2 4.Se Finish[i] == false, para algum i, 1 i n, então o sistema está num estado de deadlock. Além disso, se Finish[i] == false, então Pi está em deadlock Algoritmo requer operações da ordem de O(m x n2) para detectar se o sistema está em estado de deadlocked Exemplo do Algoritmo de Detecção • 5 processos P0 até P4; 3 tipo de recursos A (7), B (2), e C (6) instâncias • Snapshot no tempo T0: Allocation Request Available P0 ABC AB C ABC 010 000 000 P1 200 202 P2 303 000 P3 211 100 P4 002 002 • Seqüência <P0, P2, P3, P1, P4> resultará em Finish[i] = true para todo i Exemplo do Algoritmo de Detecção • P2 pede uma instância adicional do tipo C Request ABC P0 000 P1 201 P2 001 P3 100 P4 002 Exemplo do Algoritmo de Detecção • Estado do sistema? – Pode demandar recurso mantido pelo processo P0, mas recursos insuficientes se ajustam a outros processos; pedidos. – Deadlock existe, consistindo dos processos P1, P2, P3, e P4 Uso do Algoritmo de Detecção • Quando e quantas vezes, invocar depende de: – Quantas vezes é provável que ocorra deadlock ? – Quantos processos necessitarão ter a sua execução retornada para determinado ponto (rolled back)? • um por cada ciclo disjunto • Se o algoritmo de detecção é invocado arbitrariamente, pode haver muitos ciclos no grafo de recursos e então não seriam capazes de dizer quais dos muitos processos em deadlock causaram o deadlock Recuperação de Deadlock: Processo de Terminação • Abortar todos os processos em deadlock • Abortar um processo de cada vez até o ciclo de deadlock ser eliminado • Em que ordem escolheríamos abortar? – Prioridade do processo – Quanto tempo o processo computou, e quanto tempo mais falta para terminar – Recursos usados pelo processo – Recursos necessários para completar o processo – Quantos processos necessitam ser terminados – O process é interativo ou batch? Recuperação de Deadlock: Preempção de Recursos • Seleção de uma vítima – minimiza o custo • Rollback – returna para algum estado seguro, reinicia processo naquele estado • Starvation – algum processo pode sempre ser escolhido como vítima, incluir número de rollbacks no fator de custo