6 de dez. de 2010

Gerenciamento de Memória Virtual (Linux)

Gerenciamento de Memória Virtual (Linux)

Em uma pesquisa feita recentemente sobre o método de gerenciamento de memória virtual, foi feita o resumo abaixo, não leve ele como uma referência didática e sim como um ideia de como é feito o gerenciamento, como exemplo dele, temos o sistema operacional Linux.
Para quem não sabe e lembrando quem já sabe, o gerenciamento da memória é o que torna o sistema operacional mais rápido e funcional.

Memória Virtual

Quando os programas tornaram-se muito grandes para a memória, a solução foi dividir os programas em pedaços menores e está técnica ficou conhecida como overlay, porém, somente o programar podia separar as partes, então Fotheringham em 1961 inventou o método de memória virtual, onde o sistema operacional é quem gerência a memória virtual – uma evolução do overlay - sua essência se baseia em que o tamanho do programa, dos dados e da pilha, juntos poderia exceder a quantidade da memória física disponível, no sistema em uso a parte principal ficava na memória principal (RAM) e as outras em disco (ROM).

Um exemplo usual para entender esse processo é, um programa de 16 Mb pode ser executado em uma máquina de 4 Mb, para tal feito é foi necessário dividir o programa em quatro partes de 4 Mb cada e executar cada parte quando for mais necessário.


A memória virtual também pode trabalhar em um sistema de multiprogramação, com pedaços de muitos programas na memória simultaneamente. Enquanto um programa está esperando parte dele próprio ser trazida para a memória, ele fica esperando a E/S e não pode executar, então, a CPU pode ser dada a outro processo, assim como em qualquer outro sistema de multiprogramação (Tanenbaum). Ainda existem algumas técnicas implementadas dentro da memória virtual que serão discutidas.


Paginação, Tabelas de Páginas e Multiníveis e Memória Associativa ou TLB


A maioria dos sistemas com memória virtual utiliza uma técnica denominada paginação. Em qualquer computador existe um conjunto de endereços de memória que os programas podem gerar ao serem executados por do uso de indexação, de registradores-base, registradores de segmento ou outras técnicas. Esses endereços são denominados endereços virtuais e constituem o espaço de endereçamento virtual, existe uma exceção para computadores com pouca memória e seus endereços virtuais são iguais aos físicos, em computadores com memória virtual, os endereços não vão direto para o barramento e sim para a MMU (Memory Management Unit – unidade de gerenciamento de memória), que mapeia endereços virtuais em endereços físicos.

O espaço de endereços virtuais é dividido em unidades chamadas páginas e o espaço de memória física é dividido em unidades chamadas quadros de página, de mesmo tamanho das páginas. A MMU tem uma tabela que indica para cada página, qual o quadro de página que corresponde à mesma. Se o processador tenta acessar o endereço 0, a MMU verifica que isto corresponde ao primeiro endereço da primeira página, verifica então que essa primeira página está alocada no terceiro quadro de página. Converte então esse endereço para 8192 (decimal) e envia o endereço convertido para a memória (nem a memória e nem o processador precisam ficar sabendo da existência de paginação). Esse processo pode ser melhor analisado observando a Figura 1.


Figura 1 – Processo de gerenciamento de memória, utilizando o método de memória virtual.
O modelo acima descreve o tratamento mais simples seria uma longa tabela de página com uma entrada por página (Essas entradas são conhecidas como entradas de tabela de páginas ou PTE - page table entries). No entanto, esta solução resultaria em uma tabela de página que seria muito grande para ser encaixada na MMU, dado que tem que ser na memória. A solução, portanto são tabelas de páginas de multiníveis. Desse modo, à medida que o tamanho dos processos crescem, novas páginas são alocadas e, quando o são, a parte da memória associada à tabela de página é preenchida. Esse método de gestão de memória que permite que o espaço de armazenamento seja não contíguo.

A paginação é suportada por hardware ou por uma combinação do hardware com o software, dividindo-se a memória física em blocos de tamanho fixo, chamados frames, cujo tamanho é uma potência de 2. A memória lógica é dividida em blocos do mesmo tamanho, as chamadas páginas.

Um endereço virtual é dividido em 5 campos: diretório de páginas (PGD), diretório superior de páginas (PUD), diretório intermediário de páginas (PMD), tabela de páginas (PTE) e deslocamento (offset). A arquitetura x86 possui um espaço de endereçamento de 32 bits; quando são utilizadas páginas de 4 KB (o padrão) o PUD e o PMD não são utilizados; o PGD e o PTE usam 10 bits cada, e o deslocamento usa 12 bits.




Figura 2 – Tabela de páginas de multiníveis.
Outro ponto importante é que a tradução de endereços virtuais para físicos tem de ser rápida. Isso requer que a tradução seja feita, tanto quanto possível no hardware. Como não é nada prático colocar a tabela de página por completo na MMU, a MMU apresenta o que é chamado de TLB (Translation Lookaside Buffer) ou Memória Associativa.

A MMU da CPU armazena o mapeamento das tabelas de página mais recentemente usadas. Esse processo é chamado Translation Lookaside Buffer (TLB). Quando um endereço virtual precisa ser traduzido em um endereço físico, a busca é feita inicialmente na TLB. Se a requisição for encontrada, o endereço físico é retornado e o acesso à memória continua. No entanto, se não foi encontrado, a CPU gera uma page fault (falha na página) e o sistema operacional terá um interrupt handler (Manipulador de Instruções) para lidar com elas.

O TLB é implementado da seguinte forma:
  • A tabela de páginas é guardada na memória principal;
  • O PTBR (Page-table base register) aponta para a tabela de páginas;
  • O PRLR (Page-table length register) indica o tamanho da tabela de páginas;
  • Qualquer acesso a dados/instruções requer 2 acessos à memória: 
  • Um para a tabela de páginas;
  • Outro para os dados/instruções;
  • O problema dos dois acessos à memória pode ser resolvido através duma cache de pesquisa rápida, designada por memória associativa ou TLBs;


Aplicação da Memória Virtual e Comentários

O Linux é um sistema operacional com memória virtual paginada, isto quer dizer que podemos ter programas em execução cujo tamanho é maior que a memória física disponível para executá-los. O sistema operacional passa a ser responsável por manter na memória as partes dos programas efetivamente em uso, deixando o resto no disco rígido. Por exemplo, um programa de 16MB pode ser executado em uma máquina de 4MB de memória, com o sistema operacional selecionando os 4MB do programa que deverão ser mantidos na memória a cada instante, com as suas partes sendo copiadas do disco rígido para a memória e vice-versa, quando necessário. A utilização da memória virtual torna o computador mais lento, embora faça com que ele aparente ter mais memória RAM do que realmente tem.

No Linux, a memória funciona com prioridade para processos que estão em execução. Quando um processo termina, havendo espaço na memória, o sistema mantém resíduos desse processo na memória para que uma possível volta a processo seja mais rápida. Caso essa memória RAM esteja lotada com processos que estão em execução, faz-se uso da memória SWAP (troca).

Cada processo do Linux, em uma máquina de 32 bits, dispõe de 3GB de espaço de endereçamento virtual para si próprio, com 1GB restante reservado para suas tabelas de páginas e outros dados do núcleo. O 1GB do núcleo não é visível quando o processo executa no modo usuário, mas torna-se acessível quando o processo faz uma chamada ao núcleo. O espaço de endereçamento é gerado quando o processo é criado e sobrescrito em uma chamada ao sistema.

A paginação fornece uma forma de se conseguir grandes espaços de endereçamento lineares em uma quantidade finita de memória física.

Nenhum comentário:

Postar um comentário