Matriz em C
Sincronização de Processos
•
•
•
•
•
•
•
•
•
Fundamentos
O problema das Regiões Críticas
Solução de Peterson
Hardware de Sincronização
Semáforos
Problemas Clássicos de Sincronização
Monitores
Exemplos de Sincronização
Transações Atômicas
Objetivos
• Introduzir o problema da região crítica, em que as soluções podem ser usadas para garantir a consistência de dados compartilhados
• Apresentar soluções tanto de software quanto de hardware para o problema da região crítica
• Introduzir o conceito de transação atômica e descrever mecanismos de garantir atomicidade
Fundamentos
• Acesso concorrente a dados compartilhados pode resultar em inconsistências.
• Manter a consistência de dados requer a utilização de mecanismos para garantir a execução ordenada de processos cooperantes.
• Suponha que seja desejado fornecer uma solução para o problema do produtor-consumidor que utilize todo o buffer. É possível fazer isso tendo um inteiro count que mantém o número de posições ocupadas no buffer.
Inicialmente, count é inicializado em 0. Ele é incrementado pelo produtor após a produção de um novo item e decrementado pelo consumidor após a retirada.
Produtor while (true) {
/* produz um item e coloca em nextProduced */ while (count == BUFFER_SIZE)
; // do nothing buffer [in] = nextProduced; in = (in + 1) % BUFFER_SIZE; count++; }
Consumidor while (true) { while (count == 0)
; // não faz nada nextConsumed = buffer[out]; out = (out + 1) % BUFFER_SIZE; count--; /* consome o item em nextConsumed
}
Condição de Corrida
• count++ pode ser implementado como register1 = count register1 = register1 + 1 count = register1
• count– pode ser implementado como register2 = count register2 = register2 - 1 count = register2
• Considere a seguinte ordem de execução com, inicialmente, “count = 5”:
S0: producer execute register1 = count {register1 = 5}
S1: producer execute register1 =