Você está na página 1de 8

1

Sistemas Operacionais Sistemas Operacionais


Processos
Excluso Mtua
2 Comunicao e Sincronizao Eduardo Nicola F. Zagari
Mecanismos para se Mecanismos para se
Obter Excluso M Obter Excluso M tua tua
Mecanismos de Hardware:
Inibio de Interrupes
Instruo TSL (Test and Set Lock)
Mecanismos de Software:
Com Espera Ocupada:
Variveis de Travamento (Lock Variables)
Alternncia Estrita
Soluo de Peterson
Sem Espera Ocupada:
Dormir e Acordar (Sleep and Wakeup)
Semforos
Contadores de Eventos
Monitores
Troca de Mensagens
2
3 Comunicao e Sincronizao Eduardo Nicola F. Zagari
Inibi Inibi o das Interrup o das Interrup es es
Soluo mais simples
Desabilitam-se todas as interrupes aps se entrar na regio
crtica ao sair, reabilitam-nas
Se as interrupes no ocorrem, o processo no pode sofrer
preempo
Problema 1: ... e se o processo no reabilitar as interrupes?
Problema 2: se o sistema tem 2 CPUs e somente uma tem as
interrupes inibidas, a outra pode acessar a memria
compartilhada
Por outro lado, muito conveniente que o kernel possa
desabilitar as interrupes para atualizar variveis ou listas
Concluso: soluo adequada para o kernel, mas no para
processos de usurio
4 Comunicao e Sincronizao Eduardo Nicola F. Zagari
Instru Instru o TSL ( o TSL (Test Test and and Set Set Lock Lock) )
Instruo especial que permite ler uma varivel, armazenar seu
contedo em uma outra rea e atribuir um novo valor a esta
varivel (hardware)
uma instruo indivisvel: executada sem interrupo
Varivel compartilhada flag: quando flag = 0, qualquer processo
pode faz-la igual a 1 (instruo TSL)
3
5 Comunicao e Sincronizao Eduardo Nicola F. Zagari
(cont.) Instru (cont.) Instru o TSL o TSL
enter_region:
tsl register, flag | copia flag p/
| registrador e faz flag = 1
cmp register, #0 | o flag zero?
jnz enter_region | se no,lock e setado;loop
ret | retorna, entrou na R.C.
leave_region:
mov flag, #0 | guarda um 0 em flag
ret | retorna a quem chamou
6 Comunicao e Sincronizao Eduardo Nicola F. Zagari
Vari Vari veis de veis de
Travamento ( Travamento (Lock Lock Variables Variables) )
Define-se uma nica varivel compartilhada, inicialmente com
valor zero
Se um processo deseja entrar na regio crtica, ele testa a
varivel. Se ela for 1 (recurso liberado), ela feita 0 (recurso
trancado) e o processo entra. Caso contrrio, o processo
aguarda at que o valor da varivel seja 1 (um)
4
7 Comunicao e Sincronizao Eduardo Nicola F. Zagari
(cont.) Vari (cont.) Vari veis de Travamento veis de Travamento
x = 0, recurso trancado
x = 1, recurso liberado
while (x == 0) do /* nada */; Entrada
x = 0; Entrada
... Regio Crtica
x = 1; Sada
Problema: Este mecanismo apresenta a falha de que a alterao
de valor para trancado, aps o teste, permite que dois processos
executem a Regio Crtica (RC) ao mesmo tempo
O teste e a alterao necessitam ser feitos de forma indivisvel
(atmica)
8 Comunicao e Sincronizao Eduardo Nicola F. Zagari
Alternncia Estrita Alternncia Estrita
Inicialmente a varivel turn feita igual a 0 (zero)
Assim, o Processo A consegue entrar na regio crtica
Enquanto isto, o Processo B ficar continuamente testando a
varivel (Espera Ocupada)
while (TRUE) {
while (turn != 0);
Reg_Crtica();
turn = 1;
Reg_No_Crtica();
}
while (TRUE) {
while (turn != 1);
Reg_Crtica();
turn = 0;
Reg_No_Crtica();
}
Processo A Processo B
5
9 Comunicao e Sincronizao Eduardo Nicola F. Zagari
(cont.) Alternncia Estrita (cont.) Alternncia Estrita
Problema 1: o fato do Processo B ficar fazendo Espera
Ocupada deve ser evitado, pois consome tempo de CPU
Problema 2: no uma boa soluo quando um processo
muito mais lento que o outro
Problema 3: viola a condio de que um processo que no
esteja em sua regio crtica no bloqueie outro
10 Comunicao e Sincronizao Eduardo Nicola F. Zagari
Solu Solu o de Peterson o de Peterson
Antes de entrar na Regio Crtica (RC), cada
processo chama enter_region com seu n
o
(0 ou
1) como parmetro. Ao sair, leave_region
#include prototypes.h
#define FALSE 0
#define TRUE 1
#define N 2 /* n
o
de processos */
int turn; /* de quem a vez */
int interested[N]; /* todos valores inici- */
/* almente 0 (FALSE) */
6
11 Comunicao e Sincronizao Eduardo Nicola F. Zagari
(cont.) Solu (cont.) Solu o de Peterson o de Peterson
void enter_region (int process) { /* process = quem
est entrando (0 ou 1) */
int other; /* n
o
do outro processo */
other = 1 - process; /* o outro processo */
interested[process] = TRUE; /* mostra interesse */
turn = process; /* define flag */
while (turn==process && interested[other]==TRUE);
}
void leave_region (int process) { /* process = quem
est saindo */
interested[process] = FALSE; /* indica sada RC */
}
12 Comunicao e Sincronizao Eduardo Nicola F. Zagari
Dormir e Acordar ( Dormir e Acordar (Sleep Sleep and and Wakeup Wakeup) )
Problema da Soluo de Peterson e da Instruo TSL: o
processo que no consegue acesso R.C. permanece em
espera ocupada (busy waiting):
gasta tempo de processador inutilmente
pode provocar o Problema da Inverso de Prioridade:
Dois processos A (alta prioridade) e B (baixa prioridade)
B entra na Regio Crtica;
A vai para estado de pronto;
A passa para estado de execuo;
A fica testando indefinidamente.
Chamadas de sistema: SLEEP e WAKEUP
7
13 Comunicao e Sincronizao Eduardo Nicola F. Zagari
Problema do Produtor Problema do Produtor- -Consumidor Consumidor
Dois processos compartilham um buffer de tamanho fixo. Um
dos processos, o produtor, coloca informao no buffer, e o
outro, o consumidor, retira informao do buffer.
Se o buffer estiver cheio, o produtor dorme e acordado quando
o consumidor remover um item
Se o buffer estiver vazio, o consumidor dorme at que seja
produzido e armazenado algum item
14 Comunicao e Sincronizao Eduardo Nicola F. Zagari
(?) Solu (?) Solu o com o com SLEEP SLEEP e e WAKEUP WAKEUP
#define N 100 /* n
o
mximo de tens */
int count = 0; /* n
o
de tens no buffer */
void producer (void) {
int item;
while (TRUE) {
produce_item(&item);
if (count==N) sleep();
enter_item(item);
count += 1;
if (count==1)
wakeup(consumer);
}
}
void consumer(void) {
int item;
while (TRUE) {
if (count==0) sleep();
remove_item(&item);
count -= 1;
if (count==N-1)
wakeup(producer);
consume_item(item);
}
}
Produtor Consumidor
8
15 Comunicao e Sincronizao Eduardo Nicola F. Zagari
(cont.) Solu (cont.) Solu o com o com SLEEP SLEEP e e WAKEUP WAKEUP
Problema:
Se o buffer estiver vazio e o consumidor sofrer preempo antes de
dormir o produtor produz e envia um wakeup para o
consumidor que ainda no est dormindo o sinal se perde e o
consumidor dormir para sempre...

Você também pode gostar