. Segmentacao
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:
| Segmento | Base | Tamanho | Direção |
|---|---|---|---|
| Código | 32 KB | 2 KB | Cresce+ |
| Heap | 34 KB | 3 KB | Cresce + |
| Pilha | 28 KB | 2 KB | Cresce - |
9.3 Tradução de Endereços com Segmentação
Passos da tradução:
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).
Cálculo do deslocamento:
- restante dos bits do endereço virtual é tratado como um deslocamento dentro do segmento.
Verificação de limites:
- hardware compara o deslocamento com o tamanho do segmento (Bounds). Se for maior, ocorre uma falha de segmentação.
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:
Bits de Proteção: Cada segmento pode ter bits de controle que definem permissões:
- Leitura (r)
- Escrita (w)
- Execução (x)
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:
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.
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.
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:
- 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.
- 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.

