3. 15/07/14
Introdução:
● Os processos que cooperam entre si para executar uma
tarefa precisam se comunicar uns com os outros.
● A comunicação entre os processos deve ser feita de tal
modo que seja estruturada e independente de
interrupções.
● Devemos evitar que os processos interfiram uns com os
outros, um problema chamado de exclusão mútua.
4. 15/07/14
Problema:
● Um processo A alocou uma determinada área da
memória pra si.
● O que aconteceria se outro processo pudesse
alocar a mesma área da memória que o processo A
esta ocupando?
6. 15/07/14
Condições de corrida:
● Ocorre quando os processos
cooperantes precisam
compartilhar um recurso, que
ambos podem ler e gravar:
Um exemplo de recurso compartilhado, um
diretório de spooler, usado por um daemon
de impressão. Este diretório contém várias
entradas, numeradas por 1 e 2, …, sendo
que cada uma pode armazenar o nome de
um arquivo. O daemon percorre cada uma
das entradas sequencialmente, voltando para
a primeira entrada após a impressão do
arquivo da última entrada.
7. 15/07/14
●
Vimos um exemplo que é chamado de condição
de corrida (race condition):
– Ocorre quando dois ou mais processos acessam
um recurso compartilhado.
– O resultado das execuções dos processos
dependem da ordem em que os processos
executam no processador.
– Somente algumas ordens de execuções do
processo não geram os resultados corretos.
Condições de corrida:
8. 15/07/14
● A detecção da existência de uma condição de
corrida em um conjunto de processos
cooperantes é complicada.
● Para solucionar o problema de condição de
corrida, deveremos usar o conceito de exclusão
mútua através do uso de seções críticas.
Condições de corrida:
9. 15/07/14
Seções críticas:
● Podemos também ver o problema da condição de
corrida a partir da seguinte visão abstrata:
– Ou o processo está executando um código que
não acessa nenhum dos recursos compartilhados
com outros processos.
– Ou processo está executando um código que lê
e/ou altera um dos recursos compartilhados com
outros processos.
10. 15/07/14
● O código do processo que acessa um recurso
compartilhado com outros processos é chamado
de seção crítica ou região crítica.
● As condições de corrida serão evitadas somente se
cada processo executar a sua seção crítica em um
intervalo de tempo diferente.
Seções críticas:
11. 15/07/14
● Para que a cooperação entre os processos seja eficiente, além de
correta, devemos garantir as seguintes condições:
– Dois ou mais processos não podem executar ao mesmo tempo
as suas seções críticas.
– Não podemos fazer nenhuma suposição sobre a velocidade de
execução ou do número de processadores.
– Um processo que não está executando sua seção crítica não
pode bloquear outro processo.
– Um processo deve ser sempre capaz de executar a sua seção
crítica em um intervalo de tempo finito.
Seções críticas:
12. 15/07/14
● Para que somente um processo possa entrar na sua seção crítica
devemos usar as primitivas de exclusão mútua.
● Um meio de obtermos a exclusão mútua é através do uso das
propostas baseadas em espera ocupada.
– O processo fica esperando até que possa acessar a seção crítica.
– A grande desvantagem desse método pode ser o desperdício de
tempo do processador.
– Estratégias:
● Desabilitar interrupções.
● InstruçãoTSL.
Exclusão Mútua:
13. 15/07/14
●
O processo desabilita as interrupções ao entrar
na seção crítica, e as reabilita ao sair da seção
crítica.
●
Como as interrupções estão desabilitadas, o
escalonador não será capaz de parar a execução
do processo.
●
A proposta não é adequada, pois se o processo
não reabilitar as interrupções, o sistema irá parar
de funcionar.
Desabilitando interrupções:
14. 15/07/14
Desabilitando interrupções:
● A proposta não funciona se existe mais de um
processador (ou núcleos), pois o processo
somente afeta o processador que o está
executando.
● A conclusão é que esta proposta não é adequada
para a exclusão mútua, devendo somente ser
usada dentro do núcleo do sistema.
15. 15/07/14
InstruçãoTSL*:
● Comum em computadores com multiprocessadores.
● A instrução, cujo formato geral éTSL RX, lock, onde
RX é um registrador e lock uma posição da memória:
– Lê o conteúdo da posição lock, e o coloca no
registrador RX.
– Depois grava, na posição lock, um valor diferente de
zero.
* TSL – Test and Set Lock
16. 15/07/14
● A execução da instrução é atômica, ou seja,
indivisível:
– O processador bloqueia o barramento da memória
até executar as duas operações.
– Nenhum outro processador poderá acessar a posição
lock, até que o barramento seja desbloqueado
● Como a posição de ler a memória e armazenar um
valor não nulo é atômica, a exclusão mútua é
garantida.
InstruçãoTSL:
17. 15/07/14
Exclusão Mútua:
● Vamos agora estudar a seguinte proposta
alternativa, que irá bloquear o processo, em
vez de utilizar espera ocupada, se este não
puder acessar a sua seção crítica:
– Semáforos.
18. 15/07/14
Produtor x Consumidor:
● Neste problema dois processos, o produtor e o consumidor,
compartilham o buffer:
– O processo produtor deposita novas informações no buffer, a
não ser que este esteja cheio.
– O processo consumidor retira as informações do buffer, a não
ser que este esteja vazio.
19. 15/07/14
Semáforo:
● Em 1965, o matemático holandês Edsger Dijkstra
propôs um mecanismo de coordenação eficiente e
flexível para o controle da exclusão mútua entre n
tarefas: o semáforo.
● Apesar de antigo, o semáforo continua sendo o
mecanismo de sincronização mais utilizado na
construção de aplicações concorrentes, sendo usado de
forma explícita ou implícita.
20. 15/07/14
Semáforos:
● Esta proposta usa uma variável inteira chamada
semáforo, e uma fila associada a esta variável:
– O valor do semáforo indica quantas vezes ele pode
ser decrementado sem que o processo seja
bloqueado.
– A fila contém os processos que foram bloqueados
ao tentar decrementar o semáforo.
● São definidas duas operações sobre um
semáforo: P eV ( waint and signal; up and down;
etc ):
21. 15/07/14
Semáforo:
● Para mais detalhes sobre semáforos, leia
a página 77 do livro:
– Sistemas Operacionais Modernos; 3ª edição –
Andrew S.Tanenbaum.