Você está na página 1de 17

ENGENHARIA INFORMÁTICA E TELECOMUNICAÇÕES

Sistemas operativos

Threads e Deadlocks

DISCENTES:
Shámelah Hamino Omar
Nayara Aly
Shanaya Badru
Yasser Issá
Yunasse Bacar

SALA: B307

DOCENTE: Juvencio

MAPUTO

1
Índice
1. Introdução
1.1.Conceito de Thread
1.2.Uso de Thread
1.3.Implementação de Thread
1.4.Escalonamento de Thread
2. Deadlock
2.1.Detecção Deadlock
2.2.Recuperação de Deadlock
2.3.Recuperação de Deadlock
2.4.Evitação de Deadlock
2.5.Modelagem e simulação de Deadlock
3. Conclusão
4. Bibliografia

2
1. Introdução
Em ambientes computacionais complexos, como sistemas operacionais multitarefa e redes de
computadores, a ocorrência de deadlock representa um desafio significativo. Deadlock, ou
impasse, é uma situação em que um conjunto de processos fica bloqueado, incapaz de
prosseguir devido à falta de recursos necessários. Esse problema pode resultar em sérias
consequências, como a paralisação de um sistema inteiro ou a perda de desempenho em redes
de comunicação.
A detecção e resolução de deadlock são questões cruciais para garantir a disponibilidade e a
eficiência de sistemas computacionais. A detecção envolve a identificação de impasses em
tempo de execução, enquanto a resolução busca encontrar soluções para liberar os recursos
alocados e permitir que os processos avancem. Essas estratégias são fundamentais para
manter a estabilidade e a produtividade dos sistemas, minimizando interrupções indesejadas.
Neste trabalho, exploraremos os fundamentos da detecção de deadlock, analisando as
abordagens e técnicas utilizadas para identificar a presença desse impasse em sistemas
computacionais. Investigaremos algoritmos baseados em grafos e estados, que permitem
modelar o comportamento dos processos e a alocação de recursos. Além disso, examinaremos
os mecanismos embutidos em sistemas operacionais e redes que facilitam a detecção de
deadlock.
Também discutiremos a importância da prevenção e da recuperação de deadlock, abordando
estratégias para evitar a ocorrência desses impasses e propor soluções eficazes para recuperar
sistemas afetados. Serão exploradas práticas recomendadas e diretrizes para minimizar os
riscos e os impactos causados por deadlock.
Ao compreender e dominar as técnicas de detecção de deadlock, os profissionais de
tecnologia da informação poderão projetar e manter sistemas resilientes, capazes de lidar com
os desafios inerentes à concorrência de recursos em ambientes computacionais complexos.

3
Threads e Deadlocks
Threads e deadlocks estão intimamente relacionados no contexto da programação
concorrente.
Uma thread é uma sequência de instruções que pode ser executada independentemente por
um sistema operacional. Múltiplas threads podem ser executadas simultaneamente,
compartilhando recursos e melhorando a eficiência do sistema.
Um deadlock ocorre quando duas ou mais threads ficam bloqueadas, incapazes de avançar
porque cada uma está esperando por um recurso que está sendo mantido por outra thread no
mesmo conjunto. Em outras palavras, é uma situação em que duas ou mais threads estão
presas em uma dependência circular, impedindo que qualquer uma delas prossiga.
Os deadlocks são causados pelas seguintes condições, conhecidas como as quatro condições
de Coffman:
 Exclusão Mútua: Pelo menos um recurso deve ser mantido em modo não
compartilhável. Isso significa que apenas uma thread pode acessar o recurso de cada
vez.
 Espera e Retenção: Uma thread que possui um recurso pode solicitar recursos
adicionais sem liberar os recursos que já possui. Essa condição pode levar a uma
situação em que várias threads estão esperando que outros threads liberem recursos.
 Sem Preempção: Recursos não podem ser retirados à força de uma thread. Apenas a
thread que possui um recurso pode liberá-lo voluntariamente.
 Espera Circular: Deve existir uma cadeia circular de duas ou mais threads, em que
cada thread está esperando por um recurso mantido por outra thread na cadeia.
Quando todas essas condições são atendidas, pode ocorrer um deadlock, fazendo com que as
threads envolvidas fiquem impossibilitadas de prosseguir e, potencialmente, levando a um
congelamento ou falha do programa.
Para evitar deadlocks, é necessário um cuidadoso projeto e sincronização de programas
concorrentes. Algumas técnicas comuns para evitar deadlocks incluem:
 Ordenação de Recursos: Definir uma ordem estrita para aquisição de recursos para
