EA075 Memória virtual Faculdade de Engenharia Elétrica e de Computação (FEEC) Universidade Estadual de Campinas (UNICAMP) Prof. Levy Boccato 1 Motivação Problema: programas cujos tamanhos ultrapassavam a capacidade da memória física. Projeto de software precisava incluir: Divisão do programa em partes (segmentos); Identificação de partes mutuamente exclusivas. Durante a execução, comandos do programa traziam as partes (segmentos) necessários do disco para a memória antes de serem referenciadas. Somente partes já presentes na memória poderiam ser referenciadas. 2 Motivação Atualmente, um processo em execução utiliza a memória para armazenar código e variáveis (dados). Além disso, o processador deve executar vários processos, sendo que cada processo tem seu espaço de memória. É necessário, portanto, compartilhar partes da memória física entre os processos. 3 Motivação Surgem dois espaços de memória: Espaço de memória endereçável por um processador (processo) – endereço virtual. Memória física instalada – endereço físico. A solução presente nos sistemas modernos de computação explora: O conceito de memória virtual. O particionamento da memória principal e dos processos em blocos (páginas ou segmentos). Um mecanismo de gerenciamento automático de endereços virtuais / físicos. 4 Memória Virtual Considere o seguinte cenário: a memória principal de um sistema de computação foi particionada em pedaços iguais de tamanho fixo, denominados frames (blocos), e que cada processo também foi dividido em blocos de tamanho fixo, denominados páginas. Quando o sistema operacional decide trazer um processo do disco para a memória principal, ele carrega as páginas que compõem este processo em blocos livres da memória principal. Os blocos livres não são necessariamente adjacentes. Se fossem, bastaria ajustar o endereço de base do processo carregado para converter os endereços lógicos (expressos como um deslocamento ou posição relativa ao início do programa) em endereços físicos. No caso geral, o sistema operacional mantém uma tabela de página para cada processo. 5 Memória Virtual Como é feito o ajuste dos endereços contidos no programa? Cada endereço virtual consiste em um número de página e um endereço relativo dentro daquela página (offset). O processador usa a tabela de páginas associada ao processo para gerar um endereço físico – dividido em número de bloco e endereço relativo dentro do bloco. Como o tamanho de página é, predominantemente, feito igual ao tamanho do bloco, o offset é o mesmo nos endereços virtual e físico. Memória principal Endereço virtual 1 Número da página 30 Offset Tabela de páginas Endereço físico 13 13 14 Número do bloco 30 Página 1 do processo 13 14 25 … Exemplo: 6 Memória Virtual Paginação por demanda: cada página de um processo somente é trazida para a memória quando for necessária. Ideia: Carregar algumas páginas de um processo na memória principal. Caso o programa desvie para uma instrução ou necessite de um dado contido em uma página que não esteja na memória principal, uma falta de página ocorrerá, o que leva o sistema operacional a trazer esta página do disco para a memória. Assim, Apenas algumas páginas de um processo permanecem na memória principal. Mais processos podem ser mantidos na memória. Tempo é reduzido, pois as páginas não utilizadas não entram e saem da memória. É possível ter um processo com tamanho maior que toda a memória principal. 7 Memória Virtual O sistema operacional precisa gerenciar este esquema de paginação de forma inteligente. Por exemplo, ao trazer uma nova página do disco, ele precisa escolher um bloco da memória principal a ser substituído. Entram em cena neste momento algoritmos de substituição de página, que são bastante parecidos com as técnicas de substituição de linha em memórias cache. Além disso, é preciso optar por uma política de escrita, tal qual ocorre com a memória cache. 8 Memória Virtual Mapeamento de endereços via tabela de páginas Endereço virtual Número de página virtual Offset Tabela de páginas Memória principal Número de bloco físico Offset Endereço físico 9 Memória Virtual Exemplo Cada página equivale a 4k bytes – 12 bits para identificar um byte (offset). Endereço virtual de 32 bits. Número de página virtual Offset 20 bits 12 bits Ao todo, existem 220 páginas diferentes. Então, a tabela de páginas possui 220 linhas. Se cada linha contém 4 bytes – incluindo o endereço físico e outras informações -, a tabela de páginas deste processo ocupa cerca de 4 MB. 10 Memória Virtual Tabela de páginas invertida Em geral, o número de páginas físicas (blocos) é menor que o número de páginas virtuais. Ideia: a parte referente ao número de página virtual é mapeada em um valor usando uma função de hash (dispersão, espalhamento) simples. Este valor serve como índice para a tabela de páginas invertida. Existe uma entrada (linha) na tabela de página invertida para cada bloco da memória física. Assim, uma proporção fixa da memória física é exigida para essa tabela, independentemente do número de processos ou páginas virtuais admitidas. Como mais de um endereço virtual pode ser mapeado na mesma linha da tabela, uma técnica de encadeamento é usada para gerenciar as situações de conflito. 11 Memória Virtual Tabela de páginas invertida Exemplo: memória física dividida em N blocos Número da página virtual Endereço virtual 0x0001 Offset 0x013 hash Índice de 1 a N 0x63 Próximo Número do bloco físico Bits de controle (e.g., validade, dirty bit) e de identificação do processo 0x01 12 Memória Virtual Tabela de páginas invertida Exemplo: memória física dividida em N blocos Número da página virtual Endereço virtual 0x0001 Offset 0x013 hash Índice de 1 a N Número da página Número do bloco Número da página Número do bloco Número da página Número do bloco Havendo colisão, os pares (número de página virtual / número do bloco físico) associados a uma linha são organizados em uma lista. 13 Memória Virtual Em tese, como a tabela de páginas é armazenada na memória, cada referência de memória virtual pode causar dois acessos à memória física: O primeiro para buscar a entrada apropriada da tabela de páginas. O segundo para buscar os dados desejados. Para evitar isto, usa-se uma memória cache especial para armazenar entradas da tabela de páginas, chamada de translation lookaside buffer (TLB). 14 Memória Virtual Translation lookaside buffer (TLB): funciona da mesma maneira que uma memória cache e deve conter as entradas da tabela de páginas que foram usadas recentemente. Pelo princípio da localidade, a maior parte das referências à memória virtual será para locais que estão nas páginas usadas recentemente. 15 Memória Virtual O esquema de tradução de endereços via TLB e tabela de páginas ocorre junto com o sistema de memória cache convencional: 1) 2) 3) 4) O sistema de gerenciamento de memória consulta o TLB para ver se a entrada da tabela de página correspondente está presente. Se estiver, o endereço físico é gerado combinando o número de bloco com o offset. Caso contrário, a entrada é acessada a partir de uma tabela de página (que está na memória). Quando o endereço físico for gerado, a memória cache é consultada para ver se o bloco contendo a palavra desejada está presente. Caso não esteja, a palavra desejada é recuperada da memória principal. 16