Professor: Gabriel Soares Baptista
Hoje veremos como o SO cria a ilusão de uma memória grande, contínua e privada para cada processo.
Problema central: como executar programas cujo espaço de endereçamento é maior que a RAM física, sem obrigar o programador a dividir tudo manualmente?
Antes: overlays. Programa dividido manualmente em módulos pelo programador. Trabalhoso, sujeito a erro.
Memória virtual: troca a unidade de transferência — mover pedaços do espaço, não o processo inteiro. O processo enxerga um espaço próprio dividido em páginas.
| Termo | Definição |
|---|---|
| Página | Bloco de tamanho fixo do espaço virtual |
| Quadro de página | Bloco do mesmo tamanho na RAM |
| Endereço virtual | Gerado pelo programa |
| Endereço físico | Posição real na RAM |
| MMU | Traduz endereço virtual → físico |
Espaço virtual de 16 bits = 64 KB. RAM de 32 KB. Páginas de 4 KB.
Mais páginas virtuais que quadros físicos. Nem todas podem estar na RAM.

Páginas de 4 KB = $2^{12}$ = 12 bits de deslocamento.
Endereço de 16 bits: 4 bits de página + 12 bits de deslocamento.
Tradução: número da página virtual → índice na tabela de páginas → quadro físico. O deslocamento não muda.
Endereço virtual $8196$:
Se página 2 está no quadro 6: $6 \cdot 4096 + 4 = 24580$
$8196_{virtual} \rightarrow 24580_{físico}$
Ocorre quando a página virtual acessada não está presente na RAM.

| Campo | Função |
|---|---|
| Quadro físico | Onde a página está na RAM |
| Presente/ausente | 1 = presente, 0 = falta |
| Proteção | Leitura, escrita, execução |
| Modificada (M) | Foi alterada? (suja) |
| Referenciada (R) | Foi acessada recentemente? |
A tradução acontece em todo acesso à memória. Sem aceleração, o custo dobra.
TLB: pequena memória associativa dentro da MMU que guarda traduções recentes.
Programas têm localidade de referência: usam poucas páginas por vez.

TLB hit: tradução está na TLB → acesso instantâneo
TLB miss: não está na TLB → consulta a tabela de páginas
| Tipo de miss | Significado | Custo |
|---|---|---|
| Ausência leve | Página na RAM, não na TLB | poucas instruções |
| Falta menor | Página na RAM, não mapeada | atualiza tabela |
| Falta maior | Página não está na RAM | acesso ao disco |
Espaço virtual de 32 bits com páginas de 4 KB: $2^{20}$ páginas (1 milhão).
Espaço de 64 bits: número impraticável.
Duas soluções:

Endereço de 32 bits: PT1 (10) + PT2 (10) + deslocamento (12)
PT1 → tabela nível 1 → PT2 → tabela nível 2 → quadro físico
Ganho: regiões vazias do espaço não precisam de tabelas de nível 2.
| Tradicional | Invertida | |
|---|---|---|
| Indexada por | página virtual | quadro físico |
| Entradas | uma por página virtual | uma por quadro da RAM |
| Tamanho depende de | espaço virtual | memória física |
Vantagem: economiza MUITA memória em espaços de 64 bits.
Custo: não dá para usar a página como índice direto → precisa de TLB + hash.
Quando a RAM está cheia e ocorre uma falta: qual página remover?
Escolha ruim = nova falta quase imediata.
Escolha boa = remove página pouco provável de ser usada em breve.
Remove a página cujo próximo uso está mais distante no futuro.
Não é implementável: o SO não conhece o futuro.
Serve como referência para avaliar outros algoritmos.
Usa os bits $R$ (referenciada) e $M$ (modificada). $R$ é limpo periodicamente.
| Classe | $R$ | $M$ | Significado |
|---|---|---|---|
| 0 | 0 | 0 | não referenciada, limpa |
| 1 | 0 | 1 | não referenciada, suja |
| 2 | 1 | 0 | referenciada, limpa |
| 3 | 1 | 1 | referenciada, suja |
Remove página aleatória da menor classe não vazia.
Parece contraditório: suja mas não referenciada?
Explicação: página de classe 3 (R=1, M=1) recebe interrupção de relógio → $R$ é zerado, $M$ permanece → vira classe 1.
Isso distingue páginas ativas há pouco das ativas agora.
Mantém páginas em ordem de chegada. Remove a mais antiga.
Problema: a mais antiga pode ser muito usada. Idade ≠ inutilidade.
Exemplo com 3 quadros: $1, 2, 3, 4, 1$
Melhora o FIFO: examina o bit $R$ da página mais antiga.
Se todas têm $R=1$, o algoritmo dá a volta e remove a primeira que ficou com $R=0$.

Mesma ideia da segunda chance, mas sem mover páginas na fila.
Quadros em lista circular. Ponteiro avança como relógio.

Remove a página não usada há mais tempo.
Intuição: passado recente é bom preditor do futuro próximo.
Problema: implementar exato exigiria atualizar estruturas a cada acesso. Caro demais sem hardware especial.
Simula LRU em software com contadores de $n$ bits.
A cada interrupção de relógio:
Referências recentes pesam mais que antigas. Remove página com menor contador.

Localidade de referência: programa usa um conjunto pequeno de páginas por fase.
Conjunto de trabalho: páginas usadas nas últimas $k$ referências (ou nos últimos $\tau$ segundos).


Destaques práticos: Envelhecimento (aproxima LRU) e WSClock (aproxima conjunto de trabalho).
SO participa da paginação em 4 momentos:
Outra visão: em vez de espaço linear único, o processo tem vários espaços independentes chamados segmentos.
Cada segmento: código, pilha, tabela de símbolos, constantes, etc.

Endereço: $(\text{segmento},\ \text{deslocamento})$
| Critério | Paginação | Segmentação |
|---|---|---|
| Unidade | página | segmento |
| Tamanho | fixo | variável |
| Visão | gerencial | lógica |
| Fragmentação | interna | externa |
| Visível ao programador? | não | sim |

Segmentação pura: segmentos contíguos na RAM → fragmentação externa.

Segmentação com paginação: cada segmento é paginado. MULTICS, Intel x86. Combina organização lógica com flexibilidade física.
Na próxima parte, a base de memória virtual será essencial para entender: