SISTEMAS OPERACIONAIS Deadlock Os sistemas computacionais estão repletos de recursos que podem ser usados por um processo por vez. Exemplo: CD-ROM, Driver de Fita Dat, etc. Ter dois processos simultaneamente gravando na impressora, por exemplo, resulta em uma confusão. Todos os SO têm a capacidade de temporariamente conceder acesso exclusivo a certos recursos para um processo. Para muitos aplicativos, um processo requer acesso exclusivo não a um, mas a vários recursos. Imagine uma gráfica que precisa plotar um banner, cujas informações vêm em um CD. Um processo A solicita a leitura do CD; um momento mais tarde outro processo B solicita a impressão de uma imagem. Agora o processo B solicita a plotadora e a bloqueia, esperando por ela. O processo B também solicita o CD e também bloqueia. Neste ponto os dois processos estão bloqueados e assim permaneceram eternamente. Essa situação é chamada de Deadlock ou impasse. Os deadlocks podem ocorrer em outras situações além dessas de solicitar dispositivos dedicados de E/S. Em banco de dados, um programa pode precisar travar vários registros que ele está utilizando para evitar condição de corrida. Se o processo A trava o registro R1 e o processo B trava o registro R2, e cada processo tenta travar o registro do outro também ocorre um deadlock. Em suma, os deadlocks ocorrem tanto em hardware como em software. Recursos Um recurso pode ser um dispositivo de hardware ou um conjunto de informações. Um computador terá muitos recursos diferentes que podem ser adquiridos. Quando várias cópias de um recurso estiverem disponíveis, qualquer uma delas pode ser utilizada para satisfazer qualquer solicitação ao recurso. Em suma, um recurso é qualquer coisa que pode ser usada somente por um único processo. Recursos Os recursos dividem-se em dois tipos: Recurso Preemptível; Recurso não-Preemptível. Recurso Preemptível O primeiro é aquele que pode ser tirado do processo que é proprietário sem nenhum problema. A memória é um exemplo de um recurso preemptível. No caso da impressora quando B solicitasse o recurso do CD, teoricamente haveria um impasse. No caso do recurso preemptível é possível preemptar a memória de A comutando-a para o disco e comutando B para a memória. Dessa forma B pode usar u CD. Nenhum impasse ocorre. Recurso não preemptivo No segundo caso, recurso não-preemptível, é aquele que não pode ser tirado de seu proprietário atual sem causar falha na computação. Se um processo começou a imprimir, a ação de tirar dele e dá-la a outro processo resultará em problemas na saída. As impressoras não são preemptíveis. Em geral, deadlocks envolvem recursos nãopreemptíveis. A seqüência de eventos requerida para utilizar um recurso é: Solicitar o recurso; Utilizar o recurso; Liberar o recurso. Se o recurso requerido não está disponível, duas situações podem ocorrer: Processo que requisitou o recurso fica bloqueado até que o recurso seja liberado, ou; Processo que requisitou o recurso falha, e depois de certo tempo tenta novamente requisitar o recurso; Princípios Básicos de Impasses Em deadlock pode ser definido formalmente da seguinte forma: Um conjunto de processos está em situação de deadlock se todo processo pertencente ao conjunto estiver esperando por um evento que somente um outro processo desse mesmo conjunto poderá fazer acontecer. Na maioria dos casos, o evento que cada processo está esperando é a liberação de algum recurso atualmente possuído por outro membro do conjunto. Em outras palavras, cada membro do conjunto de processos em impasse está esperando um recurso que é possuído por um processo em estado de impasse. Nenhum processo pode executar, nenhum pode liberar recurso e nenhum pode ser acordado. Quatro Condições para Deadlock Condição de exclusão mútua Condição de posse e espera (hold and wait) Processos que já possuem algum recurso podem solicitar novos recursos; Condição de não preempção Um recurso só pode estar alocado para um processo em um determinado momento; Recursos já alocados não podem ser retirados do processo que os alocou; Somente o processo que alocou o recurso pode liberá-lo; Condição de espera circular Deve ser uma cadeia circular de dois ou mais processos; Cada um está à espera de recurso retido pelo membro seguinte dessa cadeia; Modelagem de Deadlocks Geralmente, deadlocks são representados por grafos a fim de facilitar sua detecção, prevenção e recuperação – Ocorrência de ciclos pode levar a um deadlock; Os grafos podem ser modelados utilizando grafos dirigidos: Modelagem de Deadlocks a) b) c) recurso R está alocado ao processo A; processo B está solicitando/ esperando pelo recurso S; processos C e D estão em deadlock sobre recursos T e U; Estratégias para lidar com impasses Ignorar por completo o problema. Detectar e recuperar o problema: deixar os deadlocks ocorrerem, detectá-los e agir; Evitar dinamicamente o problema: alocação cuidadosa de recursos; Prevenir o problema: negação de uma das quatro condições necessárias para gerar deadlocks; O Algoritmo do Avestruz Esta é a abordagem mais simples: Fingir que não há nenhum problema. Dentro dessa idéia, o UNIX (e o MINIX) apresentam impasses que nem mesmo são detectados ou por vezes são automaticamente interrompidos. Esta abordagem é simplesmente ignorar o problema na suposição de que a maioria dos usuários preferiria um impasse ocasional a uma regra que restringisse todos os usuários. Assim, ignorar o problema é razoável se deadlocks ocorrem muito raramente e o custo da prevenção é alto. Esta é uma ponderação entre conveniência e correção. Detecção e Recuperação Quando esta técnica é utilizada, o SO não faz nada senão monitorar as solicitações e as liberações. Exemplo: Processos estão com todos os recursos alocados; Procedimento: permitir que os deadlocks ocorram tentar detectar as causas e solucionar a situação; Detecção e Recuperação • Algoritmos: Detecção com um recurso de cada tipo; Detecção com vários recursos de cada tipo; Recuperação por meio de preempção; Recuperação por meio de rollback (volta ao passado) Recuperação por meio de eliminação de processos Prevenção de Deadlock A terceira estratégia é impor restrições convenientes para os processos de tal modo que os impasses sejam impossíveis. Se for possível que pelo menos uma das condições de deadlocks não ocorra, então os deadlocks não acontecerão. No caso da Exclusão Mútua, se nenhum recurso for atribuído exclusivamente a um único processo, nunca haverá deadlock. Prevenção de Deadlock O princípio é evitar alocar um recurso quando ele não for absolutamente necessário e tentar assegurar que o menor número possível de processos possa de fato requisitar o recurso. Exemplo: O uso de spool permitindo que somente um recurso da impressora seja usado por processo. Prevenção de Deadlock Na segunda condição (condição de posse e espera), basta requerer que todos os processos solicitem os seus recursos antes de iniciar a execução. No entanto, um processo nunca tem que esperar por aquilo que precisa. Um dos problemas é não poder não saber quantos e quais recursos vão precisar no início da execução e também reter recursos que outros processos poderiam estar usando Prevenção de Deadlock A terceira condição (nenhuma preempção) seria tomar o recurso a força, contudo é uma solução pouco promissora, de certa forma inviável. Por último, a espera circular pode ser eliminado de várias maneiras, uma delas é ter uma regra que diz que um processo é intitulado somente para um único recurso em qualquer momento, ou atribuir uma ordem para chamada para aquele recurso. Impedimento do Impasse Anteriormente o deadlock não foi evitado pela imposição de regras arbitrárias aos processos, mas pela análise cuidadosa de cada solicitação de recurso para ver se ele poderia ser concedido seguramente. Impedimento do Impasse Para evitar dinamicamente o deadlock podem-se adotar algumas soluções: Alocação individual de recursos à medida que processo necessita; Escalonamento cuidadoso - impõe um alto custo e conhecimento prévio dos recursos que serão utilizados; Impedimento do Impasse Algoritmos: Banqueiro para um único tipo de recurso; Banqueiro para vários tipos de recurso; Definição de estados seguros e inseguros. Impedimento e Impasse Neste último, estados seguros não provocam deadlocks e há uma maneira de atender a todas as requisições pendentes finalizando normalmente todos os processos. Os estados inseguros podem provocar deadlocks, mas não necessariamente provocam. Impedimento e Impasse O algoritmo do banqueiro idealizado por Dijkstra (1965), considera cada requisição no momento em que ela ocorre, verificando se essa requisição leva a um estado seguro; Se sim, a requisição é atendida, se não o atendimento é adiado para outro momento; Premissas adotadas por um banqueiro para garantir ou não crédito (recursos) para seus clientes (processos). Nem todos os clientes (processos) precisam de toda a linha de credito (recursos) disponível para eles. Vantagens e desvantagens do algoritmo do banqueiro: Pouco utilizado, pois é difícil saber quais recursos serão necessários; O número de processos é dinâmico e pode variar constantemente, tornando o algoritmo custoso; Na teoria o algoritmo é ótimo. Questionário O que é deadlock, e quais as suas possíveis causas? O que é recurso e como podemos categorizar? Quais as 4 condições para o deadlock? Descreva as estratégias para lidar com impasses