Você está na página 1de 32

Sistemas Operacionais

Processos e Threads – Parte III

Prof. Tiago Wirtti

1
Introdução aos Sistemas
Operacionais
Este material tem como base as
seguintes fontes:
– TANENBAUM. Sistemas Operacionais Modernos,
2ª Edição – Capítulo 2;
– OLIVEIRA; CARISSIMI; TOSCANI. Sistemas
Operacionais. 2ª Edição – Capítulo 2;
– Deitel, Deitel e Choffnes. Sistemas Operacionais –
Capítulos 3, 4, 5, 6 e 8.
– www.prenhall.com/tanenbaum_br
– pt.wikipedia.org/wiki/Sistemas_operacionais
2
Capítulo 2
Processos e Threads

2.1 Processos
2.2 Threads
2.3 Comunicação interprocessos (IPC)
2.4 Escalonamento

3
Programação Sequencial
• Características: • Exemplo: Impressão SEM
– Programa executado por apenas um concorrência
processo – Disco OU impressora
– Existe apenas um fluxo de controle – Desperdício de
– Em um sistema operacional recursos, pois o
programado de forma seqüencial não processo fica bloqueado
seria possível escutar várias tarefas pelo disco ou preso à
ao mesmo tempo! impressora

4
Programação Concorrente
• Características: • Exemplo: Impressão COM concorrência
– Programa executado por
vários processos que
cooperam entre si para
realizar uma tarefa
(aplicação)
– Existem vários fluxos de
controle
– Necessidade de interação
para troca de informações
(sincronização)

5
Programação Concorrente
Vantagens: Desvantagens:
• Explorar o paralelismo real • Programação complexa
• Sobreposição de operações • Aspecto não-determinístico
de E/S com processamento dificulta a depuração de
• Facilita o desenvolvimento de programas
aplicações que possuem • Erros típicos da programação
paralelismo intrínseco sequencial se somam à
complexidade da programação
concorrente

6
Comunicação Interprocessos
Região Crítica

• Parte do código de um processo que


acessa uma estrutura de dados
compartilhada com outros processos

Recurso
compartilhado

7
Comunicação Interprocessos
Exclusão Mutua

Exclusão mútua usando regiões críticas


8
Programação concorrente e Região
crítica
Requisitos da Programação Problema da região crítica:
Concorrente: • Garantir que, quando um
• Eliminar condições de processo está executando
corrida sua região crítica,
nenhum outro processo
• Criação de um protocolo
entre na sua respectiva
que permita que processos
região crítica
cooperem entre si sem
afetar a consistência dos
dados
• Controle de acesso à região
crítica (garantir a exclusão
mútua)

9
Integridade da Região Crítica
Quatro condições necessárias para prover
exclusão mútua:
1. Nunca dois processos simultaneamente em
uma região crítica
2. Nenhuma afirmação sobre velocidades ou
números de CPUs
3. Nenhum processo executando fora de sua
região crítica pode bloquear outros processos
4. Nenhum processo deve esperar eternamente
para entrar em sua região crítica

10
Abordagens Incorretas e Triviais ao
Problema de Região Crítica
Abordagens incorretas: Abordagens triviais:
• Adiar indefinidamente a • Desabilitar interrupções
execução de um ou mais • Usar variáveis de
processos travamento
• Colocar processos em • Alternância de execução
deadlock (o que é isso?)

11
Desabilitando Interrupções (1)
Conceito:
– Desabilitar interrupções antes de entrar na região crítica e habilitar
logo depois de sair da seção crítica
– Programador deve lembrar de habilitar interrupções depois de sair
da RC

In digital computers, an interrupt is an


input signal to the processor indicating
an event that needs immediate attention.
An interrupt signal alerts the processor
and serves as a request for the
processor to interrupt the currently
executing code, so that the event can be
processed in a timely manner.
Ref.: From Wikipedia, the free encyclopedia
(interruption), accessed in 14/05/2020.

12
Desabilitando Interrupções (1)
Vantagens: Desvantagens:
– Muito utilizada em sistemas – Elimina a proteção contra ações
embutidos (automóveis, dos processos usuários
eletroeletrônicos, aeronaves e – Periféricos ficam “desabilitados”
etc) durante a execução das RCs
– Fácil implementação – E para processadores com
vários núcleos?
In computing, Intel’s Advanced Programmable
Interrupt Controller (APIC) is a family of
interrupt controllers. As its name suggests, the
APIC is more advanced than Intel’s 8259
Programmable Interrupt Controller (PIC),
particularly enabling the construction of
multiprocessor systems. It is one of several
architectural designs intended to solve interrupt
routing efficiency issues in multiprocessor
computer systems.
Ref.: From Wikipedia, the free encyclopedia
(interruption), accessed in 12/05/2020.
13
Solução 2: Variáveis de
Travamento (1)
lock == 0 (RC livre)
Mecanismo:
lock == 1 (RC ocupada)
O que ocorre quando
há uma interrupção
while (lock == 1) /* espera */; logo depois do while?
lock = 1 ; // antes da RC
// região crítica
lock = 0; // depois da RC

14
Variáveis de Travamento (2)
• Vantagem
– Fácil implementação
• Desvantagem
– Não evita condições de corrida
• Exercício:
– Pesquisando na bibliografia
descubra uma situação em que
as variáveis de travamento
causam condição de disputa