evitar esperas circulares. As threads devem adquirir recursos em uma ordem pré-
determinada, garantindo consistência e evitando possíveis deadlocks.
 Estratégia de Alocação de Recursos: Utilizar técnicas como reserva de recursos, em
que as threads solicitam e adquirem todos os recursos necessários de uma vez, ou
preempção de recursos, em que threads de maior prioridade podem retirar recursos de
threads de menor prioridade.
 Detecção e Recuperação de Deadlocks: Implementar algoritmos para detectar
periodicamente deadlocks em um sistema e tomar ações apropriadas para se recuperar
deles. Isso po

 de envolver a liberação de recursos, a terminação e reinício de threads ou a


notificação de componentes de níveis superiores para lidar com o deadlock.

4
 Sincronização e Bloqueio: O uso adequado de mecanismos de sincronização, como
locks, semáforos e mutexes, pode ajudar a prevenir deadlocks, garantindo acesso
mutuamente exclusivo a recursos compartilhados. Um design cuidadoso e
consideração de padrões de sincronização são necessários para evitar deadlocks.
É importante observar que, mesmo com medidas preventivas, deadlocks ainda podem ocorrer
em sistemas complexos. Portanto, é crucial analisar e projetar.

1.1 Sumário Conceitual de Thread

Processos em Unix
Em Unix e SOs dele derivados, como Linux, um processo dispõe essencialmente dum
computador virtual: a maioria dos recursos usados por um processo é reservado para seu uso
exclusivo; cada processo usa a sua própria memória, a qual, por omissão, não é partilhada
com outros processos.
Um processo pode ser visto como: Uma máquina virtual para execução de programas em vez
de Um programa em execução.

Comunicação entre Processos em Unix


A comunicação entre processos em Unix não é fácil:
 O processo pai pode passar alguma informação antes de criar o processo filho;
 O processo filho só pode retornar informação (e muito limitada) ao processo pai
quando termina;
 Sincronização entre processos só entre o pai e os seus filhos
. Suporte de memória partilhada entre processos pelo SO:
+ facilita a cooperação entre processos;
− não é muito conveniente de usar;
− é relativamente ineficiente, já que requer a intervenção do SO para sincronização.

Threads a grosso modo, enquanto que um processo corresponde à execução dum programa, um thread
corresponde à execução duma função. Em SOs mais recentes, um processo pode incluir mais do que
um thread.

5
Partilha de recursos com Threads
Threads dum mesmo processo podem partilhar a maior parte dos recursos, com excepção da stack e
do estado do processador

Estado dum Thread


Tal como um processo, um thread pode estar num de 3 estados:

A informação específica a manter por cada thread é relativamente reduzida:

 O seu estado (pode estar bloqueado à espera dum evento);


 O estado do processador (incluindo o SP e PC);
 A stack.
Operações tais como:

 Criação/terminação;
 Comutação.

6
de threads dum mesmo processo são muito mais eficientes do que operações semelhantes sobre
processos.

1.1.
1.2. Uso de Threads
Threads dum mesmo processo podem partilhar muitos recursos, incluindo o espaço de
endereçamento: são particularmente apropriados para aplicações consistindo em actividades
concorrentes. Por exemplo: servidor da Web: Recebe e processa pedidos de páginas da Web; As
páginas da Web são ficheiros guardados em disco; Mantém as páginas acedidas mais recentemente
em memória, cache; Se a página pedida não estiver na cache, o servidor tem que ir ao disco.

Servidor da Web: Comparação

1.3. Implementação de threads


Threads podem ser implementados:
1. directamente pelo SO (kernel-level threads);
2. por código que executa em user-level, i.e. acima do SO, (user-level threads)
1.3.1. Kernel-level Thread
O kernel suporta processos com múltiplos threads:
os threads são as “entidades” que disputam o
CPU; o SO mantém uma tabela de threads com a informação
específica a cada thread; o PCB dum processo aponta para a sua tabela de threads.
Todas as operações de gestão de threads, p.ex. criar umthread, requerem a execução de
chamadas ao sistema.

7
1.3.2. User-level Threads

