Sincronia de processos

Origem: Wikipédia, a enciclopédia livre.

A sincronia de processos permite gerenciar o acesso concorrente a recursos do sistema operacional de forma controlada por parte dos processos, de maneira que um recurso não seja modificado em simultâneo, ou que os processos não fiquem em espera que o recurso seja libertado.

Os processos (aplicativos ou programas) de um computador compartilham determinados recursos da chamada região crítica, que são as variáveis globais, as instruções de E/S, algum banco de dados, etc. Neste compartilhamento podem ocorrer erros.

Exemplo:

Uma escola está fazendo sua matrícula apenas pela internet, o número de vagas é 5, dois usuários estão fazendo a matrícula no exato momento, finalizam a matrícula . A operação que o programa usa da região crítica: matrícula finalizada -1.

Se os dois usuários fazem a operação ao mesmo tempo, quando a matricula for finalizada subtrai-se 1 vaga:

Matrícula finalizada -1 (5-1)=4

Matrícula finalizada -1 (5-1)=4


Quando um terceiro usuário for fazer esta mesma matrícula, o número de vagas será expresso como 4, sendo que na verdade deveria ser 3. Isto causará instabilidade e poderá comprometer todo o sistema. A solução para este tipo de caso é a certeza de exclusão mútua, isto é, apenas um processo pode acessar a região crítica por vez; Os mecanismos que implementam a exclusão mútua utilizam um protocolo de acesso à região crítica. Toda vez que um processo for executar sua região crítica, ele é obrigado a passar por um controle de entrada e outro de saída.

Exclusão Mútua Com Espera Ativa[editar | editar código-fonte]

É uma técnica em que um processo verifica uma condição repetidamente (são feitos testes contínuos em uma variável) até que ela seja verdadeira (true), como esperar o pressionamento da tecla de um teclado ou a espera da liberação de recurso em exclusão mútua. Também pode ser usada para gerar atrasos na execução do sistema por um período determinado de tempo. Ela pode ser uma estratégia válida em certas circunstâncias, mas no geral é considerada um anti-padrão e deve ser evitada, já que o tempo de CPU gasto poderia ser usado noutra tarefa.

Abaixo temos soluções para problemas de sincronização de processos (e/ou threads).

Desativando as Interrupções[editar | editar código-fonte]

A mudança de contexto de execução de processos só pode ser realizada com o uso de interrupções. A forma mais simples de garantir a exclusão mútua é fazer com que o processo desabilite as interrupções ao entrar na região crítica, e antes de sair as habilite novamente. Com isso a CPU não fará um chaveamento no momento em que o processo estiver na região crítica, pois o chaveamento vem de uma interrupção através de um relógio.

No entanto, há diversos problemas associados à esta operação:

- O processo pode não tornar a habilitar suas interrupções ao sair da região crítica.

- O processo pode entrar em loop dentro de sua região crítica, e nenhum outro evento o interromperá.

Variáveis de Bloqueio[editar | editar código-fonte]

Quando uma variável "lock" estiver como 0, significa que a região crítica esta livre, e 1 esta ocupada. Assim, antes de entrar cada processo testa o valor da variável "lock", se for 0, coloca como 1 e entra na região crítica, após sair coloca o valor 0, se o valor já for 1, aguarda até ser 0.

Alternância Estrita[editar | editar código-fonte]

Neste método, é criada uma variável "turn", com valor inicial 0, a imagem abaixo mostra dois processos 'a' e 'b' utilizando este método.

Alternância Estrita


Como "turn" esta como 0, o processo 'a' não fica "preso" no while, e assim executa a região crítica, após terminar, ele seta "turn" para 1 e parte para o resto do código, caso ocorra um chaveamento e o processo 'b' tente executar a região crítica antes que o processo 'a' sete "turn" como 1, ele ficara em um loop, apenas testando a variável "turn"(espera ativa).

Solução de Peterson[editar | editar código-fonte]

Antes do processo entrar na região crítica ele executa o procedimento enter_region(), com o seu número. E após sair da região crítica, executa leave_region().

Deadlock[editar | editar código-fonte]

Dois ou mais processos ficam irreversivelmente bloqueados.

Starvation[editar | editar código-fonte]

Um processo fica sempre no final na fila e não consegue ser atendido, pois processos com maior prioridade "roubam" sua vez.

Bibliografia[editar | editar código-fonte]

TANENBAUM, Andrew S. Organização estruturada de computadores. 4. ed. Rio de Janeiro: LTC, 2001. xiv, 398 p. ISBN 85-216-1253-2.

SILBERSCHATZ, Abraham; GALVIN, Peter Baer; GAGNE, Greg. Fundamentos de sistemas operacionais. 6. ed. Rio de Janeiro: LTC, 2004 580 p. ISBN 9788521614412 . 67 - 113-913