Podem compartilhar diretamente um espaço de
endereços lógicos (ou seja, código e dados)
Acesso concorrente aos dados compartilhados
pode resultar em inconsistência de dados
Manutenção da consistência dos dados requer mecanismos para
garantir a execução ordenada dos processos em cooperação
Antecedentes
Processos podem ser executados
concorrentemente ou em paralelo
SO possui um escalonador de processos que alterna o uso da CPU
rapidamente entre os processos para fornecer execução concorrente
Pode executar paralelamente processos/threads, em que dois fluxos de instruções
são executados simultaneamente em núcleos de processamento separados
O Problema do
Produtor/Consumidor
Região de memória compartilhada (buffer) onde
o produtor deposita os itens produzidos a fim
de que o consumidor consuma esses itens
Preciso haver uma sincronização para que o
consumidor não tente consumir um item que ainda
não foi produzido (ou seja, não está no buffer)
Problema da Seção
Crítica/Região Crítica
Um segmento de código que pode alterar dados comuns
(ou seja, compartilhadas) a vários processos/threads
Três requisitos obrigatórios
de uma boa solução
Exclusão Mútua
Enquanto um processo estiver executando sua RC,
outros processos não poderão executar suas RCs
Progresso
Se algum processo deseja entrar na RC, só processos que não
estão executando sua seção remanescente poderão participar
da decisão sobre qual será o proximo à entrar na RC
Essa decisão não pode ser
adiada indefinidamente
Espera limitada
Limite para o número de vezes em que outros processos podem
entrar em suas RCs após um processo ter feito uma solicitação
para entrar em sua RC e antes que essa solicitação seja atendida
Entrou na fila da RC, tem que esperar todo
mundo da frente (não pode furar fila)
Seção de entrada -> Seção crítica ->
Seção de saída -> Seção remanescente
Presume-se que cada processo esteja
executando a uma velocidade diferente de zero
Não podemos fazer suposições com relação à
velocidade relativa dos n processos
Kernel COM ou SEM
Preempção
Kernels com preempção
Permite que um processo seja interceptado enquanto
está sendo executado em modalidade de kernel
Vantagens
Melhor capacidade de resposta
Menos chance de um processo ficar nesse estado
por muito tempo, fazendo os outros esperarem
Mais apropriado para programação em tempo real
Desvantagem
Sujeito a condições de corrida
Difíceis de projetar em arquiteturas SMP
Kernels sem preempção
Não permite que um processo sendo executado
em modalidade de kernel seja interceptado
Um processo em modalidade de kernel será executado até sair dessa
modalidade, ser bloqueado ou abandonar voluntariamente o controle da CPU
Vantagens
Livre de condições de corrida
Desvantagens
Não tem as vantagens do
kernel com preempção
Soluções para o Problema
da Seção Crítica
Busy wait
Quando um processo quer entrar na sua R.C.
ele verifica se a entrada é permitida.
Se não for, ele espera em um laço
(improdutivo) até que o acesso seja liberado
while (vez == OUTRO) do {nothing}
Desperdício de tempo de CPU
Problema da inversão de prioridade
Soluções de Software
com Busy Wait
Algoritmo de Peterson
"Ao marcar a sua intenção de entrar, o processo já indica
(para o caso de empate) que a vez é do outro"
É uma solução simples e elegante para o problema da exclusão
mútua, sendo facilmente generalizado para o caso de n processo