1. Introdução
O gerenciamento de memória é uma das funções mais críticas de um sistema operacional moderno. Ele permite que múltiplos processos compartilhem a memória principal de forma segura e eficiente, isolando seus espaços de endereçamento e otimizando o uso dos recursos disponíveis. Neste artigo, exploramos os conceitos de segmentação e paginação, dois mecanismos fundamentais para a tradução de endereços lógicos em endereços físicos.
2. Conceitos Básicos: Endereços Lógicos e Físicos
Quando um processo é executado, ele gera endereços lógicos (ou virtuais) que são independentes da memória física real. A Unidade de Gerenciamento de Memória (MMU) é responsável por traduzir cada endereço lógico em um endereço físico correspondente. Esse mapeamento pode ser feito por segmentação, paginação ou uma combinação de ambos. A MMU utiliza tabelas de segmentos e/ou páginas, armazenadas na memória principal, para realizar essa conversão de forma transparente para o processo.
3. Segmentação
A segmentação divide o espaço de endereçamento lógico em segmentos de tamanho variável, como segmento de código, dados, pilha, etc. Cada segmento possui um nome (ou número) e um deslocamento (offset). A MMU mantém uma tabela de segmentos, que associa cada segmento a uma base na memória física e a um limite. Quando o processo gera um endereço lógico na forma (segmento, deslocamento), a MMU verifica se o deslocamento é menor que o limite do segmento e, em caso positivo, soma a base ao deslocamento para obter o endereço físico.
Vantagens: proteção entre segmentos (cada segmento pode ter permissões de leitura/escrita distintas) e compartilhamento facilitado (por exemplo, compartilhar o mesmo segmento de código entre processos).
Desvantagens: fragmentação externa — a memória física pode se tornar fragmentada com buracos de tamanhos variados, dificultando a alocação de novos segmentos. Além disso, o crescimento dinâmico de segmentos exige reorganizações periódicas (compaction).
4. Paginação
Na paginação, a memória lógica é dividida em páginas de tamanho fixo (tipicamente 4 KB), e a memória física é dividida em molduras (frames) do mesmo tamanho. Cada endereço lógico é composto por um número de página (p) e um deslocamento (d). A MMU usa uma tabela de páginas para mapear cada página lógica a uma moldura física. Se a página estiver presente, o endereço físico é calculado como (endereço base da moldura + deslocamento).
Vantagens: elimina a fragmentação externa (qualquer moldura livre serve para qualquer página), simplifica a alocação e é a base para a implementação de memória virtual.
Desvantagens: a tabela de páginas pode ser muito grande (especialmente para processos com espaços de endereçamento de 32/64 bits), exigindo técnicas como tabela multinível, páginas invertidas ou o uso de Translation Lookaside Buffer (TLB) para acelerar as traduções. A TLB é uma cache de alta velocidade que armazena entradas recentes da tabela de páginas, reduzindo a necessidade de acessar a memória principal a cada referência.
5. Comparação e Combinação
A segmentação reflete a visão lógica do programa (dividido em seções de código, dados, pilha, etc.), enquanto a paginação oferece um gerenciamento eficiente da memória física sem fragmentação externa. Muitos sistemas modernos (como a arquitetura x86) combinam ambas: segmentação com paginação. Nesse modelo, a CPU gera um endereço lógico que passa primeiro pelo mecanismo de segmentação (cada segmento é dividido em páginas) e depois pela paginação (tradução de página para moldura). Essa combinação oferece as vantagens de proteção e compartilhamento da segmentação com a flexibilidade e eficiência da paginação.
6. Memória Virtual e Paginação por Demanda
A memória virtual permite que processos enxerguem um espaço de endereçamento maior que a memória física disponível. Combinada com paginação por demanda (demand paging), apenas as páginas necessárias são carregadas na RAM. Isso reduz a demanda por memória física e aumenta o grau de multiprogramação.
Quando um processo tenta acessar uma página que não está na memória principal, ocorre um page fault (falta de página). O sistema operacional interrompe o processo, localiza a página no disco (swap ou arquivo de troca), a carrega em uma moldura livre (ou substitui uma moldura ocupada conforme um algoritmo de substituição), atualiza a tabela de páginas e retoma a execução da instrução interrompida. Os algoritmos de substituição de páginas — como FIFO, LRU (Least Recently Used), Segunda Chance e o algoritmo Ótimo (teórico) — impactam diretamente a taxa de acertos (hit ratio) e o desempenho geral do sistema.
Pontos Principais
- O gerenciamento de memória é essencial para o isolamento e eficiência em sistemas multiprogramáveis.
- Endereços lógicos são traduzidos para físicos pela MMU.
- Segmentação usa segmentos de tamanho variável; oferece proteção e compartilhamento, mas causa fragmentação externa.
- Paginação usa páginas de tamanho fixo; elimina fragmentação externa e é base para a memória virtual.
- A combinação segmentação+paginação é comum em arquiteturas modernas (ex.: x86).
- Memória virtual com paginação por demanda permite executar processos maiores que a RAM física.
- Page fault é o mecanismo que carrega páginas sob demanda; algoritmos de substituição gerenciam o espaço em RAM.
Perguntas Frequentes
O que é fragmentação externa?
É a fragmentação da memória física em buracos de tamanho variado, impossibilitando a alocação de novos segmentos contínuos, mesmo que haja memória livre total suficiente. Ocorre tipicamente em sistemas baseados em segmentação.
Como a TLB acelera a paginação?
A Translation Lookaside Buffer (TLB) é uma cache de alta velocidade que armazena entradas recentes da tabela de páginas. Ela reduz a necessidade de acessar a tabela de páginas na memória principal para cada referência, melhorando significativamente o desempenho da tradução de endereços.
Como funciona um page fault?
Quando um processo tenta acessar uma página que não está na memória principal, o processador gera uma falta de página (page fault). O sistema operacional interrompe o processo, carrega a página solicitada do disco para uma moldura livre (ou substitui uma moldura ocupada) e atualiza a tabela de páginas. Em seguida, retoma a execução do processo a partir da instrução que causou a falta.
Qual a diferença entre segmentação e paginação?
A segmentação divide a memória em segmentos de tamanho variável baseados na estrutura do programa (código, dados, pilha). A paginação divide a memória em páginas de tamanho fixo, independentes da estrutura do programa. A segmentação oferece proteção e compartilhamento naturais, mas sofre de fragmentação externa; a paginação simplifica a alocação e permite memória virtual, mas pode ter tabelas grandes e overhead de tradução.