Exclusão Mútua (Mutex) e Sincronização de Processos

Classificado em Computação

Escrito em em português com um tamanho de 5,53 KB

Exclusão Mútua (Mutex)

Exclusão mútua (mutex) é uma técnica usada em programação concorrente para evitar que dois processos ou threads tenham acesso simultâneo a um recurso compartilhado, acesso esse denominado região crítica.

Soluções de Hardware

  • Desabilitação de interrupções:
    • Desabilitar interrupções externas ao entrar numa região crítica e habilitá-las ao sair.
    • Se o processo não habilitar as interrupções ao sair da região crítica, o sistema pode ficar comprometido.
  • Instrução Test-and-Set:
    • Instrução especial que permite ler uma variável, armazenar seu conteúdo em outra área e atribuir um novo valor à variável.
    • Executa sem interrupção.
    • É uma instrução atômica (invisível ao programador).
    • Assim, dois processos não podem manipular uma variável compartilhada ao mesmo tempo (exclusão mútua).

Soluções de Software

Algoritmos

  • Primeiro algoritmo
    Problema: Você define quem começa! Existe uma variável que controla a 'vez'.
  • Segundo algoritmo
    Problema: Os dois podem ser executados simultaneamente; a variável é setada dentro do loop e nenhum dos processos pode progredir.
  • Terceiro algoritmo
    Problema: Situação semelhante ao segundo; ambos podem entrar em execução continuamente (loop infinito).
  • Quarto algoritmo
  • Algoritmo de Dekker
  • Algoritmo de Peterson
  • Algoritmo para exclusão mútua entre N processos

Espera Ocupada (Busy Wait)

  • Conhecido como busy wait.
  • Faz o processador ficar em loop, consumindo tempo de CPU desnecessariamente.
  • Uma solução é a implementação de monitores e semáforos para evitar espera ocupada.

Problemas de Compartilhamento de Recursos

  • Devem existir mecanismos de controle para evitar problemas.
  • Exemplos:
    • Atualização simultânea de arquivos compartilhados.
    • Cálculos concorrentes com as mesmas variáveis.

Solução para os Problemas de Compartilhamento

  • Exclusão múltua (solução mais simples): impedir que dois ou mais processos acessem um mesmo recurso no mesmo instante; um deve esperar que o outro termine.
  • Região crítica: parte do código onde é feito o acesso ao recurso compartilhado.
  • Usa-se geralmente um protocolo ao entrar e ao sair de uma região crítica.

Problemas de Sincronização

  • Problemas introduzidos pela exclusão múltua.
  • Velocidade de execução dos processos:
    • Diferenças de velocidade ou tempos de processamento distintos entre processos podem causar efeitos indesejados.
  • Starvation:
    • Situação em que um processo nunca consegue executar sua região crítica e acessar o recurso compartilhado.
    • Ocorre quando dois ou mais processos esperam por um mesmo recurso alocado; se o sistema escolher aleatoriamente o processo ao liberar o recurso, um processo pode nunca ser escolhido.
    • Quando um processo tem baixa prioridade também pode nunca ser escolhido.
    • Filas FIFO eliminam esse problema.
  • Sincronização condicional:
    • Quando um recurso não está pronto para uso, o processo deve ser colocado em espera até a liberação do recurso.
    • Exemplo produtor/consumidor: um processo tenta gravar num buffer enquanto outro tenta ler; um não deve ler de um buffer vazio nem escrever em um buffer cheio.

Semáforos

  • Solução geral e simples de implementar.
  • Variável inteira, não negativa, que só pode ser manipulada por duas operações: DOWN e UP.
  • Mutexes (mutual exclusion semaphores):
    • Semáforos aplicados ao problema da exclusão múltua.
    • Nas exclusões múltiplas, as operações DOWN e UP funcionam como protocolos de entrada e saída: valor > 0 — recurso liberado; valor = 0 — acesso impedido.
    • O processo entra na região crítica executando DOWN, impedindo outros do acesso.
    • Ao sair da região crítica, o processo executa UP, liberando o acesso para outros processos.
    • Normalmente, UP e DOWN são chamadas de sistema (system calls).
  • Semáforos para sincronização condicional:
    • Quando um processo deve ser notificado sobre um evento e outro pode detectar sua ocorrência, pode-se utilizar um semáforo associado ao evento para sincronizá-los.
    • Semáforos contadores: úteis na alocação de recursos do mesmo tipo (pools).

Monitores

  • Mecanismos de sincronização de alto nível que facilitam o desenvolvimento e a correção de programas concorrentes.
  • Conjunto de procedimentos, variáveis e estruturas de dados definidos dentro de um módulo.
  • Somente um processo pode executar um dos procedimentos do monitor em um determinado instante.
  • A implementação da exclusão mútua nos monitores é realizada pelo compilador.
  • WAIT — faz um processo entrar em estado de espera quando uma variável de condição (estrutura de dados do tipo fila) está impedindo a liberação para outros processos.

Entradas relacionadas: