Inibição de Interrupções
Por: guiherme3020 • 25/5/2016 • Abstract • 913 Palavras (4 Páginas) • 547 Visualizações
Soluções para o problema por hardware
Inibição de interrupções
A solução mais simples para o problema da exclusão mútua é fazer com que o processo desabilite todas as interrupções antes de entrar na região crítica, e as reabilite após deixar a mesma. Como a mudança de contexto de processos só pode ser realizada através de interrupções, o processo que as desabilitou terá acesso exclusivo garantido.
BEGIN .
Desabilita Interrupcoes;
Regiao Critica;
Habilita Interrupcoes; .
END.
Essa solução apresenta algumas limitações. Primeiramente, a concorrência entre processos deixaria de existir, pois não haveria mais interrupções enquanto um processo esta em execução. Outro problema seria quando o processo desabilitasse as interrupções e não as habilitassem novamente. Isso comprometeria o funcionamento do sistema. Em sistemas com múltiplos processadores, essa solução torna-se ineficiente devido ao tempo de propagação quando um processador sinaliza aos demais que as interrupções devem ser habilitadas ou desabilitadas. Apesar das limitações, essa solução pode ser útil quando se deseja que a execução de parte do núcleo do sistema operacional ocorra sem que haja interrupção. Dessa forma, o sistema pode garantir que não ocorrerão problemas de inconsistência em suas estruturas de dados durante a execução de algumas rotinas.
Instrução TSL (Test and Set Lock)
É uma das várias soluções para o problema da condição de corrida.
É uma solução de hardware para o problema da exclusão mútua em ambiente com vários processadores.
Muitos processadores possuem uma instrução de máquina especial que permite ler uma variável, armazenar seu conteúdo em uma outra área e atribuir um novo valor à mesma variável.
Essa instrução especial é chamada
TSL
(Test and Set Lock) e tem como característica ser executada sem interrupção, ou seja, trata-se de uma instrução atômica/indivisível.
Para usar a instrução TSL, parte-se de uma variável de trava compartilhada, LOCK, para coordenar o acesso à memória compartilhada.
Quando a variável lock for 0, qualquer processo poderá torna-la 1 usando a instrução TSL e, então, ler ou escrever na memória compartilhada.
Quando terminar, o processo colocará a variável LOCK de volta em 0, lançando mão de uma instrução ordinária MOVE.
Como a Instrução TSL pode ser usada para impedir que dois ou mais processos entrem simultaneamente em suas regiões críticas?
Instrução TSL
Instrução TSL (Test and Set Lock)
O que é uma Instrução TSL?
enter region:
TSL RX, LOCK
CMP RX, #0
JNE enter region
RET
leave region:
MOVE LOCK, #0
RET
Como funciona?
Ela lê o conteúdo da memória, a palavra LOCK, no registrador RX. Armazena um valor diferente de zero (no caso, 1) no endereço da memória LOCK.
As operações de leitura e armazenamento da palavra são seguramente indivisíveis – nenhum outro processo pode terminar.
A CPU que está executando a instrução TSL impede o acesso ao barramento de memória para proibir que outras CPUs tenham acesso à memória enquanto ela não terminar.
Desabilitar interrupções e depois executar a leitura de uma palavra na memória seguida pela escrita não impede que um segundo processador no barramento acesse a palavra entre a leitura e a escrita.
Na verdade, desabilitar interrupções no processador 1 não tem nenhum efeito sobre o processador 2. O único modo de evitar que o processador 2 entre na memória até que o processador 1 tenha terminado é impedir o barramento, o que requer um equipamento de hardware especial.
OBSERVAÇÃO
A primeira instrução copia o valor anterior da variável LOCK no registrador RX e põe a variável LOCK em 1.
Então, o valor anterior é comparado com 0. Se o valor anterior não for 0, ele já estará impedido; assim, o programa apenas voltará ao início e testará a variável novamente.
Cedo ou tarde a variável se tornará 0 (quando o processo deixar a região critica em que está) e a sub-rotina retornará, com a variável LOCK em 1.
A trava é bastante simples. O programa apenas armazena um 1 na variável LOCK.
...