Paginação por procura
Faltas de página, FIFO, OPT, LRU, relógio, working set e thrashing.
Um processo acede à página 4, mas as suas três molduras contêm 1, 2 e 3. Se o acesso for válido, o núcleo precisa de preparar a página 4 e escolher o que sai. A paginação por procura adia essa preparação até ao uso. Funciona bem quando há localidade temporal, com reutilização recente, e espacial, com acessos a posições próximas.
Tratar uma falta de página
- A MMU encontra uma página sem presença ou uma condição de proteção e entra no núcleo.
- O núcleo verifica se o acesso é legal. Um endereço inválido ou uma escrita proibida não se resolve simplesmente lendo do disco.
- Para uma ausência recuperável, encontra uma moldura livre ou escolhe uma vítima.
- Prepara os dados, lendo o ficheiro ou swap se necessário, ou criando uma página a zero.
- Atualiza a tabela e as traduções relevantes, depois permite repetir a instrução.
Se há I/O, o processo pode bloquear e outro usar CPU entretanto. Uma falta por copy-on-write pode copiar uma página já em memória sem ler disco. O custo de falta de página não é uma constante universal.
Uma vítima suja foi alterada e pode exigir escrita antes de reutilizar a moldura. Uma página limpa de código pode ser descartada e reconstruída do executável. Não é necessário escrever todas as vítimas para swap.
Fazer uma tabela de referências
Lê primeiro as três regras: FIFO retira por ordem de entrada e ignora acertos; LRU retira pelo acesso mais antigo e cada acerto reordena; OPT retira pelo uso futuro mais distante e serve de referência mínima. Só depois preenche a tabela linha a linha, porque cada vítima depende da regra aplicada ao estado anterior.
Para resolver um exercício, escreve as páginas residentes após cada referência, marca falta ou acerto e mantém o estado da política. Molduras inicialmente vazias também provocam faltas. Um acerto pode atualizar LRU ou o bit de referência, mesmo sem substituir nada.
Vamos usar três molduras e a sequência 1, 2, 3, 1, 4, 2, 1, 3. Os números são páginas, não endereços completos.
| Referência | FIFO, ordem de entrada | LRU, da menos para a mais recente | OPT, conjunto residente |
|---|---|---|---|
| 1 | 1, falta | 1, falta | 1, falta |
| 2 | 1 2, falta | 1 2, falta | 1 2, falta |
| 3 | 1 2 3, falta | 1 2 3, falta | 1 2 3, falta |
| 1 | 1 2 3, acerto | 2 3 1, acerto | 1 2 3, acerto |
| 4 | 2 3 4, falta | 3 1 4, falta | 1 2 4, falta |
| 2 | 2 3 4, acerto | 1 4 2, falta | 1 2 4, acerto |
| 1 | 3 4 1, falta | 4 2 1, acerto | 1 2 4, acerto |
| 3 | 3 4 1, acerto | 2 1 3, falta | 1 2 3, falta |
Totais: FIFO 5, LRU 6 e OPT 5. No último passo de OPT, qualquer página que já não será usada pode sair; escolhemos 4 por convenção. Políticas diferentes podem dar o mesmo total e estados diferentes.
FIFO, OPT e LRU
FIFO retira a página que entrou há mais tempo. Um acerto não a põe no fim da fila. É simples, mas não considera utilização recente.
OPT retira a página cuja próxima utilização está mais longe no futuro, ou que não volta a ser usada. Na referência 4 do exemplo, os próximos usos de 2, 1 e 3 são os passos 6, 7 e 8. Retiramos 3. OPT serve como referência mínima para a sequência conhecida; o sistema não conhece em geral o futuro.
LRU retira a página cujo último acesso está mais longe no passado, ou seja mede localidade temporal: o que foi usado há pouco tende a voltar. Na referência 4, 2 foi usada no passo 2, 3 no passo 3 e 1 no passo 4. Retiramos 2. A localidade espacial, usar páginas vizinhas, explica por que a ordem de percurso de uma matriz importa, mas não muda esta escolha. A implementação exata pode usar tempos de último acesso ou uma lista atualizada em cada referência, com custo de manutenção. Para não confundir as duas políticas, repara que no FIFO a idade vem da entrada, enquanto no LRU vem do último acesso.
Anomalia de Belady e aproximações
FIFO pode ter mais faltas com mais molduras. Na sequência 1,2,3,4,1,2,5,1,2,3,4,5, dá 9 faltas com três molduras e 10 com quatro. Esta é a anomalia de Belady. LRU e OPT são algoritmos de pilha: os conjuntos residentes com menos molduras estão contidos nos correspondentes conjuntos com mais molduras, por isso não têm essa anomalia no modelo.
No relógio, as molduras formam um anel e uma ponteira procura uma vítima. Se o bit de referência é 1, põe-no a zero e avança. Se é 0, substitui e avança. A utilização põe o bit a 1. Esta segunda oportunidade aproxima recência sem guardar uma ordem completa.
Traça o relógio com ponteira em A e bits A=1, B=0, C=1: examina A, limpa para 0 e avança; examina B com 0, escolhe B como vítima e avança a ponteira para C. Não escolhe A só por ser a primeira. É preciso saber onde começa a ponteira e como cada acesso põe o bit a 1. Para matrizes, fixa as hipóteses antes de contar: dimensões, ordem de percurso, tamanho de página e número de molduras. Sem elas, duas contagens diferentes podem parecer contraditórias.
A segunda oportunidade melhorada considera referência e sujidade: uma página (0,0) não recente e limpa é uma boa vítima; (0,1) exige escrita. LFU retira a menos referenciada e MFU a mais referenciada, mas contagens históricas podem representar mal a localidade atual. Pools de molduras livres e escrita antecipada de páginas sujas podem reduzir o trabalho no momento da falta.
Recência, frequência e sujidade
A informação disponível determina que políticas consegues aplicar. FIFO precisa da ordem de carregamento; LRU da ordem dos últimos acessos; LFU de contagens de acessos, com uma regra de desempate. O bit de referência R só diz se houve acesso desde a última limpeza, não a idade exata nem o número de acessos.
NRU, Not Recently Used, agrupa páginas por (R,M), onde M é o bit de modificação, e escolhe da primeira classe não vazia nesta ordem:
| Classe | (R,M) | Interpretação |
|---|---|---|
| 0 | (0,0) | Sem referência recente e limpa |
| 1 | (0,1) | Sem referência recente e suja |
| 2 | (1,0) | Referenciada e limpa |
| 3 | (1,1) | Referenciada e suja |
O sistema limpa periodicamente R para observar uma nova janela. Se houver várias páginas na mesma classe, é preciso um desempate; NRU não seleciona automaticamente a de menor timestamp. Relógio e segunda oportunidade melhorada também usam bits, mas o seu percurso de procura faz parte da regra: não são substitutos da classificação NRU.
Contar faltas numa matriz
Considera uma matriz C int a[4][4], com inteiros de 4 bytes, início alinhado e páginas de 16 bytes. Cada linha ocupa exatamente uma página. O processo tem duas molduras para a matriz, inicialmente vazias, usa LRU e não há referências a outros dados neste modelo.
| Percurso | Páginas referenciadas | Faltas |
|---|---|---|
| Linhas, índice da coluna varia primeiro | 0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3 | 4 |
| Colunas, índice da linha varia primeiro | 0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3 | 16 |
Por linhas, a primeira escrita carrega a página; as três seguintes acertam nela. Por colunas, quando voltamos à página 0 já acedemos a 1, 2 e 3. Duas molduras não conservam as quatro páginas, por isso todas as referências faltam.
Com quatro molduras, os dois percursos dariam quatro faltas iniciais. O ganho não resulta só de mudar o ciclo: depende de páginas, alinhamento, número de molduras e referências concorrentes. Estes tamanhos pequenos são um modelo de exercício, não os tamanhos de página usuais de um computador.
Quanto custa uma pequena taxa de faltas
Suponhamos acesso normal ns e serviço completo de falta ms, incluindo a repetição do acesso. Com probabilidade de falta :
Mesmo uma falta em dez mil acessos aumenta o tempo médio para quase seis vezes. Para permitir no máximo 10% de aumento:
Converte milissegundos para nanossegundos antes de somar. Se o custo dado exclui o acesso repetido ou inclui uma probabilidade separada de vítima suja, adapta a fórmula.
Distribuir molduras
Alocação igual dá o mesmo número a cada processo. Alocação proporcional pode usar o tamanho: com 60 molduras e processos de 100 e 200 páginas, o primeiro recebe e o segundo 40. A quota não deve exceder as páginas que o processo pode usar; mínimos e arredondamentos também precisam de uma regra.
Na substituição local, um processo só escolhe entre as suas molduras. Na global, pode retirar molduras que estavam atribuídas a outro. A global pode aproveitar melhor a memória livre de utilização, mas também espalhar pressão entre processos. A local limita interferência, sem garantir que cada processo tenha memória suficiente.
Working set e thrashing
O working set numa janela de referências é o conjunto de páginas usadas nessa janela. Para as últimas referências 2,1,3,2,4, o conjunto é {1,2,3,4} e o tamanho é 4, não 5.
Se os processos ativos precisam em conjunto de mais molduras do que as disponíveis, podem retirar e voltar a carregar páginas continuamente. Este thrashing faz o sistema passar muito tempo em paginação e pouco em trabalho útil.
Reduzir o número de processos ativos, dar mais molduras aos conjuntos de trabalho ou controlar a frequência de faltas pode recuperar progresso. A frequência de faltas mede diretamente quando um processo precisa de mais ou menos molduras. A janela do working set é uma aproximação: curta de mais perde parte da localidade; longa de mais junta localidades antigas.
Estrutura do programa e outras escolhas
Em C, linhas de uma matriz são contíguas. Percorrer uma linha antes de passar à seguinte tende a aproveitar melhor a localidade do que saltar entre linhas, mas o número exato de faltas depende de página, dimensões e molduras. Não transfiras contagens de um exemplo para outro sem essas hipóteses.
Prepaging traz páginas antes do primeiro uso e pode evitar faltas iniciais, mas desperdiça I/O quando a previsão falha. Páginas em I/O podem precisar de ficar presas em memória para não serem substituídas a meio da transferência. Em NUMA, a memória próxima da CPU pode ser mais rápida, ligando alocação e escalonamento.
Para memória do núcleo, onde as escolhas de paginação não se aplicam diretamente: buddy divide blocos em potências de dois e junta pares compatíveis quando ambos ficam livres. Um pedido de 21 KiB pode ocupar um bloco de 32 KiB, com 11 KiB de capacidade excedente. Slab guarda conjuntos de objetos do mesmo tipo para reutilização rápida, reduzindo trabalho de inicialização e fragmentação entre objetos, mas não eliminando todo o desperdício de páginas e alinhamento. Um pedido de 21 KiB deixa 11 KiB sem uso no bloco de 32 KiB: é fragmentação interna, mesmo que os blocos livres se juntem corretamente.
Compressão pode guardar várias páginas comprimidas numa moldura, evitando parte do I/O com custo de CPU. mmap de ficheiros também aproxima I/O da gestão de páginas: aceder ao mapeamento pode provocar uma falta, e alterações partilhadas podem precisar de sincronização com o ficheiro.
Exercícios
Uma falta rara mas cara
Acesso normal de 100 ns, serviço completo de falta de 5 ms e taxa de falta 0,0001. O serviço inclui o acesso repetido. Qual é EAT em ns, a duas casas?
Pista
Mais uma pista
Solução
0,9999 × 100 + 0,0001 × 5000000 = 599,99 ns. A raridade é compensada pelo enorme custo de cada falta.
Erros frequentes
Somar 5 a 100 sem converter unidades ou acrescentar novamente o acesso já incluído.
Janela móvel e pressão de memória
A janela de cinco referências de A é 2,1,3,2,4. A próxima referência é 5. Indica o working set antes e depois de deslizar a janela. B usa quatro páginas distintas na sua janela e há oito molduras disponíveis para dados de A e B. Os working sets cabem antes e depois? Isto, por si só, prova thrashing?
Pista
Solução
Inicialmente A tem {1,2,3,4}, tamanho 4. A janela seguinte é 1,3,2,4,5, com conjunto {1,2,3,4,5}, tamanho 5. Sair a referência antiga a 2 não elimina 2 do conjunto, pois permanece outra referência a essa página.
A procura estimada passa de 4+4=8 para 5+4=9 molduras. Cabia antes, mas excede agora as oito disponíveis. É um sinal de pressão; não prova por si thrashing. É preciso observar substituições e faltas repetidas que ocupam grande parte do tempo, e a janela é apenas uma estimativa da localidade.
Confere a tua resposta:
- Obtive quatro páginas na janela inicial e cinco na seguinte.
- Retirei a referência mais antiga sem apagar a ocorrência mais recente de 2.
- Comparei a procura conjunta com as molduras disponíveis.
Refazer a ordem depois de um acerto
Usa LRU com três molduras inicialmente vazias e a sequência 1,2,3,1,4,1,2. Quantas faltas há? Regista a ordem da menos recente para a mais recente em cada passo e compara a vítima escolhida para 4 com a que FIFO escolheria.
Pista
Mais uma pista
2,3,1, por isso sai 2.Solução
As ordens são 1, 1,2, 1,2,3, 2,3,1, 3,1,4, 3,4,1, 4,1,2. Há faltas nos passos 1, 2, 3, 5 e 7, total 5. Para inserir 4, LRU retira 2, enquanto FIFO retiraria 1 porque o acerto não altera a sua ordem de entrada. O verificador confirma o total 5; a tabela de ordens pede autoavaliação, porque o número sozinho não prova o raciocínio.
Erros frequentes
Ponteira e bits do relógio
Molduras A, B e C com bits 1, 0 e 1 e ponteira em A. Descreve cada exame até à escolha da vítima e indica a posição final da ponteira. O que muda se um acesso puser o bit de B a 1 antes da procura?
Pista
Mais uma pista
Solução
Examina A com 1, limpa para 0 e avança. Examina B com 0, escolhe B e avança a ponteira para C. Se B tivesse sido usado antes, o seu bit seria 1: a procura limparia B e C antes de voltar a A, mostrando que a ordem dos acessos altera a vítima.
Confere a tua resposta:
- Registei a ponteira e os bits antes de cada exame.
- Limpei bits 1 antes de escolher a vítima.
- Escolhi o primeiro 0 a partir da ponteira.
Erros frequentes
Escolher com idades, contagens e bits
As quatro páginas residentes têm os dados seguintes. As idades são tempos decorridos, por isso um número maior significa um evento mais antigo. As contagens referem-se à residência atual. Não há empates.
| Página | Carregada há | Último acesso há | Acessos | R | M |
|---|---|---|---|---|---|
| A | 40 | 2 | 6 | 1 | 0 |
| B | 10 | 9 | 3 | 0 | 1 |
| C | 25 | 4 | 10 | 0 | 0 |
| D | 5 | 1 | 2 | 1 | 1 |
Qual é a vítima em FIFO, LRU, LFU e NRU? O bit R=0 prova que uma página nunca foi acedida? Assume que os bits foram limpos periodicamente.
Solução
FIFO escolhe A, carregada há mais tempo, 40. LRU escolhe B, cujo último acesso foi há mais tempo, 9. LFU escolhe D, com apenas dois acessos. NRU escolhe C, a única na primeira classe (R,M)=(0,0).
As quatro políticas respondem a perguntas diferentes. R=0 indica ausência de referência desde a última limpeza, não desde a criação da página. Assim, C pode ter dez acessos históricos e ainda estar na classe de NRU que recebe preferência.
Confere a tua resposta:
- Escolhi A em FIFO e B em LRU usando a maior idade correta.
- Escolhi D em LFU e C em NRU.
- Distingui contagem de acessos de referência desde a última limpeza.
Duas linhas na mesma página
Uma matriz C int a[4][4] começa no início de uma página. Cada inteiro ocupa 4 bytes e cada página 32 bytes. Conta as faltas ao escrever cada elemento uma vez, primeiro por linhas e depois por colunas. Há uma moldura para a matriz, inicialmente vazia; ignora outros acessos e usa LRU. Refaz a comparação com duas molduras inicialmente vazias.
Pista
Solução
Cada linha ocupa 4×4=16 bytes. As linhas 0 e 1 estão na página 0; as linhas 2 e 3 na página 1.
Por linhas, as oito primeiras referências usam a página 0 e as oito seguintes a página 1. Há duas faltas. Por colunas, cada coluna referencia as páginas 0,0,1,1. Com uma moldura, cada grupo dá duas faltas, por isso as quatro colunas dão oito.
Com duas molduras, as duas páginas permanecem residentes depois da primeira carga. Os dois percursos dão apenas duas faltas. Aplicar sem adaptação a conta de uma página por linha daria um resultado errado neste enunciado.
Confere a tua resposta:
- Calculei 16 bytes por linha e duas linhas por página.
- Obtive 2 faltas por linhas e 8 por colunas com uma moldura.
- Obtive 2 faltas em ambos os percursos com duas molduras.