O kernel não sabe da existência dos threads: são implementados inteiramente por uma
biblioteca em user-space; podem ser implementados num SO que não suporta threads.
Implementação de User-level Threads
A biblioteca de threads oferece funções que permitem: criar/terminar threads; sincronizar
entre threads; ceder o CPU a outros threads (yield);
A biblioteca executa a comutação entre threads e mantém uma tabela de threads enquanto que
as funções que encapsulam chamadas ao sistema que podem bloquear têm que ser alteradas
para evitar que todos os threads bloqueiem.
Algumas dificuldades: como executar chamadas ao sistema sem bloquear? e page-faults?
como evitar que um thread monopolize o CPU?
User-level vs. Kernel-level Threads
+ O SO não precisa suportar threads.
+ Evita a intervenção do kernel em muitas operações, p.ex. criação/terminação de threads e
comutação de threads.
− Page-fault por um thread bloqueia os restantes threads do processo.
− Incapazes de explorar paralelismo em arquitecturas multiprocessador

1.4. Escalonamento de Thread

 Quantum de cada processo de 50 ms.


 Cada thread executa em bursts de 5 ms.

8
2. Deadlock
2.1Detecção Deadlock.
A detecção de deadlock é uma técnica utilizada para identificar a ocorrência desse impasse e
tomar medidas adequadas para resolvê-lo.
Existem várias abordagens para a detecção de deadlock. Uma delas é o uso de algoritmos
baseados em grafos, como o algoritmo do banqueiro e o algoritmo do caminho mais longo.
Esses algoritmos modelam o sistema como um grafo direcionado, onde os processos são
representados por vértices e as alocações de recursos por arestas. Eles procuram por ciclos no
grafo, que indicam a presença de deadlock.
Outra abordagem é a utilização de algoritmos baseados em estados, como o algoritmo do
estado seguro. Nesse método, o sistema é representado como um conjunto de vetores que
representam o número de recursos disponíveis e alocados para cada processo. O algoritmo
verifica se existe uma sequência segura de alocação de recursos que permita que todos os
processos terminem suas tarefas.
Além disso, alguns sistemas operacionais possuem mecanismos embutidos de detecção de
deadlock. Esses mecanismos monitoram o uso de recursos pelos processos e, se detectarem
um impasse, podem tomar medidas como encerrar um ou mais processos envolvidos no
deadlock ou liberar recursos alocados.
A detecção de deadlock é um desafio complexo, pois envolve a análise do comportamento
dinâmico do sistema em tempo de execução. Além disso, a detecção por si só não resolve o
problema do deadlock, apenas o identifica. É necessário adotar estratégias de prevenção e
recuperação para lidar com o impasse, como o uso de algoritmos de alocação de recursos
seguros e a implementação de mecanismos de liberação de recursos em caso de deadlock.
Em resumo, a detecção de deadlock é uma técnica essencial para lidar com os problemas de
impasse em sistemas multitarefa. Através do uso de algoritmos baseados em grafos ou
estados, é possível identificar a presença de deadlock e adotar medidas adequadas para
resolver essa situação, evitando a paralisação completa do sistema.

2.2 Recuperação de Deadlock


A recuperação de deadlock é um processo utilizado para resolver situações de impasse
(deadlocks) em sistemas computacionais. Existem várias abordagens para a recuperação de
deadlocks. Vou descrever algumas das principais estratégias utilizadas:
Detecção e finalização de processos: Nessa estratégia, um algoritmo é executado
periodicamente para detectar a existência de deadlocks no sistema. Quando um deadlock é
identificado, um dos processos envolvidos no impasse é finalizado, liberando os recursos que

9
estava utilizando. Essa abordagem pode ser eficaz, mas pode levar à finalização de processos
importantes e causar perda de dados.
Prevenção de deadlocks: Nessa estratégia, são adotadas medidas para evitar a ocorrência de
deadlocks desde o início. Isso pode envolver o uso de algoritmos de alocação de recursos que
garantam que as solicitações de recursos não levem a situações de impasse. Essa abordagem é
mais complexa de implementar, mas pode eliminar completamente a ocorrência de
deadlocks.
Evitação de deadlocks: Essa estratégia é semelhante à prevenção de deadlocks, mas envolve
uma análise mais dinâmica das solicitações de recursos. Os recursos são alocados apenas se a
alocação não resultar em um deadlock iminente. Isso pode exigir um planejamento cuidadoso
e informações sobre os padrões de solicitação de recursos dos processos.
Recuperação por preempção: Nessa estratégia, os recursos são retirados de processos
envolvidos em um deadlock para permitir que outros processos progridam. Essa abordagem
requer um mecanismo para identificar quais recursos devem ser retirados e quais processos
serão afetados. A recuperação por preempção pode ser complexa e pode levar à reversão de
operações já concluídas.
Ordenação de recursos: Essa estratégia envolve a definição de uma ordem global para a
alocação de recursos. Os processos devem solicitar os recursos na mesma ordem em todos os
momentos para evitar a ocorrência de deadlocks. No entanto, essa abordagem pode ser difícil
de implementar e pode limitar a eficiência do sistema.
É importante ressaltar que a escolha da estratégia de recuperação de deadlocks depende do
sistema em questão e das suas necessidades específicas. Cada abordagem tem vantagens e
desvantagens, e a decisão deve levar em consideração fatores como desempenho,
confiabilidade e criticidade dos processos envolvidos.

