Sistemas Operacionais
Aula Passada
• Sincronismo • Seção Crítica • Semáforos • Monitores • Implementação em Java–Trecho de uma lei (Kansas, início do século XX)
“Quando dois trens se aproximarem um do
outro, em um cruzamento, ambos deverão
parar completamente e nenhum deverá dar
partida novamente até que o outro tenha
passado”
Deadlock
• Um deadlock acontece quando um processo em
espera precisa de um recurso de um outro processo também em espera para continuar.
Deadlock
• Condições necessárias para acontecer um deadlock • Exclusão mútua
• Manter e esperar • Não preempção • Espera circular
• Para acontecer um deadlock todas as quatro
Deadlock
• Exclusão mútua: apenas um processo por vez pode usar um
determinado recurso
• Manter e esperar: um processo com pelo menos um recurso está
esperando recursos adicionais que estão com outros processos
• Não preempção: um recurso só pode ser liberado
voluntariamente pelo processo que retém, depois desse processo ter concluído a tarefa.
• Espera circular: existe um conjunto {P0, P1, … , Pn} de
processos esperando, de modo que P0, aguarda um recurso retido por P1, P1 aguarda um recurso retido por P2, …, Pn-1 aguarda um recurso de Pn, que aguarda um recurso de P0.
Deadlocks
• Os deadlocks podem ser descritos por meio de um grafo de
alocação de recursos.O grafo consistem em um conjunto de arestas (A) e vértices (V).
• V pode ser de dois tipos: P (Processo) ou R (Recursos)
• A pode ser de dois tipos:
• Aresta de requisição: P —> R
• Um processo P requisitou uma instância do recurso R
• Aresta de atribuição: R —> P
Deadlocks
P1 P2 P3
R1 R2
Deadlocks
• Se o grafo não contém ciclos, não há deadlocks • Se o grafo contém um ciclo:
• Se há apenas uma instância por recurso, então
há deadlock
• Se existem muitas instâncias por recurso, há a
Deadlocks
P1 P2 P3
R1 R2
R3 R4
Deadlocks
P1 P2 P3
R1 R2
R3 R4
Deadlocks
P1 P2 P3 R1 R2 E agora? P4Métodos para tratamento de
deadlocks
• Podemos lidar com o problema de deadlocks de três
maneiras:
• Podemos usar um mecanismo para prevenir ou
evitar deadlocks, garantindo que o sistema nunca
vai entrar em deadlock
• Podemos permitir que o sistema entre em deadlock
e só depois detectá-lo e recuperar o sistema
• Podemos ignorar o problema e fingir que os
Métodos para tratamento de
deadlocks
• A terceira solução é a mais utilizada
• O tratamento do deadlock fica a cargo do
programador dos aplicativos
• Ele deve construir soluções para que seu
programa não entre em deadlock
• Deadlocks são pouco frequentes. Sendo assim, a
Prevenção de Deadlock
• Podemos prevenir o deadlock se garantirmos que pelo
menos uma das condições não irá acontecer
• Relebrando: Para acontecer um deadlock, o sistema tem
que garantir as quatro condições:
• exclusão mútua, • manter e espera, • não preempção, • espera circular
Prevenção de Deadlock
• Exclusão mútua: não deve ser requerida para recursos
compartilháveis; mas deve manter para recursos não compartilháveis
• Manter e espera: é preciso garantir que, sempre que um
processo solicite um recurso, ele não mantenha outros recursos.
• O processo pode solicitar todos os recursos antes de
ser executado ou permitir que o processo solicite recursos apenas se não tiver nenhum
Prevenção de Deadlock
• Não-preempção:
• se um processo que possui recursos solicitar outros
recursos que não podem ser alocados a ele
imediatamente, então todos os recursos devem ser liberados (sofrem preempção)
• os recursos que sofreram preempção são adicionados a
uma lista de recursos pelos quais o processo está esperando
• o processo só é retomado se puder alocar novamente os
Prevenção de Deadlock
• Espera circular:
• Uma solução para que a espera circular nunca
aconteça é determinar uma ordem sobre todos os tipos de recursos e exigir que cada processo solicite recursos em ordem ascendente de
Evitar Deadlocks
• O problema da abordagem anterior é que ela
causa efeitos colaterais como a baixa utilização de dispositivos, throughput reduzido de sistema e
potencial paralisação dos processos.
• Um método para evitar deadlocks é exigir que os
processo forneçam informações adicionais sobre como os recursos serão solicitados.
Evitar Deadlocks
• O modelo mais simples deste algoritmo requer que
cada processo declare o número máximo recursos que serão necessários.
• Sabendo desta informação, é possível criar um
algoritmo que garanta que o sistema nunca entrará em um estado de deadlock
• Podemos fazer isso utilizando o modelo de grafos
Evitar Deadlocks
P1 P2
R1
R2
Aresta de Demarcação!
indica que um P pode solicitar R em algum momento
Evitar Deadlocks
• Vamos supor que P solicite o recurso R. O pedido só
pode ser concedido se a convenção da aresta de
pedido (P —> R) em uma aresta de atribuição (R —> P) não forme um ciclo no grafo de alocação de recursos.
• Se não existir ciclos, a alocação do recurso deixará o
sistema em um estado seguro. Se um ciclo for
encontrado, dizemos que o sistema está me um estado inseguro.
• Neste último caso, o processo P deve esperar que seus
Evitar Deadlocks
P1 P2
R1
Evitar Deadlocks
P1 P2
R1
Detecção de Deadlocks
• Se um sistema não implementa métodos paraprevenir deadlocks ou para evitar deadlocks, deve fornecer:
• Um algoritmo que examine o sistema e
determine se ocorreu um deadlock
• Um algoritmo para recuperar o sistema após o
Detecção de Deadlock
• Se cada recurso possui apenas uma instância podemos definir um algoritmo de detecção de deadlocks utilizando uma variante do grafo de
alocação de recursos, denominada de grafo de espera. • Um deadlock vai existir se e somente se o grafo de
espera possuir um ciclo.
• Para detectar deadlocks o sistema precisa manter o
grafo de espera e periodicamente chamar um algoritmo que procura um ciclo no grafo.
Detecção de Deadlock
Uma aresta Pi a Pj implica que o processo Pi está esperando o processo Pj liberar um recurso.
Detecção de Deadlock
• Quando chamar uma algoritmo de detecção?
• Essa resposta depende de dois fatores: (1) com que frequência
um deadlock tende a ocorrer e (2) quantos processo serão afetados.
• A partir daí podemos definir diferentes metodologias para chamar
o algortimo.
• Chamar toda hora implica em um custo adicional ao sistema
• Definir intervalos para que o algoritmo seja chamado
• Exemplo: Uma vez por hora ou quando o uso da CPU cair
Recuperação de um
Deadlock
• Uma vez que identificamos um deadlock, o que
fazer em seguida?
• Uma alternativa é deixar que o sistema se
recupere automaticamente do deadlock:
• Abortar um ou mais processos para
interromper a espera circular
• Fazer uma preempção de recursos de um ou
Recuperação de um
Deadlock
• Término de Processos!
• Abortar todos os processo em um deadlock
• Abortar um processo de cada vez até eliminar o
ciclo de deadlock
• Ambas soluções trazem prejuízos ao sistema.
• Encerrar um processo no meio da sua execução
Recuperação de um
Deadlock
• Término de Processos!
• Para o caso em que um processo é finalizado
por vez, precisamos analisar que processo escolher para encerrar
• Devemos analisar diversos fatores:
• Prioridade do processo, tempo do processo,
tempo restante, recursos utilizados, recursos restantes, etc
Recuperação de um
Deadlock
• Preempção de Recursos!
• Para eliminar deadlocks utilizando essa abordagem, fazemos
preempção sucessiva de diversos recursos e repassamos esses recursos a outros processos até que o ciclo de deadlock seja
quebrado.
• Para isso precisamos levar algumas questões em consideração: • Seleção de uma vítima: que recursos e processos devem ser
submetidos a preempção?
• Rollback: O que fazer com o processo que sofreu preempção? • Starvation: evitar que sempre o recurso do mesmo processo sofra