Alternativa B - I e II
Análise Detalhada
Vamos examinar cada uma das afirmativas apresentadas sobre gerenciamento de processos e threads no Linux.
Afirmação I: Correta
"Ao criar threads com o flag CLONE_VM, o sistema assegura que todos compartilham o mesmo espaço de endereço..."
No Linux, a criação de threads geralmente utiliza a chamada de sistema clone(). O flag CLONE_VM instrui o kernel a compartilhar o espaço de memória virtual entre o processo pai e o filho. Como threads de um mesmo processo precisam acessar os mesmos dados globais e heap, compartilhar o espaço de endereçamento é fundamental para esse funcionamento.
Afirmação II: Correta
"A criação de subprocessos no Linux com uso do mecanismo de cópia na escrita (copy on write) reduz o tempo de criação ao evitar a duplicação imediata dos segmentos de memória."
Quando utilizamos fork() para criar um processo, o Linux não copia imediatamente todo o conteúdo da memória RAM para o novo processo (o que seria extremamente lento). Em vez disso, ele aplica o mecanismo Copy-on-Write (COW):
- Ambos os processos apontam para as mesmas páginas de memória físicas inicialmente.
- Se um deles tentar modificar um dado, o kernel então copia aquela página específica para o novo processo.
Isso otimiza drasticamente a criação de processos filhos.
Afirmação III: Incorreta
"A comutação de contexto entre subprocessos é menos custosa que entre threads..."
Esta afirmação inverte a realidade. A comutação de contexto (troca de execução) entre threads é muito mais rápida (menos custosa) do que entre processos/subprocessos.
- Threads: Compartilham o mesmo espaço de memória, logo, não é necessário trocar as tabelas de páginas ou limpar caches complexos como a TLB (Translation Lookaside Buffer).
- Processos: Possuem espaços de memória isolados. Trocar de processo exige atualizar o mapeamento de memória virtual, o que gera overhead significativo de hardware e software.
Conclusão
As afirmações corretas são a I e a II. A afirmação III está errada porque a troca de contexto entre processos é mais cara que entre threads devido ao isolamento de memória.
Portanto, a alternativa correta é a B.