Região crítica
Em programação concorrente, uma região crítica - também conhecida por seção crítica (português brasileiro) ou secção crítica (português europeu) - é uma área de código de um algoritmo que acessa um recurso compartilhado que não pode ser acedido concorrentemente por mais de uma linha de execução. O objetivo é tornar a operação sobre o recurso compartilhado atômica. Uma região crítica geralmente termina num tempo específico, e uma linha de execução ou processo só precisa esperar um tempo específico para entrá-la. Alguns mecanismos de sincronização são necessários para implementar a entrada e a saída de uma região crítica para assegurar o uso exclusivo, como por exemplo um semáforo.
O acesso concorrente pode ser evitado ao controlar cuidadosamente quais variáveis são modificadas dentro e fora a região crítica. Uma região crítica é geralmente usada quando um programa multitarefa deve atualizar diversas variáveis relacionadas sem que outra linha de execução faça modificações conflitantes nos dados. Numa situação relacionada, uma região crítica também pode ser usada para assegurar que um recurso compartilhado como uma impressora seja acessado por somente um processo a cada vez.
A definição da região crítica é importante para a implementação de exclusão mútua, usada para evitar condições de corrida.
Implementação
editarA forma de implementação de uma região crítica pode variar para cada sistema.
O método mais simples é prevenir qualquer mudança de controle do processador dentro de uma região crítica. Em sistemas com somente um processador, isso pode ser feito desabilitando as interrupções na entrada da região crítica, evitando chamadas de sistema que causem troca de contexto. No final da região crítica, as interrupções são habilitadas novamente. Com essa implementação, qualquer linha de execução entrando em uma região crítica prevenirá outra linha de execução ou interrupção de usar a CPU, até que a linha de execução saia da região crítica. A desabilitação de interrupções só funciona no processador relacionado ao processo, entretanto, a máquina pode conter mais de um processador. Não é boa prática permitir a inibição de interrupções em modo usuário.
Essa abordagem bruta pode ser melhorada usando semáforos. Para entrar numa região crítica, uma linha de execução deve obter um semáforo, que será descartado na saída da região crítica. Cada recurso compartilhado, ou um conjunto de recursos compartilhados em comum, possui um semáforo próprio. Qualquer outra linha de execução deverá esperar para entrar numa região crítica em uso, mas poderá usar a CPU para executar qualquer outro código, incluindo regiões críticas protegidas por outro semáforo.
Em modo usuário, regiões críticas de aplicações residem na área de RAM dos respectivos processos e são modificadas geralmente pelos próprios processos. Já em modo núcleo, as regiões críticas geralmente bloqueiam a preemptividade. Qualquer interrupção que ocorre numa região crítica é salva para processamento futuro. Nesse caso, as regiões críticas devem ser curtas o suficiente para permitir a volta da preemptividade.