2.3 Prevenção de Deadlock


Prevenção de Deadlock (negando uma das quatro condições necessárias): consiste em impor
restrições aos processos de forma que o deadlock seja impossível. Possibilidades de eliminar
as condições:
1) Exclusão Mútua: para alguns recursos é necessária a exclusão mútua, pois não pode haver
acesso por dois processos simultaneamente e nem sempre a técnica de spool pode ser
empregada. Portanto esta condição não pode ser eliminada.
2) Posse e Espera: uma forma de negar essa condição é fazer com que cada processo requisite
todos os recursos que irá necessitar antes de iniciar a execução. Se todos os recursos
estiverem disponíveis então ele é executado, senão, o processo deve aguardar. O problema é
que muitos processos não sabem com antecedência quais os recursos de que irão necessitar
até começar a execução e também os recursos não serão utilizados otimamente. Uma outra
forma de quebrar essa condição é fazer com que, para pedir um novo recurso, o processo
deva liberar temporariamente todos aqueles que possui e somente se conseguir o novo
recurso é que pode pegar os anteriores de volta.
3) Não preempção: essa condição não pode ser quebrada, pois tomar um recurso de um
processo para entregá-lo a outro gera confusão.

10
4) Espera circular: para evitar que se formem ciclos fechados no grafo de recursos devemos
fazer com que cada processo só possa ter um recurso por vez e se desejar outro, deve liberar o
que possui (isto impossibilitaria coisas simples como cópia de uma fita para outra) ou senão
podemos dar uma numeração global a todos os recursos e os processos só podem requisitar
recursos em ordem numérica crescente. O problema é que é difícil encontrar uma numeração
que satisfaça a maioria das possíveis condições de acesso.
Prevenção de Deadlock Atacando a Condição de Exclusão Mútua
• Alguns dispositivos (como uma impressora) podem fazer uso de spool [“fila”]
– o daemon de impressão é o único que usa o recurso impressora
– desta forma deadlock envolvendo a impressora é eliminado
• Nem todos os dispositivos podem fazer uso de spool
• Princípio:
– evitar alocar um recurso quando ele não for
absolutamente necessário
– tentar assegurar que o menor número possível de
processos possa de fato requisitar o recurso
Prevenção de Deadlock Atacando a Condição de Posse e Espera
• Exigir que todos os processos requisitem os recursos antes de iniciarem
– um processo nunca tem que esperar por aquilo que precisa
• Problemas
– podem não saber quantos e quais recursos vão precisar no
início da execução
– e também retêm recursos que outros processos poderiam estar usando
• Variação:
– processo deve desistir de todos os recursos
– para então requisitar todos os que são imediatamente necessários

2.4
E

vitação de Deadlock

