Sincronização de processos
Sincronização de Processos
Processos podem agir de forma cooperativa, ou concorrente, com outros processos (ou threads), compartilhando recursos ou dados, isto é, podem compartilhar códigos e variáveis. Entretanto o acesso concorrente pode gerar dados incoerentes. Por exemplo, com um problema envolvendo um consumidor e um produtor ambos podendo acessar a uma mesma variável concorrentemente, isto geraria uma incoerência nos dados dessa variável.
Ex.:
/*PRODUTOR*/
While (count == BUFFER_SIZE);
//não faz nada
//acrescenta um item ao buffer
++count;
buffer[in] = item; in = (in + 1) % BUFFER_SIZE;
/*CONSUMIDOR*/
While (count == 0);
//não faz nada
//remove um item ao buffer
--count;
Item = buffer[out]; out = (out + 1) % BUFFER_SIZE;
Levando em consideração que a variável “count” é um numero n, ao ser incrementado pelo produtor está variável seria igual a n+1, e ao mesmo tempo em que fosse decrementada pelo consumidor ela seria igual a n-1. Em uma execução concorrente ela sempre teria mais um ou menos um, e nunca o valor real de n.
Seção critica é um protocolo que indica se o recurso está em uso por um processo. Cada processo só pode acessar o recurso de seção critica se nenhum outro estiver usando. Enquanto o recurso está em uso os processos, que o solicitaram, ficam em standby, em uma fila para utilização deste recuso de seção critica. Um processo não pode ficar indefinidamente em uma fila esperando por um recurso, isso causa o starvation.
Semaforos
Semáforos é uma solução simples para garantir o acesso a uma seção critica. Um semáforo é uma variável inteira que é compartilhada entre os processos, ou threads, e controla a entrada em uma seção critica. Ele pode ser um contador, ou pode ser binário, ou seja, só assumir valores 0 e 1. Um semáforo so pode ser acessado pelos métodos acquire();(*para decremento) e release();(*para incremento). Os métodos acquire e release devem ser executados sem interrupções, e não podem