Questão de Sistemas Operacionais — Geral — FGV 2024
Sistemas Operacionais›Geral
Código
fg165644
Banca
FGV
Órgão
INPE
Ano
2024
Cargo
Tecno Jr ( )
Multithreading é um conceito fundamental para o melhor aproveitamento de recursos por um sistema operacional.
Para o emprego eficaz desse conceito, é fundamental a existência de mecanismos de sincronização eficientes. Nesse contexto, analise as afirmativas a seguir.
I. Por definição, semáforos possuem um contador, cujos valores podem ser 0,1 ou 2.
II. Mutexes são projetados para garantir que apenas uma thread possa acessar um recurso compartilhado por vez.
III. Mutexes podem ser considerados uma generalização de semáforos, por conta da maior flexibilidade do contador de um mutex.
Está correto o que se afirma em
AI, apenas.
BII, apenas.
CIII, apenas.
DII e III, apenas.
EI, II e III.
Revelar gabarito e comentário▾
GabaritoB — II, apenas.
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”.
Sincronização: Semáforos e Mutexes
Gabarito: letra B. Apenas a afirmativa II está correta: mutexes são projetados para garantir exclusão mútua, ou seja, que apenas uma thread acesse um recurso compartilhado por vez. A afirmativa I erra ao limitar o contador de um semáforo a 0, 1 ou 2 (na verdade, ele pode assumir qualquer valor inteiro não negativo), e a afirmativa III inverte a relação entre os conceitos: o mutex é que é uma versão simplificada (binária) do semáforo, e não o contrário.
Para entender a questão, é preciso dominar dois mecanismos clássicos de sincronização entre threads e processos: o semáforo e o mutex (abreviação de mutual exclusion). Ambos resolvem o mesmo problema de fundo — impedir que duas ou mais threads entrem simultaneamente em uma região crítica (trecho de código que acessa um recurso compartilhado) — mas com modelos diferentes.
O semáforo, proposto por Dijkstra, é uma variável inteira não negativa que controla o acesso a um ou mais recursos. Ele possui duas operações atômicas: down (também chamada wait ou P), que decrementa o contador e, se ele ficar negativo, bloqueia a thread; e up (também chamada signal ou V), que incrementa o contador e, se houver threads bloqueadas, acorda uma delas. O valor inicial do contador define quantos recursos estão disponíveis: se for 1, temos um semáforo binário (que só assume 0 ou 1); se for maior que 1, temos um semáforo contador, que pode controlar um conjunto de recursos idênticos. Um exemplo clássico é o controle de vagas de um estacionamento: o contador inicia com o número total de vagas; cada carro que entra executa down (consome uma vaga) e cada carro que sai executa up (libera uma vaga). Se o estacionamento lotar, o contador chega a zero e os próximos carros ficam bloqueados até que uma vaga seja liberada.
O mutex é uma simplificação do semáforo: é um semáforo binário, cujo contador só assume dois valores — livre (1) ou ocupado (0). Ele é usado exclusivamente para garantir exclusão mútua: apenas uma thread pode manter o mutex travado por vez. As operações típicas são lock (travar) e unlock (destravar). A grande diferença prática é que o mutex tem um dono: a thread que o travou é a única que pode destravá-lo, enquanto o semáforo pode ser liberado por qualquer thread (não há dono). Além disso, o mutex não possui contador para múltiplos recursos — ele é binário por definição.
A pegadinha da questão está justamente na relação de generalização entre os dois conceitos. O texto de apoio é claro ao afirmar que os mutexes são "uma versão simplificada de semáforos, na qual o contador só assume dois valores possíveis: livre (1) ou ocupado (0)". Portanto, o semáforo é o conceito mais geral (pode ser binário ou contador), e o mutex é o caso particular (binário). A afirmativa III inverte essa hierarquia ao dizer que o mutex é uma generalização do semáforo — exatamente o oposto do que a teoria estabelece.
Guarde a fronteira entre os dois: semáforo = contador genérico (0, 1, 2, 3...) e mutex = contador binário (0 ou 1). É nessa distinção que as afirmativas I e III se separam da II.
Semáforo
1Contador genérico (0, 1, 2, 3...)
2Controla múltiplos recursos
3Sem dono (qualquer thread libera)
4Operações: down (P) e up (V)
5Mutex
Contador binário (0 ou 1)
Exclusão mútua (1 recurso)
Tem dono (só a thread que travou destrava)
Operações: lock e unlock
Caso particular do semáforo
LEVEL · soulevel.com.br
Item I — ❌ Incorreto
A afirmativa afirma que "por definição, semáforos possuem um contador, cujos valores podem ser 0, 1 ou 2". Isso é falso. O contador de um semáforo pode assumir qualquer valor inteiro não negativo (0, 1, 2, 3, ...), dependendo do número de recursos que ele controla. O valor 2 é apenas um exemplo possível, não uma limitação. O texto de apoio ilustra um semáforo inicializado com 100 (controle de vagas de estacionamento), o que demonstra que o contador não se restringe a 0, 1 ou 2. A confusão provavelmente vem do fato de que o mutex (semáforo binário) só assume 0 ou 1, mas isso não se aplica ao semáforo genérico.
Item II — ✅ Correto ⟵ GABARITO
A afirmativa está correta: "mutexes são projetados para garantir que apenas uma thread possa acessar um recurso compartilhado por vez". Essa é a definição exata de exclusão mútua, o propósito central do mutex. O texto de apoio confirma que o mutex é um semáforo binário (contador 0 ou 1) usado como trava (lock): quando uma thread executa lock, o mutex passa a 0 (ocupado) e as demais threads que tentarem lock ficam bloqueadas até que a thread dona execute unlock, devolvendo o mutex a 1 (livre). Isso garante que, em qualquer instante, no máximo uma thread esteja dentro da seção crítica protegida pelo mutex.
Item III — ❌ Incorreto
A afirmativa diz que "mutexes podem ser considerados uma generalização de semáforos, por conta da maior flexibilidade do contador de um mutex". Há dois erros aqui. Primeiro, a relação é inversa: o semáforo é a generalização (pode ser binário ou contador), e o mutex é o caso particular (semáforo binário). Segundo, o contador do mutex não é mais flexível — é menos flexível, pois só assume dois valores (0 ou 1), enquanto o semáforo pode assumir qualquer valor inteiro não negativo. O texto de apoio é explícito: os mutexes são "uma versão simplificada de semáforos, na qual o contador só assume dois valores possíveis: livre (1) ou ocupado (0)". Portanto, a afirmativa inverte tanto a relação de generalização quanto a flexibilidade do contador.
NÃO CAIA NESSA!
A banca inverte a hierarquia entre semáforo e mutex. O candidato que decora "mutex é semáforo binário" sem refletir sobre a relação de generalização pode cair na afirmativa III, que diz exatamente o oposto do que a teoria estabelece. Lembre-se: semáforo é o conceito geral (contador pode ser 0, 1, 2, 3...); mutex é o caso particular (contador só 0 ou 1).
NÃO CAIA NESSA!
Para fixar, compare os dois mecanismos lado a lado:
Critério
Semáforo
Mutex
Contador
Qualquer inteiro ≥ 0
Binário (0 ou 1)
Uso típico
Controle de múltiplos recursos
Exclusão mútua (1 recurso)
Dono
Não tem (qualquer thread pode liberar)
Tem (só a thread que travou pode destravar)
Relação
Conceito geral
Caso particular (semáforo binário)
Na prova, ao ver "generalização" ou "flexibilidade do contador", desconfie: a banca adora inverter esses conceitos.
Gabarito: letra B — apenas o item II está correto.