A imagem apresentada contém três questões distintas sobre Sistemas Operacionais, especificamente focadas em concorrência, condições de corrida e funcionamento do Linux. Abaixo, apresento a análise detalhada e a resolução de cada item.
Questão 1: Definição de Condição de Corrida
Alternativa C
Análise Conceitual:
A Condição de Corrida (Race Condition) é um problema clássico em sistemas concorrentes. Ela ocorre quando dois ou mais processos (ou threads) acessam dados compartilhados simultaneamente e o resultado final da operação depende da ordem específica em que esses acessos ocorrem.
- Sem sincronização: Se não houver controle de acesso, o sistema não garante quem executa primeiro, levando a resultados inconsistentes ou corrompidos.
- Comparação com outras opções:
- Não é apenas um método de atualização de tela (A).
- O uso de memória compartilhada (B) é o meio pelo qual a condição ocorre, mas não a definição do fenômeno em si.
- Não é uma forma de programação (D), mas sim um erro de lógica nesse tipo de programação.
- Não é uma falha genérica do SO (E), mas sim um comportamento esperado se o programador não implementar sincronização adequada.
Questão 2: Threads e Processos no Linux
Alternativa B
Análise Conceitual:
Esta questão aborda mecanismos internos do Kernel do Linux (clone, fork, memória compartilhada). Vamos analisar cada afirmação:
- I. Verdadeiro. O flag
CLONE_VM no sistema de chamada clone (usado para criar threads no Linux) faz com que a nova tarefa compartilhe o mesmo espaço de endereçamento virtual (memória) da tarefa pai. Isso é essencial para que threads tenham memória comum. - II. Verdadeiro. O mecanismo Copy-on-Write (Cópia sob Escrita) é usado no
fork(). Ele cria o processo filho muito rápido porque não copia imediatamente a memória física; ele só copia os páginas quando um dos processos tenta escrever nelas. Isso otimiza drasticamente o tempo de criação. - III. Falso. A comunicação e troca de contexto entre processos (subprocessos) é mais custosa que entre threads. Trocar de processo exige atualizar tabelas de página e limpar cache (TLB), enquanto trocar de thread dentro do mesmo processo mantém o contexto de memória. Além disso, threads usam memória compartilhada para comunicar, enquanto processos requerem IPC (Inter-Process Communication) mais complexo.
Como apenas as afirmações I e II estão corretas, a alternativa correta é a B.
Questão 3: Solução para Condição de Corrida
Alternativa A
Análise Conceitual:
Para resolver a condição de corrida, é necessário garantir que, durante o acesso aos recursos compartilhados, apenas um agente tenha permissão de vez. Esse conceito é chamado de Exclusão Mútua.
- Região Crítica: É o trecho de código onde variáveis compartilhadas são acessadas. Definir uma regra de que apenas um processo pode executar nessa região por vez elimina a disputa.
- Por que as outras estão erradas?
- Separar em threads (B) não resolve o conflito de acesso à memória compartilhada.
- Diminuir a velocidade (C) não ordena as operações.
- Eliminar processos (D) altera a funcionalidade do sistema, não soluciona a concorrência.
- Escalonar em diferentes CPUs (E) não impede que elas acessem a mesma memória simultaneamente.
Portanto, a definição de região crítica com exclusão mútua é a solução teórica e prática padrão.