15
Soluções Não Triviais para o
Problema de Região Crítica
• Algorítmica
1. Solução de Peterson*
• Primitivas
2. Mutex
3. Sleep Wakeup
4. Semáforos
5. Monitor
16
Solução 2: Instrução TSL ou Spin lock (1)
a. É uma solução tipo Mutex
b. Depende de implementação
Mecanismo: de instrução de hardware
c. Dois estados:
lock = 0; // inicio 0: livre
//.... 1: ocupado

do { Instrução Swap(reg, mem):

reg = 1; aux = [mem]


[mem] = reg
swap(reg, lock); reg = aux

} while (reg == 1)
// código da RC
lock = 0;
17
Solução 2: Instrução TSL ou Spin lock (2)
• Vantagens
– Simplicidade de implementação
– Não precisa desabilitar interrupções

• Desvantagens
– Causa espera ocupada
– Confiar no programador (fazer “lock”
e “unlock” corretamente)
– Problema da prioridade invertida:
pode causar postergação indefinida
(como seria???)

18
Solução 2: Instrução TSL ou Spin lock (3)
Entrando e saindo de uma região crítica usando a instrução TSL

19
Problema da
Prioridade
Invertida

P1 = alta prioridade
P2 = baixa prioridade
P1 roda sempre que
estiver APTO

20
Solução 3: SLEEP & WAKEUP (1)
• Utilizar primitivas SLEEP e WAKEUP
– SLEEP: bloqueia o processo que não consegue
acessar a sua seção crítica
– WAKEUP: ativa o processo bloqueado, uma vez que
o recurso (processador) está disponível

21
Solução 3: SLEEP & WAKEUP (2)
Problema do produtor-consumidor com uma condição de disputa fatal

22
Solução 4: Semáforos (1)
Criada por Dijkstra em 1965
Duas primitivas:
down(){
- P = (Proberen=testar) = down
S.valor = S.valor – 1; - V = (Vehogen=incrementar) = up
Se S.valor < 0 Então Semáforo é um tipo abstrato de dados
Bloqueia P - Um valor inteiro (S.valor)
Insere P em S.fila - Uma fila de processos (S.fila)

Fim se É necessário garantir atomicidade no


incremento (decremento) da variável
}
S.valor

23
Solução 4: Semáforos (2)
Tipos de Semáforos:
a) Binários: A variável S.valor pode
up(){
ser 1 (liberado) ou 0 (espera)
S.valor = S.valor + 1; b) Contadores: A variável S.valor
Se S.valor <= 0 Então pode assumir qualquer valor (1, 0
ou negativo)
Retira P de S.fila
No caso do semáforo contador, a
Acorda P variável S.valor (quando negativa)
Fim se conta quantos processos estão em
} S.Fila (aguardando a liberação da RC)

24
Solução 4: Semáforos (1)
down(){
S.valor = S.valor – 1;
Se S.valor < 0 Então
Bloqueia P
Insere P em S.fila
Fim se
}
up(){
S.valor = S.valor + 1;
Se S.valor <= 0 Então
Retira P de S.fila
Acorda P
Fim se
} 25
Solução 4: Semáforos (5)
• Para sistemas monoprocessados:
– Para garantir a atomicidade de P e V, pode-se desabilitar
interrupções
– As primitivas P e V devem ser implementadas como chamadas
ao sistema (porque?)

• Para sistemas multiprocessados:


– Desabilitar interrupções não é suficiente para garantir a
atomicidade de P e V
– A solução é considerar P e V como RCs do SO e executá-las
com Spin lock (TSL)

26
Semáforos X Mutex
• Semáforo:
– Primitivas P e V podem ser executadas por
processos diferentes
– Não apresenta espera ocupada, mas o seu mau uso
pode causar deadlock
• Mutex:
– As primitivas lock e unlock são executadas
necessariamente por um mesmo processo
– Apresenta espera ocupada

27
Monitores (1)
• Características:
– Unidade básica de sincronização de alto nível
– Coleção de procedimentos, variáveis e estruturas de dados
agrupados em um tipo especial de módulo ou pacote
– Evita potenciais deadlocks que poderiam ocorrer por falhas de
programação
– Os processos podem chamar os procedimentos em um monitor
quando quiserem, mas não podem ter acesso direto às estruturas
internas de dados ao monitor a partir de procedimentos declarados
fora do monitor
– Somente um processo pode estar ativo em um monitor em um dado
momento
– Se algum processo (P1) estiver no monitor, o processo (P2) que o
chamou será suspenso até que P1 deixe o monitor
– Se nenhum processo estiver usando o monitor, o processo que o
chamou poderá entrar.
28
Monitores (2)

Exemplo de um monitor 29
* Monitores (3)
• Delineamento do problema do produtor-consumidor com monitores
– somente um procedimento está ativo por vez no monitor
– o buffer tem N lugares

30
Jantar dos Filósofos (1)

• Filósofos comem/pensam
• Cada um precisa de 2
garfos para comer
• Pega um garfo por vez
• Como prevenir deadlock

31
Leituras complementares:
• Leitura: OLIVEIRA; CARISSIMI; TOSCANI.
Sistemas Operacionais. 2ª Edição, Editora
Sagra-Luzzato, Porto Alegre, Novembro,
2001 – Capítulo 2;
• Leitura: Tanenbaum; Sistemas Operacionais
Modernos. 2ª Edição – Capítulo 2 (págs. 60
– 73).

32