Você está na página 1de 5

Variveis de impedimento Uma possvel soluo seria ter uma varivel nica compartilhada (bloqueio) inicialmente como 0.

Quando um processo quer entrar em sua regio crtica ele inicialmente testa o bloqueio. Se o bloqueio for 0, o processo o define como 1 e entra na regio crtica. Se o bloqueio j for 1, o processo apenas espera at ele tornar-se 0. Assim 0 significa que nenhum processo est em sua regio crtica. Infelizmente, essa idia contm exatamente o mesmo defeito fatal que vimos no diretrio de spooler. Suponha que o processo leia o bloqueio e veja que ele 0. Antes de poder definir o bloqueio como 1, outro processo agendado, executa e define o bloqueio como 1. Quando o primeiro processo executa novamente, ele tambm definir o bloqueio como 1, e os dois processos estaro em suas regies crticas ao mesmo tempo. Agora voc pode pensar que poderamos evitar esse problema lendo primeiro o valor de bloqueio e, ento, verificando-o novamente, imediatamente antes de armazenar nele, mas isso na verdade no ajuda. A condio de corrida agora ocorre se o segundo processo modifica o bloqueio imediatamente depois de o primeiro processo acabar de fazer sua segunda verificao. A instruo TSL Muitos processadores possuem uma instruo de mquina especial que permite ler uma varivel, armazenar seu contedo em uma outra rea e atribuir um novo valor mesma varivel. Essa instruo chamada TEST AND SET LOCK (testa e configurar o bloqueio) e tem como caracterstica ser executada sem interrupo, ou seja, trata-se de uma instruo indivisvel. Nenhum outro processador pode acessar a palavra de memria at que a instruo tenha acabado. A CPU que executa a instruo TSL bloqueia o barramento de memria, proibindo outras CPUs de acessar a memria at que ela tenha terminado. Dessa forma, garantido que dois processos no manipulem uma varivel compartilhada ao mesmo tempo, possibilitando a implementao da excluso mutua. Para utilizar a instruo TSL usada uma varivel compartilhada lock, para coordenar o acesso memria compartilhada. Quando lock 0, qualquer processo pode configura-la como 1 utilizando a instruo TSL e, ento, ler ou gravar a memria compartilhada. Quando termina, o processo configura lock de volta para 0 utilizando uma intruo MOVE comum. O exemplo abaixo mostra uma subrotina de 4 instrues em uma fictcia (mas tpica) linguagem assembly.

Figura 1 Configurando e limpando bloqueios utilizando TSL

A primeira instruo copia o valor antigo de lock para o registrador e, ento, configura lock como 1. Ento, o valor antigo comparado com 0. Se for diferente de 0, o bloquei j foi definido e, ento, o programa volta para o comeo e testa novamente. Cedo ou tarde, ele se tornar 0 (quando o processo atualmente em sua regio crtica terminar de trabalhar nela) e a subrotina retorna com o bloqueio configurado. Limpar o bloqueio simples. O programa simplesmente armazena um 0 em lock. Nenhuma instruo especial necessria. Antes de entrar em sua regio crtica, um processo chama enter_region, que faz uma espera ociosa at que o bloqueio esteja livre; ento ele adquire o bloqueio e retorna. Depois da regio crtica, o proceso chama leave_region, que armazena um 0 em lock. Os processos devem chamar enter_region e leave_region nos momentos certos para o mtodo funcionar. Se um processo trapacear a excluso mtua falhar. Uma instruo alternativa TSL XCHG, que troca os contedos de duas posies atomicamente, por exemplo, um registro e uma palavra de memria. O cdigo funciona basicamente como o da soluo TSL. Todas as CPUs Intel x86 usam instrues XCHG para sincronizao de baixo nvel.

Figura 2 Entrando e saindo de uma regio crtica usando a instruo XCHG. Monitores Monitores so mecanismos de sincronizao de alto nvel que tornam mais simples o desenvolvimento de aplicaes concorrentes. O conceito de monitores foi proposto por Brinch Hansen em 1972, e desenvolvido por C. A. R. Hoare em 1974, como um mecanismo de sincronizao estruturado, ao contrrio dos semforos, que so considerados no-estruturados. O uso de semforos exige do desenvolvedor bastante cuidado, pois qualquer engano pode levar a problemas de sincronizao imprevisveis e difceis de serem reproduzidos devido execuo concorrente dos processos. Monitores so considerados mecanismos de alto nvel e estruturados em funo de serem implementados pelo compilador. Assim o desenvolvimento de programas concorrentes fica mais fcil e as chances de erro so menores. Atualmente, a maioria das linguagens de programao disponibiliza rotinas para uso de monitores. O monitor formado por procedimentos e variveis encapsulados dentro de um mdulo. Sua caracterstica mais importante a implementao automtica da excluso mtua entre os procedimentos declarados, ou seja, somente um processo pode estar executando um dos procedimentos do monitor em um determinado instante. Toda vez que um processo faz uma chamada a um desses procedimentos, o monitor verifica se j existe outro processo executando algum procedimento do monitor. Caso exista, o processo ficar aguardando a sua vez em uma fila de entrada. As variveis globais de um monitor so visveis apenas aos procedimentos da sua estrutura, sendo inacessveis fora do contexto do monitor. Toda a inicializao das variveis realizada por um bloco de comandos do monitor, sendo executado apenas uma vez, na ativao do programa onde est declarado o monitor.

Figura 3- Estrutura de um monitor utilizando Pascal no convencional Cabe ao compilador implementar a excluso mtua nas entradas do monitor, mas um modo comum usar um semforo binrio. Como o compilador, e no o programador, que est organizando a excluso mtua, muito menos provvel que algo d errado. A pessoa que escreve o monitor no precisa estar ciente de como o compilador organiza a excluso mtua. suficiente saber que transformando todas as regies crticas em procedimentos de monitor, nunca dois processos executaro suas regies crticas ao mesmo tempo. Monitores oferecem um modo fcil de obter excluso mtua, mas isso no suficiente. necessria uma maneira de bloquear os processos quando eles no podem prosseguir. Atravs de variveis especiais de condio, possvel associar a execuo de um procedimento que faz parte do monitor a uma determinada condio, garantindo a sincronizao condicional. As variveis especiais de condio so manipuladas por intermdio de duas instrues, conhecidas como WAIT e SIGNAL. A instruo WAIT faz com que o processo seja colocado no estado de espera, at que algum outro processo sinalize com a instruo SIGNAL que a condio de espera foi satisfeita. Caso a instruo SIGNAL seja executada e no haja processo aguardando a condio, nenhum efeito surgir. possvel que vrios processos estejam com suas execues suspensas, aguardando a sinalizao de diversas condies. Para isso, o monitor organiza os processos em espera utilizando filas associadas s condies de sincronizao. A execuo da instruo SIGNAL libera apenas um nico processo da fila de espera da condio associada. Um processo

Concluso Desabilitar interrupes de no interessante como um mecanismo geral de excluso mtua de processos de usurio no entanto bastante til quando o prprio ncleo

pretende realizar interrupes. Mas a cada dia esta tcnica est sendo menos utilizada pois em um sistema multicore desabilitar as interrupes de uma cpu no impede que outras cpus interfiram nas operaes que a primeira cpu est executando demandando esquemas mais sofisticados. Em geral a espera ociosa (chaveamento obrigatrio) deve ser evitada pois gasta muito tempo de cpu e usada somente quando h uma expectativa razovel de que a espera seja breve. Embora sejam corretas e realizem a excluso mutua corretamente a soluo de Peterson e a instruo TSL tem o problema da espera ociosa.