11
A evitação de deadlock é uma técnica utilizada em sistemas de computação para prevenir a
ocorrência de deadlocks, que são situações em que um conjunto de processos fica bloqueado,
impossibilitado de progredir devido a conflitos na alocação de recursos.
Existem várias abordagens para a evitação de deadlocks. Alguns dos métodos comumente
usados incluem:
Algoritmo do banqueiro (Banker's Algorithm): Este algoritmo é baseado no conceito de que
cada processo deve declarar antecipadamente a quantidade máxima de recursos que irá
precisar durante sua execução. O sistema operacional, em seguida, verifica se a alocação
desses recursos não levaria a um estado de deadlock antes de concedê-los. Se a alocação não
resultar em um estado de deadlock, os recursos são atribuídos ao processo; caso contrário, o
processo deve esperar até que os recursos necessários estejam disponíveis.
Detecção de deadlock: Nesse método, o sistema operacional periodicamente verifica se um
estado de deadlock ocorreu. Para isso, é utilizado um algoritmo de detecção de deadlock,
como o algoritmo do caminho mais longo (Banker's Algorithm) ou o algoritmo de detecção
de ciclo (Cycle Detection Algorithm). Se um estado de deadlock é detectado, o sistema
operacional pode tomar medidas para resolvê-lo, como interromper um ou mais processos ou
liberar recursos alocados.
Prevenção de deadlock: A prevenção de deadlock envolve a criação de um conjunto de
políticas de alocação de recursos que garantam que os quatro requisitos necessários para a
ocorrência de deadlock (exclusão mútua, posse e espera, não preempção e espera circular)
nunca sejam satisfeitos simultaneamente. Essas políticas podem incluir a utilização de
recursos compartilhados apenas em uma ordem específica, alocação antecipada de recursos e
negação de solicitações de recursos que possam levar a um estado de deadlock.
Evitação de deadlock: Este método é uma extensão da prevenção de deadlock, onde um
sistema operacional permite que os processos solicitem recursos, mas verifica se a alocação
desses recursos levará a um estado de deadlock antes de concedê-los. Isso é feito utilizando
algoritmos como o algoritmo do banqueiro ou o algoritmo do caminho mais longo para
determinar se a alocação resultaria em um estado de deadlock. Se a alocação não causar um
deadlock, os recursos são atribuídos; caso contrário, o processo deve esperar.
É importante ressaltar que nenhuma abordagem de evitação de deadlock é perfeita e todas
têm suas limitações. Cada método tem suas vantagens e desvantagens, e a escolha da técnica
a ser utilizada depende das características e requisitos específicos do sistema em questão.

1.
2.
2.1.
2.2.
2.3.
2.4.
2.5. Modelagem e simulação de Deadlock

12
Um conjunto de processos está em deadlock se cada processo no conjunto está esperando por
um evento que apenas outro processo no conjunto pode causar. Como todos os processos
estão esperando, nenhum deles pode gerar o evento que o outro processo precisa, ou seja,
ficam em deadlock. Para que deadlocks ocorram, existem quatro condições necessárias:
* Exclusão mútua
* Posse e espera
* Não-preempção
* Espera circular

Quatro Condições para Deadlock;


Condição de exclusão mútua
•todo recurso está ou associado a um processo ou disponível
Condição de posse e espera
•processos que retêm recursos podem solicitar novos recursos
Condição de não preempção
•recursos concedidos previamente não podem ser forçosamente tomados
Condição de espera circular
•deve ser uma cadeia circular de 2 ou mais processos
cada um está à espera de recurso retido pelo
membro seguinte dessa.

13
14
15
3. Conclusão
A detecção de deadlock desempenha um papel crucial na manutenção da estabilidade e
eficiência dos sistemas computacionais. Neste trabalho, exploramos as abordagens e técnicas
utilizadas para identificar a presença de deadlock, bem como as estratégias de prevenção e
recuperação adotadas para lidar com esse impasse.
Através do uso de algoritmos baseados em grafos e estados, é possível modelar o
comportamento dos processos e a alocação de recursos, permitindo a detecção eficaz de
impasses. Além disso, os mecanismos embutidos em sistemas operacionais e redes auxiliam
na identificação de deadlock, facilitando a tomada de medidas corretivas.
No entanto, é importante ressaltar que a detecção de deadlock, por si só, não resolve o
problema. É necessário implementar estratégias de prevenção, como o uso de algoritmos de
alocação de recursos seguros, e estratégias de recuperação, como a liberação de recursos
alocados em caso de deadlock. Essas medidas visam evitar a ocorrência de impasses ou
mitigar seus efeitos, garantindo a disponibilidade contínua dos sistemas.
Para alcançar sistemas robustos e resilientes, é fundamental que os profissionais de
tecnologia da informação estejam cientes dos desafios associados ao deadlock e adotem as
melhores práticas disponíveis. A compreensão dos princípios de detecção, prevenção e
recuperação de deadlock permitirá a implementação de soluções eficientes e a manutenção de
ambientes computacionais confiáveis.
Em última análise, a detecção de deadlock é um aspecto essencial na garantia da
disponibilidade e do desempenho dos sistemas computacionais. Ao lidar com esse desafio de
forma proativa, as organizações podem minimizar os riscos de interrupções indesejadas e
promover um ambiente de trabalho eficiente e confiável para usuários e processos.

16
4. Bibliografia
* TANENBAUM, Andrew, “Sistemas operacionais Modernos”, 4 ediçao
* ROMAN, Norton , “Sistemas Operacionais Modernos”, 2 ediçao

17

Você também pode gostar