Sistemas Operacionais: Deadlocks
Definição Deadlocks (impasse) Um conjunto de processos bloqueados cada um de posse de um recurso, esperando por um outro recurso que já está alocado por outro processo do mesmo conjunto
Código de trânsito brasileiro Art. 29. O trânsito de veículos nas vias terrestres abertas à circulação obedecerá às seguintes normas: III - quando veículos, transitando por fluxos que se cruzem, se aproximarem de local não sinalizado, terá preferência de passagem: a) no caso de apenas um fluxo ser proveniente de rodovia, aquele que estiver circulando por ela; b) no caso de rotatória, aquele que estiver circulando por ela; c) nos demais casos, o que vier pela direita do condutor; Existe a possibilidade de um impasse?
Caracterização de um impasse Um deadlock pode ocorrer, somente se as quatro condições a seguir ocorrem simultaneamente: Exclusão mútua: acesso exclusivo a recursos Obtém e espera: um processo de posse de um recurso espera para obter um outro recurso Sem preempção: um recurso somente pode ser liberado voluntariamente pelo processo Espera circular: um conjunto de processos {P 0,P 1,..,P n }. O processo P 0 espera por um recurso alocado por P 1, P 2 espera por P 2, e assim sucessivamente
Modelo do sistema Recursos do sistemas S 1, S 2,...,S n Cada recurso R i tem W i instâncias Para utilizar um recurso, um processo realiza as seguintes seqüências Requisita Utiliza Libera
Grafo de alocação de recursos Conjunto de vértices V e arestas E V é particionado em dois tipos: P = {P 1, P 2,, P n }, conjunto de processos no sistema. R = {R 1, R 2,, R m }, conjunto de recursos do sistema. Aresta de requisição aresta P 1 R j Aresta de atribuição aresta R j P i
Grafo de alocação de recursos Processo Recurso Processo P i solicita recurso R j P i Recurso R j alocado para o processo P i R j P i R j
Exemplo Impasse: satisfaz as 4 propriedades de um impasse?
Grafo com ciclo porém sem impasse Porque não existe impasse na situação acima?
Impasse Se um grafo não contém ciclos sem impasse. Se um grafo contém ciclos Se existe somente uma instância do recurso, então impasse. Se existe várias instâncias, possibilidade de impasse.
Métodos para manipular impasses 1. Garantir que o sistema nunca entrará em um estado de impasse. a) Prevenção de impasse (por construção) b) Evitar o impasse (em tempo de execução) 2. Permitir que o sistema entre em um estado de impasse e recuperá-lo. 3. Ignorar o problema e torcer para que um deadlock não ocorra no sistema (afinal, qual seria a utilidade do botão reset?).
Prevenção do impasse Exclusão mútua Alguns recursos necessitam de acesso exclusivo, portanto é uma situação obrigatória Obtém e espera: evitar que um processo Obtém e espera: evitar que um processo solicite um recurso, enquanto estiver de posse de outros recursos Solicitar todos os recursos no início da execução Baixa utilização dos recursos (possibilidade de abandono de processos starvation )
Prevenção de impasses(2) Sem preempção Possibilitar a preempção. Um processo de posse de alguns recursos, solicita outro recurso que não pode ser alocado. O processo libera os recursos obtidos e espera O processo entra na fila de solicitação de todos os recursos que ele tinha acesso, mais o recurso solicitado O processo volta a executar somente quando todos os recursos estão disponíveis Espera circular Impor uma ordem dos recursos, e possibilitar somente a alocação dos recursos em ordem crescente
Evitar o impasse Necessita de algumas informações adicionais Cada processo deve declarar o número máximo de recursos de cada tipo que utilizará durante a execução Algoritmo para evitar o impasse analisa dinamicamente o estado do grafo de alocação de recursos para verificar a situação de espera circular O estado do grafo de alocação do recurso considera o número de recursos alocados e o máximo disponível, e a utilização máxima de cada processo
Estado seguro Quando um processo solicita um recurso, deve-se analisar se a alocação imediata deixará o sistema em um estado seguro (sem possibilidade de impasse) Estado seguro: se existe uma sequencia de processos <P 1, P 2,, P n>, de todos os processos do sistema, onde para cada P i, os recursos que P i pode ainda solicitar, são satisfeitos pelos recursos disponíveis + recursos alocados por P j, onde j < i Se os recursos que Pi necessita não estão disponíveis, Pi poderá esperar até que os processso Pj sejam finalizados Os recursos que Pi necessita, estarão disponíveis após a finalização dos processos Pj Pi+1 pode continuar a executar após finalização de Pi, onde todos os recursos necessários estarão disponíveis
Estado seguro x Estado inseguro Se o sistema está em estado seguro: sem possibilidade de impasse Se o sistema está inseguro: existe a possibilidade de impasse Evitar o impasse: não permitir que o sistema entre em estado inseguro.
Algoritmo do banqueiro Evitar o impasse em um sistema com múltiplas instâncias de recursos Cada processo deve durante sua inicialização, indicar todos os recursos que irá utilizar (o máximo) Quando um processo solicita um recurso, o mesmo pode esperar O processo tem que garantir que liberará todos os recursos em uma quantidade finita de tempo
Algoritmo do banqueiro N = processos, M= tipos de recursos Available= vetor de tamanho M. Available[j]= K, indica que existem K instâncias do recurso Rj disponíveis Max= matriz NxM. Max[i, j]=k, indica que um processo Pi pode solicitar no máximo K instâncias do recurso Rj. Allocation= matriz NxM. Allocation[i, j]=k, indica que um processo Pi, alocou K instâncias do recurso Rj Need= matriz NxM. Need[i, j]=k, indica que um processo Pi, necessita ainda K instâncias do recurso Rj para finalizar. Need= Max-Allocation
Algoritmo para avaliação do estado 1. Work e Finish são dois vetores de tamanho m e n, respectivamente. Inicializar Work= available Finish[i]= false, para i=0..n 2. Procure um i, onde: Finish[i]= false Need i <=Work Se não existir um processo i, vá para o passo 4 3. Passo 3 Work= Work+ Allocation i Finish[i]= true Volte para o passo 2 4. Passo 4 Se Finish[i]=true para todo i, o sistema está em estado seguro
Algoritmo para alocação recursos do processo Pi Request i = vetor de requisições do processo Pi 1. Se Request i <= Need i, vá para o passo 2. Senão, sinalize um erro, pois o processo solicitou mais recursos que ele declarou necessitar 2. Se Request i <= Available, vá para o passo 3. Senão, o processo Pi deve esperar pois os recursos não estão disponíveis 3. O processo Pi pretende alocar os recursos, logo é necessário atualizar as estruturas de dados Available = Available Request; Allocation i = Allocation i + Request i ; Need i = Need i Request i ; Se seguro => os recursos podem ser alocados Senão o processo deve esperar, e o estado anterior deve ser restaurado
Exemplo do algoritmo do banqueiro 5 processos P 0.. P 4 ; 3 tipos de recursos: A (10 instâncias), B (5 instâncias), and C (7 instâncias). Visão do sistema no tempo T 0 : Allocation Max Available A B C A B C A B C P 0 0 1 0 7 5 3 3 3 2 P 1 2 0 0 3 2 2 P 2 3 0 2 9 0 2 P 3 2 1 1 2 2 2 P 4 0 0 2 4 3 3
Exemplo O conteúdo da matriz Need = Max Allocation. Need A B C P 0 7 4 3 P 1 1 2 2 P 2 6 0 0 P 3 0 1 1 P 4 4 3 1 O sistema esta em estado seguro < P 1, P 3, P 4, P 2, P 0 > satifaz o critério de segurança.
P 1 requisita (1,0,2) Verifique que Request Available (isto é, (1,0,2) (3,3,2) true. Allocation Need Available A B C A B C A B C P 0 0 1 0 7 4 3 2 3 0 P 1 3 0 2 0 2 0 P 2 3 0 1 6 0 0 P 3 2 1 1 0 1 1 P 4 0 0 2 4 3 1 Executando o algoritmo, obtemos que a sequência < P 1, P 3, P 4, P 0, P 2 > satisfaz o critério de segurança.
Exercício Requisição (3,3,0) por P 4 pode ser realizada? Requisição (0,2,0) por P 0 pode ser realizada?
Detecção de impasses Permitir que o sistema entre em um estado de impasse e recuperá-lo.
Detecção de impasses Permitir que o sistema entre em estado de impasse Detectar Recuperar um estado seguro
Única instância Gerar um grafo waiting-for Nós: processos Pi ->Pj, Pi esperando por um recurso alocado por Pj Algoritmo de detecção de ciclos
Múltiplas instâncias M tipos de recursos no sistema Available: vetor de tamanho m. Indica os recursos disponíveis Allocation: matriz NxM. Número de recursos que cada processo tem alocado Request: matriz NxM. Matriz representa as requisições que estão em andamento.
Algoritmo de detecção de impasse 1. Work e Finish são vetores de tamanho M e N respectivamente Work= Available Finish[i]= false, se Allocation i!= 0, senão Finish[i]= true 2. Procurar um i, onde Finish[i]== false Request i <= Work Se um nenhum elemento i existe com essas condições, vá para o passo 4 3. Passo 3 Work= Work + Allocation Finish[i]= true Vá para o passo 2 4. Passo4 Se existe Finish[i] ==false, então o sistema está em estado de impasse. Os processos com Finish=false, estão em impasse.
Exemplo de detecção de deadlocks Processos P 0.. P 4 ; 3 tipos de recursos A (7 instâncias), B (2 instâncias), e C (6 instâncias). Estado do sistema no tempo T 0 : Allocation Request Available A B C A B C A B C P 0 0 1 0 0 0 0 0 0 0 P 1 2 0 0 2 0 2 P 2 3 0 3 0 0 0 P 3 2 1 1 1 0 0 P 4 0 0 2 0 0 2 Seqüência <P 0, P 2, P 3, P 1, P 4 > resultará Finish[i] = true para todo i.
Deadlock P 2 requisita uma instância adicional do recurso C. Request A B C P 0 0 0 0 P 1 2 0 2 P 2 0 0 1 P 3 1 0 0 P 4 0 0 2 Estado do sistema? Pode utilizar os recursos de P 0, porém insuficiente para satisfazer as outras requisições. Um impasse existe no sistema, com os processos P 1, P 2, P 3, and P 4
Utilização do algoritmo de detecção de impasse Qual a freqüência para invocar o algoritmo Depende da utilização do sistema Se demorar muito, poderá ocorrer muitos ciclos Quantos processos devem retornar a um estado seguro para sair do estado de impasse? (um para cada ciclo)
Recuperação do impasse Finalizar processos Finalizar todos os processos no estado de impasse Eliminar um processo por vez, até que o impasse seja finalizado Em qual ordem? Prioridade Utilização dos recursos Tempo de execução Preempção de recursos