Análise comparativa - semáforos e monitores
Semáforos
Um semáforo é uma variável de sincronização que pode ter valores inteiros não-negativos. Foram inventados por Edsger Dijkstra em 1965.
Um semáforo é uma variável inteira, não-negativa, que só pode ser manipulada por duas instruções: DOWN e UP.
• UP (Originalmente chamada de P (do holandês "proberen", testar)): uma operação atômica que espera o semáforo ficar positivo, e a seguir decrementa-o de 1.
• DOWN (Originalmente chamada de V (do holandês "verhogen", incrementar)): uma operação atômica que incrementa o semáforo de 1.
Semáforos provêm uma abstração simples e elegante que é útil para implementar exclusão mútua e outras tarefas de sincronização.
Os semáforos podem ser classificados como binários ou contadores. Os semáforos binários, também chamados de mutexes (mutual exclusion semaphores), só podem assumir os valores 0 e 1, enquanto os semáforos contadores podem assumir qualquer valor inteiro positivo, além do 0. Como exemplo, veja a solução do Problema de Espaço na Geladeira utilizando semáforos (mesmo código para os dois processos): down (PodeComprarLeite); if (SemLeite) { Compra Leite;
}
up (PodeComprarLeite);
Semáforos apresentam várias propriedades importantes: • são independentes de máquina • são simples • são gerais • funcionam com muitos processos • podem existir várias seções críticas diferentes controladas por vários semáforos • muitos recursos podem ser adquiridos simultaneamente (vários down's) • permitem múltiplos processos numa seção crítica de uma vez, se isso for desejável Tipicamente, semáforos não são providos pelo hardware. Semáforos são primitivas para sincronização de baixo nível. São utilizados para duas finalidades diferentes: • Exclusão Mútua: para assegurar que somente um processo está acessando informação compartilhada a cada instante: o se existirem