Esse documento representa parte dos meus estudos acerca do Livro - Operational Systems Three Easy Pieces, de dominio publico.


9.1 Introdução à Segmentação

A segmentação foi desenvolvida para resolver os problemas de eficiência e flexibilidade no gerenciamento de memória, que surgiram com a técnica de Base e Limite. No modelo Base e Limite, todo o espaço de endereçamento de um processo é alocado de maneira contígua, o que gera desperdício de memória, especialmente quando há grandes regiões não utilizadas entre a pilha (stack) e o heap.

9.2 Estrutura de Segmentação

O hardware precisa de alguns registradores extras no MMU (Unidade de Gerenciamento de Memória):

  • Base: Endereço físico de início do segmento.
  • Tamanho (Bounds): Define o tamanho do segmento, permitindo ao hardware detectar acessos ilegais.
  • Direção de crescimento: Um bit que indica se o segmento cresce para cima (endereços maiores) ou para baixo (endereços menores), como a pilha que cresce “para trás”.

Exemplo de tabela de segmentos:

SegmentoBaseTamanhoDireção
Código32 KB2 KBCresce+
Heap34 KB3 KBCresce +
Pilha28 KB2 KBCresce -

9.3 Tradução de Endereços com Segmentação

Passos da tradução:

  1. Identificação do segmento:

    • hardware usa os bits mais significativos do endereço virtual para identificar o segmento (ex: 00 = código, 01 = heap, 11 = pilha).
  2. Cálculo do deslocamento:

    • restante dos bits do endereço virtual é tratado como um deslocamento dentro do segmento.
  3. Verificação de limites:

    • hardware compara o deslocamento com o tamanho do segmento (Bounds). Se for maior, ocorre uma falha de segmentação.
  4. Tradução:

    • endereço físico final é calculado como: $$Endereco Fısico= Base +Deslocamento$$

9.4 Proteção e Compartilhamento

A segmentação também facilita a implementação de mecanismos de proteção e compartilhamento de memória:

  1. Bits de Proteção: Cada segmento pode ter bits de controle que definem permissões:

    • Leitura (r)
    • Escrita (w)
    • Execução (x)
  2. Compartilhamento de Código: Como o código geralmente não precisa ser modificado em tempo de execução, ele pode ser mapeado como somente leitura e compartilhado entre vários processos, economizando memória física.

9.5 Fragmentação Externa

A segmentação resolve o problema da fragmentação interna (espaço desperdiçado dentro de um segmento), mas introduz a fragmentação externa:

  1. Fragmentação Externa: Como os segmentos são de tamanhos variáveis, a memória física se fragmenta em pequenos pedaços não contíguos ao longo do tempo, dificultando a alocação de novos segmentos.

  2. Compactação de Memória: O SO pode tentar compactar a memória, movendo segmentos para liberar grandes blocos contíguos, mas isso é caro em termos de desempenho.

  3. Algoritmos de Alocação: Para minimizar a fragmentação, o SO pode adotar algoritmos como:

  • First Fit: Aloca o primeiro espaço livre que for grande o suficiente.
  • Best Fit: Aloca o menor espaço livre que acomode o segmento, minimizando sobras.
  • Worst Fit: Aloca o maior espaço livre, tentando deixar espaços maiores para futuras alocações.

9.6 Tipos de Segmentação

Existem duas abordagens principais para a segmentação:

  1. Segmentação Grossa (Coarse-Grained):
  • Poucos segmentos grandes (ex: código, heap e pilha).
  • Mais simples e rápida, mas pode desperdiçar espaço.
  1. Segmentação Fina (Fine-Grained):
  • Muitos segmentos pequenos (ex: cada função ou variável global pode ter seu próprio segmento).
  • Requer mais hardware (como tabelas de segmentos), mas oferece maior flexibilidade e eficiência no uso de memória.

Bibliografia

https://pages.cs.wisc.edu/~remzi/OSTEP/vm-segmentation.pdf