Olá, hoje vou tratar sobre a sincronização dos processos e como esta forma de trabalho trouxe alguns problemas na implementação dos sistemas operacionais. Como de costume, aviso que, as informações aqui são frutos das anotações das aulas de sistemas operacionais.
Com a chegada dos sistemas multiprogramados outro problema também surgiu, o compartilhamento de recursos entre os processos.
Com a chegada dos sistemas multiprogramados outro problema também surgiu, o compartilhamento de recursos entre os processos.
Processos concorrentes
Para que exista concorrência entre os processos é sabido que é necessário que haja a comunicação entre os processos, para que os mesmos saibam os passos do outro processo e assim consigam gerar a concorrência. Essa comunicação é feita através de várias formas, seja esses utilizando buffer de memória, uma variável global ou trocas de mensagens.
Esses mecanismos de comunicação entre os processos são chamados de mecanismos de sincronização, esses são fundamentais para garantir a confiabilidade dos processos que estão sendo executados em um sistema operacional.
O problema da sincronização
Agora que já há uma pequena contextualização em mente, sobre os processos concorrentes, é possível tratar do problema gerado com os multiprocessos, citados anteriormente.
Para que fique claro, vamos entender o problema com um exemplo.
Imagine que, existe um software para realizar o gerenciamento de contas correntes de um grande banco. Em um certo dia, o cliente Luiz vai até esse banco depositar todo o dinheiro que estava escondido em seu colchão, dentre todo a fortuna, há dinheiro, e cheque. Essa era uma quantia tão grande de dinheiro que ele fechou o pagou para fechar o banco apenas para ele depositar. Chegando no caixa, ele dividiu tudo, no caixa 1 passou todo o dinheiro em cédulas, e no caixa 2, tudo o que era cheque. Então os atendentes começaram a trabalhar. o atendente do caixa 1 começou o processo de adição do dinheiro já que tinha terminado de contar todo o dinheiro, quando estava quase finalizando o processo de adição o atendente do caixa 2 terminou sua contagem e iniciou o processo de cadastro do dinheiro. No momento em que o atendente 1, que já tinha carregado as informações da conta, o atendente 2 confirma o depósito, o que faz o processo 1 ser paralisado e os valores da conta atualizados, ao término o processo 1 volta a rodar porém com os valores que estava armazenado antes de terminar o processo e assim o atendente 1 adiciona o valor.
Perceba que o valor na conta do cliente acabou ficando inconsistente pois no meio do processo 1, ele foi pausado e os valores que ele tinha puxado da conta foram alterados, e como ele já havia alocado ele não verificou novamente, o que fez a adição 1 sobrescrever todo o valor adicionado no caixa 2.
Veja que isso é um problema de sincronização, não houve uma conversa entre os processo, um passou a frente do outro sem ao menos perguntar sobre quais recursos ele estava utilizando.
A exclusão Mútua
Para solucionar o problema descrito acima, é necessário que haja "respeito", entre os processos, e para impor este "respeito", foi utilizado uma técnica chamada de exclusão mútua. Essa técnica faz com que haja um bloqueio de acesso aos recursos que estão sendo utilizados.
Mas o que é esse bloqueio ? Ele faz com que os processos não acessem o recurso que está sendo utilizado por outro processo enquanto ele não for terminado.
Isso evita que problemas como os vistos acima, sejam evitados, pois haverá um "respeito" entre os processos, ou seja, um não vai acessar os recursos do outro sem que antes este esteja disponível.
A técnica faz com que as áreas compartilhadas entre múltiplos processos, sejam definidas como região crítica.
Aplicação da exclusão mútua
Existem várias formas de aplicar a exclusão, sendo elas do tipo "Por hardware" ou "Por software".
- Por hardware:
- Desabilitação de interrupções:
- Essa é uma técnica que faz com que o processo ao entrar na zona crítica, desabilite todos os tipos de interrupções, o que evita que ele seja interrompido, e volte a habilitar antes de sair da zona critica. Seu grande problema é que ele pode comprometer o sistema de concorrência, o que afeta muito concorrência, já que a mesma é feita utilizando interrupções;
- Pode ocorrer também de um processo desabilitar a interrupção e não reabilitar, isso acaba com as concorrências;
- É bem empregado em certas funções do sistema operacional.
- Instruções test-and-set:
- Esta é uma técnica que é possível ser implementada em muitos processadores, isso porque esses processadores permitem a utilização de uma variável global na memória, que pode ser utilizada pelos processos para a conversa entre eles;
- Seu funcionamento é bastante simples, é implementado uma instrução que verifica se a variável está "setada" como False, caso esteja o processo que verificou muda para o valor desta variável para True, e entra em sua região critica, quando a variável está em True, os demais processos não acessam o recurso;
- O único problema é que no momento da saída a transformação do True para False é feita pelo processo, isso significa que ela pode não ocorrer, e isso faz com que os demais processos fiquem sem recursos para continuar seus trabalhos.
- Por software:
- No âmbito do software exites muitos algorítimos que foram implementados, e vários deles com um problema diferente. Os algorítimos começaram a ser escritos e inicialmente geravam problemas como a quantidade grande de espera, suportava apenas dois processos e caso haja algum processo mais rápido que outro, este ficará limitado a velocidade do processo mais lento;
- A evolução do algorítimo citado acima veio com um outro que criou um sistema de duas variáveis, essas que definiam se um processo estava ou não dentro de sua região crítica. Isso resolvia em parto o problema do primeiro algorítimo, que quando travava em qualquer momento não deixava os demais processos executarem. Com este o problema só acontecia dentro da zona critica, ou seja, se caso um processo apresentasse algum problema fora da região crítica tudo bem, porém ao entrar na região crítica o problema ocorria da mesma forma, mas aqui por conta de um problema diferente, pois ao começar a utilizar os recursos, ele colocava sua variável em True, assim dizendo que está utilizando recursos compartilhados, e quando trava ou apresenta outro problema, não muda esta variável;
- Mais uma evolução surgiu, essa que também utilizava duas variáveis, porém as trocas de valores dessas eram feitas antes da entrada do loop para a região critica, o problema é que depois de entrar no loop não é possível mudar, o que pode fazer que nenhum processo seja executado, já que se as variáveis não sejam trocadas antes do loop, os processos não são executados;
- O quarto algorítimo implementa algo a mais no terceiro, ele coloca a possibilita de alteração dos valores no loop, utilizando tempos aleatórios, esses utilizados para a espera da execução de outros processo, porém caso os valores dos dois processos sejam iguais, nenhum é executado;
- Após muitos erros o matemático Dekker propôs uma solução que veio a garantir a exclusão mutua sem "efeitos colaterais";
- Por fim Peterson G.L veio com a ideia de introduzir uma variável Vez no algorítimo três, esse indicava a vontade de um processo de ser executado, e isso resolvia o problema das travas, já que caso um processo tenha algum problema, a variável Vez fica sendo verificada para a troca dos processos, evitando travamentos indefinidos;
- Além desses foi introduzido um algorítimo que generalizava os algorítimos de Peterson e Dekker para N processos, isso porque até aqui, todos os algorítimos, suportavam apenas dois processos, esse garantindo concorrência e exclusão mutua.
- Mas nem todos os problemas foram resolvidos há problemas que como o busy wait, que faz o processo trabalhar verificando uma variável até que seja autorizado de trabalhar.
E isto é tudo =D
No próximo post vou tratar sobre os semáforos e alguns algorítimos para entender a sincronização
Comentários
Postar um comentário