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
Download

Document