Condições de corrida (race condition) em sistemas operacionais
Gabarito: letra A. O problema descrito — dois processos acessando e atualizando o mesmo recurso compartilhado (o saldo da conta) sem sincronização, resultando na perda de uma atualização — é o clássico exemplo de condição de corrida (race condition). A condição de corrida ocorre quando o resultado final depende da ordem de execução dos processos concorrentes, e é exatamente o que aconteceu: o saque de R$ 300,00 foi sobrescrito pela atualização posterior do processo A.
O conceito central aqui é a concorrência entre processos e a necessidade de sincronização para garantir a exclusão mútua no acesso a recursos compartilhados. Quando dois ou mais processos leem e escrevem o mesmo dado sem controle, o resultado pode ser imprevisível e incorreto. No exemplo da conta bancária, a operação de saque (que envolve ler o saldo, subtrair R$ 300,00 e gravar o novo valor) não foi atômica: o processo B leu o saldo antigo, o processo A também leu o saldo antigo, e quando B gravou o resultado, A já havia gravado o dele, sobrescrevendo a atualização de B. O saldo final ficou em R$ 1.200,00 (valor após o depósito de A), e o saque de R$ 300,00 foi perdido.
A condição de corrida é um dos problemas mais fundamentais em sistemas operacionais e programação concorrente. Ela acontece quando o resultado de um processo depende da sequência ou sincronização de outros eventos, e a solução típica é o uso de mecanismos de sincronização, como semáforos, monitores ou travas (locks), que garantem que apenas um processo por vez acesse a região crítica (o trecho de código que manipula o recurso compartilhado).
Para entender bem o problema, é importante distinguir os conceitos envolvidos:
Condição de corrida: falha causada pela falta de sincronização no acesso concorrente a um recurso compartilhado.
Escalonamento de curta duração: política do sistema operacional para decidir qual processo executará na CPU a cada momento; não é a causa do problema, mas a condição de corrida pode ser influenciada pela ordem de escalonamento.
Trava de transação / trava de processo: mecanismos de exclusão mútua que previnem a condição de corrida, mas não são o nome do problema em si.
Semáforo: uma primitiva de sincronização usada para controlar o acesso a recursos compartilhados; também é uma solução, não o problema.
A pegadinha da questão está em confundir o problema (condição de corrida) com as soluções (trava, semáforo) ou com o mecanismo de escalonamento. O enunciado descreve exatamente o sintoma clássico da condição de corrida: a perda de uma atualização devido à interferência entre processos concorrentes.
Alternativa A — ✅ Correta ⟵ GABARITO
A alternativa descreve com precisão o fenômeno: dois processos acessam o mesmo recurso (saldo) sem sincronização, e o resultado final depende da ordem de execução. O saque de R$ 300,00 foi perdido porque a operação de atualização do processo B foi sobrescrita pela do processo A. Isso é a definição de condição de corrida (race condition), um problema clássico de concorrência em sistemas operacionais.
Alternativa B — ❌ Incorreta
Escalonamento de curta duração (short-term scheduling) é o mecanismo pelo qual o sistema operacional decide qual processo pronto será executado na CPU a cada instante. Embora a ordem de execução dos processos influencie quando a condição de corrida se manifesta, o escalonamento em si não é o problema descrito. A perda do saque não ocorre por uma falha no escalonador, mas pela falta de exclusão mútua no acesso ao saldo.
Alternativa C — ❌ Incorreta
Trava de transação (transaction lock) é um mecanismo de controle de concorrência usado para garantir que uma sequência de operações seja executada de forma atômica e isolada. É uma solução para evitar condições de corrida, não o problema em si. No cenário descrito, não há trava sendo aplicada; pelo contrário, a ausência dela é que causou o erro.
Alternativa D — ❌ Incorreta
Trava de processo (process lock) é um mecanismo de exclusão mútua que impede que dois processos acessem simultaneamente um recurso compartilhado. Assim como a trava de transação, é uma ferramenta de prevenção da condição de corrida, não o nome do problema. A questão descreve a falha que ocorre quando não há trava, não a trava em si.
Alternativa E — ❌ Incorreta
Semáforo é uma primitiva de sincronização (geralmente uma variável inteira com operações atômicas wait e signal) usada para controlar o acesso a recursos compartilhados e evitar condições de corrida. É uma solução para o problema, não o problema em si. O enunciado não menciona o uso de semáforos; descreve justamente a ausência de sincronização.
Gabarito: letra A