Sistemas Operacionais
Comunicação Entre Processos
Sleep / Wakeup
EX. Problema do produtor_consumidor (BUFFER LIMITADO)
•
Quando o buffer está cheio o produtor é colocado para dormir.
•
Quando o buffer está vazio o consumidor é colocado para dormir.
•
Verifica se count<=N (numero máximo)
•
deposita o item e incrementa
•
Cada processo deve verificar se o outro está dormindo para acordá-lo.
VER EX.
•
Buffer vazio
•
Consumidor verifica se count é = 0
•
Ocorre a interrupção.
•
Roda o processo produtor.
•
Produtor coloca um item e incrementa count (count=1), e acorda o consumidor [perda do
sinal] (que não está dormindo)
•
Consumidor lê o valor antigo “0” e dorme
•
Produtor começa a encher o buffer.
•
Buffer cheio produtor dorme.
•
Ambos dormem para sempre.
Para resolver isso, usa-se flags
• Indicando se o processo está ou não dormindo.
• Isso funciona bem para 2 processos, mas para 3 ou
mais temos que adicionar uma flag para cada
processo, complicando a implementação.
Solução de Peterson
1 int T;
1 void Sai_Região(int processo)
2 int solicita[2];
2 {
3 void Entra_Região(int processo)
3
4 {
4 }
5
int outro;
6
outro = 1 – processo;
7
solicita [processo] = Verdadeiro;
8
T = processo;
9
while (T = = processo && solicita[outro] =
= Verdadeiro
1
{
0
1
}
1
1 }
2
solicita[processo] = Falso;
Semáforos
• Resolve problemas de exclusão mútua e sincronia.
• Usa Down e Up (generalização de Sleep e Wakeup)
• Operação DOWN sobre o semáforo verifica se o val do
semáforo é >0
• Se for seu valor é decrementado e o processo continua
• Se for 0 o processo que executou a operação down, dorme.
• Ações únicas, atômicas.
• Operação UP incrementa o valor do semáforo
• Se um ou mais processo estiverem dormindo eles são
acordados, diminuindo a fila.
• Nenhum processo pode ser bloqueado ao executar UP
Solução do problema usando
semáforos
• Nas ações de acordar, dormir, atualizar
semáforo, etc, o SO inibe as interrupções
• As instruções acima são muito rápidas não
interferindo no processamento dos outros
processos
Contador de Eventos
• Resolve problemas de sincronia de
processos, mas os processos não dormem.
Monitores
• Evitar deadlock
• É uma seqüência de código
• Cada processo deve chamá-lo para entrar na
RC
• Apenas um processo pode estar dentro dele
• Tarefa do compilador implementar tal
diferença
Troca de mensagens
•
•
•
•
Send e Receiver
Um processo envia para outro uma msg
Se não receber nada é bloqueado.
Problemas quando o processamento é feito
com redes, podemos perder a msg (para
resolver usamos um sinal de
reconhecimento – acknowledgement – se
não recebe, retransmite a msg).
Troca de mensagens
• Problema: msg de reconhecimento perdida,
será enviada duas msg iguais.
• Solução: numerar com um contador as
msg’s (se receber duas msg com o mesmo
número ignora uma delas)
Troca de mensagens
• Problema: Operando em uma rede temos
que duas máquinas tem o mesmo processo
enviando msg’s para um receptor comum,
como saber de quem vem a msg?
• Solução: identificar as msg’s como
PROCESSO@MÁQUINA.
Troca de mensagens
• Problema: Duas organizações podem dar o
mesmo nome para duas de suas máquinas e
o receptor não saber de qual organização
vem a msg.
• Solução: Agrupa-se as máquinas em
DOMÍNIOS, sendo que cada organização
possui um domínio único. Ex.
[email protected].
Troca de mensagens
• Problema: Como saber se o receptor
(servidor de arquivos) é real ou um
impostor?
• Solução: Criptografar as msg’s (ex da
matriz)
Troca de mensagens
• Problema: Performance baixa se os
processo estão na mesma máquina.
• Solução: Usar semáforo, ou ainda em
estudos, dividir as msg em micro msg,
usando os registradores da CPU para troca
de msg.
Problemas Clássicos de
Comunicação entre
Processos.
Problema dos Filósofos Glutões
• Cinco pratos de
macarrão (representa
o uso de um recurso)
• Cinco garfos
(representa que o
recurso está ou não
disponível)
• Cinco filósofos
(representa o
processo em si)
1. Cada filósofo pode comer (representa a ação do
uso de um recurso)
2. Cada filósofo pode pensar (representa outra
atividade do processo)
3. Cada filósofo necessita de dois garfos (representa
que para efetuar uma determinada ação
necessitamos de dois recursos livres). Ex. Gravar
direto da memória para o disco.
• Problema1: Cada filósofo pega o garfo da direita,
ocorrendo assim o deadlock
• Solução: Cada filósofo pega o garfo da direita e
verifica se o da esquerda está livre, se não estiver,
libera o garfo da direita.
•
• Problema2: Todos os filósofos pegam os garfos da
direita e todos verificam que o garfo da esquerda
está ocupado, todos liberam os garfos, (repete
ciclo) Starvation => Morte provocada pela fome.
• Solução: Fazer com que cada filósofo pense e
devolva o garfo em tempos aleatórios.
• Problema3: Mesmo com os filósofos
pensando e devolvendo em tempos
aleatórios, existe a remota possibilidade de
todos fazerem isso ao mesmo tempo, e isso
não pode ser admitido em certos casos
(controle de uma usina nuclear, aviões,
espaçonaves, etc)
• Solução: Utilizamos semáforo.
• Problema4: Na teoria os semáforos resolvem, mas
na prática, teríamos apenas um filósofo se
alimentando e todos os demais parados.
• Solução: Utiliza-se uma matriz para que cada
filósofo controle a atividade de seu vizinho, para
checar se o mesmo está comendo ou não e ainda
se utiliza se um vetor de semáforo, um para cada
filósofo.
Problema dos Leitores e
Escritores
• Base de dados única
• Diversos processos tentando ler e escrever nela
1. O primeiro escritor a acessar o banco fecha o
semáforo.
2. Os leitores que quiserem ler são impedidos e
incrementam um contador.
3. Cada leitor que deixa o banco decrementa o
contador e o último a sair libera o semáforo,
permitindo que o escritor bloqueado, se existir
algum, seja liberado.
Problema dos Leitores e
Escritores
• Problema1: Os leitores tem prioridade sobre
os escritores, podendo o escritor ficar para
sempre esperando.
• Solução: Apresentada no artigo Courtois.
Problema do Barbeiro
Dorminhoco
Problema do Barbeiro
Dorminhoco
• 1 barbeiro (Impressora)
• 1 cadeira de barbeiro
(representa a impressão)
• N lugares de espera. Ex=5. (fila
de impressão – spool)
1. Se o barbeiro estiver sem
clientes ele dorme.
2. Se o barbeiro estiver ocupado e
um cliente chegar ele senta em
um lugar de espera.
3. Se todos os lugares estiverem
ocupados ele vai embora.
Problema do Barbeiro
Dorminhoco
• Problema1: Se dois clientes chegarem ao
mesmo tempo com dois lugares para espera
desocupados, pode haver a condição de
corrida.
• Solução: Usar semáforos, um para os
clientes, um para os barbeiros e um para
garantir a exclusão mútua.
Problema do Barbeiro
Dorminhoco
• Problema2: Se o barbeiro se desocupar os
clientes, podem ter a condição de corrida.
• Solução: Já resolvida anteriormente com os
semáforos, ou ainda podemos usar quando
temos apenas um barbeiro podemos usar
prioridades por ordem de chegada.
Download

GerenciadorProcessos_ComunicacaoProcessos_p3