Pular para o conteúdo principal

Questão de Sistemas Operacionais — Threads (SO) — FUNDATEC 2023

Sistemas OperacionaisThreads (SO)
Código
qa541342
Banca
FUNDATEC
Órgão
IFC
Ano
2023
Cargo
PEBTT ( )

Considerando um programa concorrente com múltiplas threads, analise as seguintes assertivas sobre o uso de travas, também conhecidas como mutex:

 

I. Uma trava pode ser usada para proteger a memória de acesso simultâneo por múltiplas threads, mas não pode impedir threads do mesmo processo de acessar o mesmo arquivo.

 

II. Usar uma trava evita que múltiplas threads leiam da e escrevam na mesma variável dentro do escopo da trava ao mesmo tempo, o que causaria resultados inconsistentes ou incorretos.

 

III. Caso o programador não use travas, o sistema operacional sincroniza as threads automaticamente, mas com uma perda de eficiência.

 

Quais estão corretas?

  1. AApenas I.
  2. BApenas II.
  3. CApenas III.
  4. DApenas I e II.
  5. EApenas II e III.
Revelar gabarito e comentário

GabaritoB — Apenas II.

Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.

Travas (mutex) em programas concorrentes

Gabarito: letra B — apenas a assertiva II está correta. Uma trava (mutex) é um mecanismo de sincronização que garante exclusão mútua: apenas uma thread por vez pode executar o trecho de código protegido (a região crítica), impedindo que múltiplas threads leiam e escrevam na mesma variável simultaneamente, o que causaria resultados inconsistentes. As assertivas I e III estão incorretas: travas podem sim proteger o acesso a arquivos (além da memória), e o sistema operacional não sincroniza threads automaticamente — sem travas, há corrida (race condition).

Uma trava, também chamada de mutex (do inglês mutual exclusion), é uma primitiva de sincronização usada para proteger uma região crítica — o trecho de código que acessa um recurso compartilhado (variável, estrutura de dados, arquivo, etc.). Quando uma thread "tranca" o mutex, nenhuma outra thread pode entrar naquela região até que a primeira a "destrave". Isso garante que operações de leitura e escrita sobre o mesmo dado sejam atômicas do ponto de vista das threads concorrentes, evitando o problema clássico de corrida (race condition), em que o resultado final depende da ordem imprevisível de execução das threads.

O conceito central é o de exclusão mútua: se duas threads executam x = x + 1 ao mesmo tempo sem trava, ambas podem ler o mesmo valor antigo de x, incrementar e escrever de volta, resultando em apenas um incremento em vez de dois — um resultado incorreto. A trava serializa o acesso: uma thread entra, executa a operação completa e só então libera para a próxima. É exatamente isso que a assertiva II descreve corretamente.

É importante distinguir trava de outros mecanismos de sincronização. O semáforo é uma generalização do mutex: possui um contador que permite controlar o acesso a um número limitado de recursos idênticos (não apenas 0 ou 1). O mutex é um caso especial de semáforo binário, mas com uma diferença importante: o mutex tem o conceito de dono — apenas a thread que o trancou pode destravá-lo —, enquanto o semáforo pode ser sinalizado por qualquer thread. Já as variáveis de condição são usadas em conjunto com mutexes para permitir que uma thread espere por uma condição específica (ex.: buffer cheio/vazio), bloqueando-se até ser notificada.

A banca explora aqui uma confusão comum: achar que o sistema operacional resolve a sincronização automaticamente. Isso é falso — a sincronização é responsabilidade do programador, que deve usar travas, semáforos ou monitores explicitamente. Sem isso, o SO apenas escala as threads de forma independente, e o acesso concorrente a dados compartilhados fica sujeito a corridas. Outra confusão frequente é achar que travas servem apenas para memória; elas também são usadas para proteger o acesso a arquivos (travas de arquivo, exclusivas ou compartilhadas), como veremos na assertiva I.

Guarde o critério decisivo: trava = exclusão mútua sobre um recurso compartilhado, imposta pelo programador. É com essa régua que vamos julgar cada assertiva.

1Função
Exclusão mútua
Protege região crítica
Evita race condition
2Recursos protegidos
Memória (variáveis)
Arquivos (file locks)
3Responsabilidade
Programador
SO não sincroniza sozinho
4Distinções
Semáforo (contador, sem dono)
Mutex (binário, com dono)
Variável de condição (espera)
Trava (mutex)
LEVELsoulevel.com.br
Trava (mutex): Função (Exclusão mútua, Protege região crítica, Evita race condition); Recursos protegidos (Memória (variáveis), Arquivos (file locks)); Responsabilidade (Programador, SO não sincroniza sozinho); Distinções (Semáforo (contador, sem dono), Mutex (binário, com dono), Variável de condição (espera))

Item I — ❌ Incorreto

A assertiva afirma que uma trava "pode proteger a memória de acesso simultâneo, mas não pode impedir threads do mesmo processo de acessar o mesmo arquivo". A primeira parte está correta, mas a segunda é falsa: travas podem sim ser usadas para proteger o acesso a arquivos. Sistemas operacionais oferecem travas de arquivo (file locks), que podem ser exclusivas (apenas um processo/thread acessa) ou compartilhadas (vários leitores, um escritor). O erro está na palavra "não pode" — a trava é um mecanismo genérico de exclusão mútua aplicável a qualquer recurso compartilhado, incluindo arquivos.

Item II — ✅ Correto

Esta assertiva descreve com precisão a função de uma trava: "evita que múltiplas threads leiam da e escrevam na mesma variável dentro do escopo da trava ao mesmo tempo, o que causaria resultados inconsistentes ou incorretos". É exatamente a definição de exclusão mútua: dentro da região crítica protegida pela trava, apenas uma thread por vez opera sobre o dado compartilhado, garantindo consistência. Sem isso, leituras e escritas concorrentes produzem resultados imprevisíveis (race condition).

Item III — ❌ Incorreto

A assertiva afirma que "caso o programador não use travas, o sistema operacional sincroniza as threads automaticamente, mas com uma perda de eficiência". Isso é falso em dois pontos: (1) o SO não sincroniza threads automaticamente — a sincronização é responsabilidade do programador, que deve usar travas, semáforos ou monitores; (2) sem travas não há "perda de eficiência", há corrupção de dados (resultados incorretos). A perda de eficiência ocorre justamente com o uso de travas, pois elas serializam o acesso e podem causar contenção. A banca inverteu completamente o sentido: sem sincronização, o problema não é desempenho, é corretude.

Conclusão: apenas o item II está correto. Portanto, o gabarito é a letra B.

Gabarito: letra B

Link permanente: /questoes/qa541342