Pular para o conteúdo principal

Questão de Sistemas Operacionais — Gerência de Memória — FGV 2024

Sistemas OperacionaisGerência de Memória
Código
fg077394
Banca
FGV
Órgão
CVM
Ano
2024
Nível
Superior
Cargo
Analista - Perfil 8 - TI / Sistemas e Desenvolvimento - Tarde
Enquanto trabalha na otimização de um sistema operacional de alta performance, a analista Jane se depara com o desafio de aprimorar o gerenciamento de memória dos processos em execução. Sua tarefa é analisar as áreas de memória de um processo e identificar estratégias para melhorar a eficiência e a performance do sistema.Considerando as funções específicas e características de cada área de memória de um processo, a melhor estratégia para otimizar o gerenciamento de memória é:
  1. Alimitar o tamanho da Stack a um valor fixo e pequeno para todos os processos, a fim de forçar uma programação mais eficiente e evitar o uso excessivo de chamadas de função;
  2. Balocar um grande segmento de memória para o código de todos os processos, presumindo que mais espaço para código resultará em melhor performance;
  3. Cimplementar uma política de alocação de memória que ajuste dinamicamente o tamanho da Heap e da Stack com base no comportamento em tempo real dos processos;
  4. Dmanter a área de dados não inicializados (BSS) em um tamanho mínimo constante, independentemente das necessidades específicas do programa, para simplificar o gerenciamento de memória;
  5. Eaumentar o espaço dedicado ao segmento de dados inicializados, supondo que isso automaticamente otimizará o acesso a variáveis globais e constantes.
Revelar gabarito e comentário

GabaritoC — implementar uma política de alocação de memória que ajuste dinamicamente o tamanho da Heap e da Stack com base no comportamento em tempo real dos processos;

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”.

Gerenciamento de memória de processos – otimização

Gabarito: letra C. A melhor estratégia para otimizar o gerenciamento de memória é implementar uma política que ajuste dinamicamente o tamanho da Heap e da Stack conforme o comportamento em tempo real dos processos. Essa abordagem é adotada por sistemas operacionais modernos, permitindo que cada processo utilize apenas a memória necessária, sem desperdícios nem limitações artificiais.

Contexto

Um processo típico possui quatro áreas principais de memória:

  • Segmento de código (text): contém as instruções do programa – seu tamanho é fixo após a compilação.

  • Segmento de dados inicializados: variáveis globais e estáticas com valor inicial.

  • Segmento BSS (dados não inicializados): variáveis globais e estáticas sem valor inicial, zeradas na carga.

  • Stack (pilha): armazena variáveis locais, parâmetros de funções e endereços de retorno – cresce e diminui dinamicamente com chamadas de função.

  • Heap (monte): usada para alocação dinâmica de memória (ex.: malloc, new) – cresce conforme a demanda.

O gerenciamento eficiente deve equilibrar essas áreas, evitando tanto o desperdício (alocar demais) quanto a escassez (alocar de menos). A alocação dinâmica permite que Stack e Heap cresçam sob demanda, compartilhando o espaço livre entre si (muitas vezes crescem uma em direção à outra).

Análise das alternativas

Área de Memória

Função Principal

Característica de Tamanho

Estratégia de Otimização

Segmento de código (text)

Instruções do programa

Fixo após compilação

Não é alvo de otimização dinâmica

Segmento de dados inicializados

Variáveis globais/estáticas com valor inicial

Fixo após compilação

Não é alvo de otimização dinâmica

Segmento BSS (dados não inicializados)

Variáveis globais/estáticas sem valor inicial

Fixo após compilação

Não é alvo de otimização dinâmica

Stack (pilha)

Variáveis locais, parâmetros, endereços de retorno

Dinâmico (cresce/decresce com chamadas)

Ajuste dinâmico conforme demanda

Heap (monte)

Alocação dinâmica (malloc, new)

Dinâmico (cresce conforme necessidade)

Ajuste dinâmico conforme demanda

Áreas de memória do processo
  • 1Segmento de código (text)
    • Instruções do programa
    • Tamanho fixo após compilação
  • 2Dados inicializados
    • Variáveis globais/estáticas com valor
  • 3BSS (dados não inicializados)
    • Variáveis globais/estáticas sem valor
    • Zeradas na carga
  • 4Stack (pilha)
    • Variáveis locais, parâmetros, retornos
    • Cresce/decresce dinamicamente
  • 5Heap (monte)
    • Alocação dinâmica (malloc, new)
    • Cresce sob demanda
  • 6Otimização
    • Alocação dinâmica
      • Ajusta Stack e Heap em tempo real
      • Compartilham espaço livre
      • Evita desperdício e escassez
LEVEL · soulevel.com.br

Alternativa A — ❌ Incorreta

Limitar o tamanho da Stack a um valor fixo e pequeno para todos os processos ignora que diferentes programas têm necessidades distintas de profundidade de chamadas e recursão. Isso pode causar estouro de pilha (stack overflow) em programas legítimos, comprometendo a confiabilidade. A otimização não se obtém forçando limitações artificiais, mas sim com ajuste dinâmico.

Alternativa B — ❌ Incorreta

Alocar um grande segmento de código para todos os processos presume que mais espaço para código resulta em melhor performance, o que é falso. O tamanho do código é determinado pelo programa compilado; alocar além do necessário desperdiça memória sem ganho de desempenho (a performance depende da execução, não do espaço ocioso).

Alternativa C — ✅ Correta ⟵ GABARITO

Uma política de alocação que ajusta dinamicamente Heap e Stack com base no comportamento real é exatamente o que sistemas operacionais modernos fazem (ex.: crescimento automático da pilha via page fault, gerenciamento de heap com sbrk/mmap). Isso maximiza o uso da memória, evita fragmentação e atende às necessidades variáveis dos processos sem intervenção manual.

Alternativa D — ❌ Incorreta

Manter a área BSS em tamanho mínimo constante ignora que o programa pode precisar de mais variáveis globais não inicializadas. O BSS é parte integrante do programa e seu tamanho é definido em tempo de compilação; forçar um tamanho constante pode corromper dados ou impedir a execução correta.

Alternativa E — ❌ Incorreta

Aumentar o segmento de dados inicializados não otimiza o acesso a variáveis globais e constantes. O acesso depende da localidade (cache, paginação) e não do tamanho do segmento; alocar mais espaço do que o necessário apenas consome memória inutilmente.

PEGA ESSA DICA!

Em provas sobre gerenciamento de memória, lembre-se de que a abordagem moderna privilegia a alocação dinâmica e sob demanda. Alternativas que propõem limites fixos (exceto quando justificados por hardware, como em sistemas embarcados) geralmente estão erradas. Associe Stack e Heap a áreas que crescem e encolhem conforme a execução.

Gabarito: letra C.

Link permanente: /questoes/fg077394