Ciências da computação dia 286 — OS: Gerenciamento de memória
Notas de aula sobre os fundamentos do gerenciamento de memória em sistemas operacionais.
O gerenciamento de memória é uma das funções mais essenciais de um sistema operacional moderno. Ele é responsável por controlar e coordenar o acesso à memória principal (RAM), garantindo que cada processo tenha o espaço necessário para executar, protegendo o espaço de endereçamento de cada processo e otimizando o uso da memória disponível. Durante nossas aulas de sistemas operacionais, abordamos os conceitos teóricos e práticos que formam a base para implementações em kernels modernos.
1. O Papel do Gerenciador de Memória
O gerenciador de memória atua como um intermediário entre os processos e a memória física. Suas principais responsabilidades incluem:
- Abstração de memória: Cada processo enxerga um espaço de endereçamento contíguo e privado, isolado dos demais processos.
- Proteção: Impedir que um processo acesse a memória de outro processo ou do sistema operacional.
- Compartilhamento: Permitir que processos compartilhem regiões de memória (como bibliotecas compartilhadas).
- Tradução de endereços: Converter endereços lógicos (gerados pela CPU) em endereços físicos (na RAM).
2. Alocação Contígua de Memória
Nos primeiros sistemas, a memória era dividida em partições fixas ou variáveis. Cada processo ocupava uma região contígua da memória. Este método é simples, mas sofre de fragmentação externa (espaços não utilizados entre partições) e fragmentação interna (espaço não utilizado dentro de uma partição). Técnicas como a compactação tentavam resolver a fragmentação externa, mas consumiam tempo de CPU e nem sempre eram viáveis.
3. Paginação (Paging)
A paginação resolve o problema da fragmentação externa ao permitir que o espaço de endereçamento de um processo não seja contíguo na memória física.
- A memória física é dividida em blocos de tamanho fixo chamados frames (ou molduras).
- A memória lógica é dividida em blocos do mesmo tamanho chamados pages (ou páginas).
- O sistema mantém uma tabela de páginas (page table) para cada processo, que mapeia páginas lógicas para frames físicos.
- A CPU gera um endereço lógico composto por número da página e deslocamento (offset). A MMU (Memory Management Unit) usa a tabela de páginas para encontrar o frame físico correspondente.
Para acelerar a tradução, a CPU utiliza um cache de alta velocidade chamado Translation Lookaside Buffer (TLB). Quando uma página não está na memória física, ocorre um Page Fault, e o sistema operacional carrega a página do disco (swap).
4. Segmentação (Segmentation)
A segmentação é uma abordagem que divide a memória do programa em segmentos de tamanho variável, cada um correspondendo a uma parte lógica do programa (código, dados, pilha, heap).
O endereço lógico é um par (segmento, deslocamento). O sistema mantém uma tabela de segmentos que contém a base física e o limite de cada segmento.
Vantagens: facilita o compartilhamento e a proteção de regiões específicas da memória (por exemplo, segmento de código pode ser compartilhado entre processos e marcado como somente leitura).
Desvantagem: a memória física pode sofrer de fragmentação externa, pois os segmentos têm tamanhos variáveis. Sistemas modernos frequentemente combinam segmentação com paginação para obter o melhor dos dois mundos.
5. Memória Virtual
A memória virtual é uma técnica que permite que um programa execute mesmo que seu tamanho total seja maior que a RAM física disponível. Utiliza o conceito de demand paging: as páginas são carregadas para a RAM apenas quando são necessárias.
- Swapping: Páginas e processos inteiros podem ser transferidos entre a RAM e o disco (área de swap).
- Algoritmos de substituição de páginas: Quando a RAM está cheia e ocorre um page fault, o sistema precisa escolher qual página remover. Algoritmos comuns incluem FIFO, LRU (Least Recently Used) e o algoritmo Ótimo (que serve como referência teórica).
- Thrashing: Ocorre quando o sistema gasta mais tempo fazendo swapping (trocando páginas entre RAM e disco) do que executando os processos propriamente ditos. É um sinal claro de que a memória RAM está sobrecarregada e o grau de multiprogramação pode estar muito alto.
Conclusão
O gerenciamento de memória é um tópico vasto e fundamental para qualquer estudante ou profissional de sistemas operacionais. Compreender os mecanismos de paginação, segmentação e memória virtual é essencial para entender como os sistemas modernos garantem isolamento, segurança e eficiência no uso da memória. As aulas de hoje (Dia 286) cobriram os conceitos teóricos que servem de base para implementações práticas em kernels como Linux e Windows.
Perguntas Frequentes (FAQ)
- O que é um Page Fault?
É uma interrupção gerada pela MMU quando um programa tenta acessar uma página que não está carregada na memória física (RAM). O sistema operacional então carrega a página do disco (swap) para a RAM e retoma a execução da instrução interrompida. - Qual a diferença entre Paginação e Segmentação?
Paginação divide a memória em páginas de tamanho fixo, focando em eliminar a fragmentação externa. Segmentação divide a memória em segmentos de tamanho variável baseados na estrutura lógica do programa, facilitando proteção e compartilhamento em nível de segmento. - O que é o TLB?
Translation Lookaside Buffer. É um cache de alta velocidade na CPU que armazena as traduções recentes de endereços lógicos para físicos, acelerando significativamente o acesso à memória. - O que é Thrashing?
Estado onde o sistema operacional passa mais tempo gerenciando páginas (swapping) do que executando processos. Causa uma degradação severa de desempenho e pode ser resolvido ajustando o grau de multiprogramação. - Para que serve a área de swap?
É uma área no disco rígido ou SSD que o sistema operacional utiliza como extensão da memória RAM. Quando a RAM está cheia, páginas inativas são movidas para a swap para liberar espaço para páginas ativas.