Memória
virtual é uma técnica que usa a memória secundária como uma
cache para armazenamento secundário. Houve duas motivações principais: permitir
o compartilhamento seguro e eficiente da memória entre vários programas e
remover os transtornos de programação de uma quantidade pequena e limitada na
memória principal.
A memória virtual foi
desenvolvido por volta de 1959-1962, na Universidade de Manchester para o
Computador Atlas, terminado em 1962.7 A ideia é atribuída a John Fotheringham,8
no entanto, Fritz-Rudolf Güntsch, um cientista alemão, pioneiro da ciência
computacional e, mais tarde, o criador do mainframe Telefunken TR 440, alega
ter inventado o conceito em 1957, na sua tese de doutorado Logischer Entwurf
eines digitalen Rechengerätes mit mehreren asynchron laufenden Trommeln und
automatischem Schnellspeicherbetrieb (Conceito lógico para um sistema digital
computacional com múltiplos sistemas assíncronos de armazenamento e modo de
memória rápida automática).
A memória virtual
consiste em recursos de hardware e software com três funções básicas:
(i) realocação (ou recolocação)
- para assegurar que cada processo (aplicação) tenha o seu próprio espaço de
endereçamento, começando em zero;
(ii) proteção - para impedir que um
processo utilize um endereço de memória que não lhe pertença;
(iii) paginação (paging) ou troca (swapping)
- que possibilita a uma aplicação utilizar mais memória do que a fisicamente
existente (essa é a função mais conhecida).
Simplificadamente, um
usuário ou programador vê um espaço de endereçamento virtual, que pode ser
igual, maior ou menor que a memória física (normalmente chamada memória DRAM -
Dynamic Random Access Memory).
A
memória virtual ou arquivo de paginação do Windows
é um aplicativo que permite ao sistema operacional obter mais memória RAM do
que o computador possui, ou seja, se o computador possui pouca memória, o
sistema utiliza um arquivo chamado Arquivo de Paginação que é um pequeno
arquivo, alocado no HD, utilizado como memória RAM. Este processo, evita que em
horários de pico, o sistema trave ou fique extremamente lento. Com tudo, porém,
como o arquivo fica alocado no HD, o sistema não vai ficar tão rápido quanto
utilizando a memória real do computador, já que a leitura do HD é muito mais
lenta do que a leitura da memória RAM. Assim se o computador ficar por muito
tempo neste estado (utilizando o arquivo de paginação) é recomendável aumentar
a memória RAM.
No Linux, a memória
virtual também existe, mas ela é dimensionada quanto ao seu tamanho na
instalação e somente poderá ser mudada se o disco rígido for reparticionado
novamente para utilizar uma partição maior de swap (que é assim chamado a
memória virtual do Linux), e assim, deixando a swap maior é necessário diminuir
a raiz que é onde irá ser instalado o sistema operacional e pode manipular com
todos os seus documentos.
É recomendado utilizar
como memória virtual de 2x a 3x a quantidade que o computador tiver de memória
RAM.
A memória virtual
deixou os programadores despreocupados com quanto de memória seu programa irá
precisar para rodar no computador e se o respectivo programa poderia rodar com
outros sem travar, pois a memória virtual utilizando a memória do disco rígido
tem uma memória muito maior do que os pentes de memória RAM que você encontra
hoje em dia no mercado que chegam aos seus 4 GiB, podendo o programador se
preocupar mais com a tarefa de programação do que a de quanto o programa irá
gastar de memória. Memória virtual é um conjunto de algoritmos muito bem
estipulados de maneira que conseguem fazer com que parte do disco rígido se
pareça com a memória RAM.
Funcionamento:
Existem dois mecanismos
principais para implementação da memória virtual: paginação e segmentação.
Na paginação a memória física é dividida em blocos de bytes contíguos
denominados molduras de páginas (page frames), geralmente com tamanho de 4 KiB
(arquiteturas x86 e x86-64) ou 8 KiB (arquiteturas RISC) de tamanho. Por sua
vez, o espaço de memória de um processo (contendo as instruções e dados do
programa) é dividido em páginas que são fisicamente armazenadas nas molduras e
possuem o mesmo tamanho destas.
Na segmentação existem vários espaços de endereçamento para cada
aplicação (os segmentos). Neste caso, o endereçamento consiste em um par
ordenado deslocamento, onde o deslocamento é a posição do byte dentro do
segmento.
Na arquitetura x86 (32
e 64 bits), são usadas a segmentação e a paginação.10 O espaço de endereçamento
de uma aplicação é dividido em segmentos, onde é determinado um endereço
lógico, que consiste no par [segmento:deslocamento]; o dispositivo de
segmentação converte esse endereço para um endereço linear (virtual);
finalmente, o dispositivo de paginação converte o endereço virtual para físico,
localizando a moldura de página que contém os dados solicitados.
O endereço virtual é
encaminhado para a unidade de gerenciamento de memória (MMU - Memory Management
Unit), um dispositivo do processador, cuja função é transformar o endereço
virtual em físico e solicitar este último endereço ao controlador de memória. A
conversão de endereços virtuais em físicos baseia-se em tabelas de páginas, que
são estruturas de dados mantidas pelo sistema operativo.2
As tabelas de páginas
descrevem cada página da aplicação (num sistema em execução, existe pelo menos
uma tabela de páginas por processo). Cada tabela é indexada pelo endereço
virtual e contém o endereço físico da moldura correspondente ou a indicação de
que a página está em um dispositivo de armazenamento secundário (normalmente um
disco rígido).
Como o acesso à tabela
de páginas é muito lento, pois está em memória, a MMU possui uma cache
associativa chamada buffer de tradução de endereços (TLB - Translation
Lookaside Buffer) que consiste em uma pequena tabela contendo os últimos
endereços virtuais solicitados e seus correspondentes endereços físicos.
Memória
Virtual por Paginação
A memória virtual por paginação é a técnica de
gerência de memória onde o espaço de endereçamento virtual e o espaço de
endereçamento real são divididos em blocos do mesmo tamanho chamados páginas.
As páginas no espaço virtual são denominadas páginas virtuais, enquanto as
páginas no espaço real são chamadas de páginas reais ou frames. Todo o
mapeamento de endereço virtual em real é realizado através de tabelas de
páginas. Cada processo possui sua própria tabela de páginas e cada página
virtual do processo possui uma entrada na tabela (entrada na tabela de páginas
– ETP), com informações de mapeamento que permitem ao sistema localizar a
página real correspondente.
Quando um programa é
executado, as páginas virtuais são transferidas da memória secundária para a
memória principal e colocadas nos frames. Sempre que um programa fizer
referência a um endereço virtual, o mecanismo de mapeamento localizará na ETP
da tabela do processo o endereço físico do frame no qual se encontra o endereço
real correspondente. Nessa técnica, o endereço virtual é formado pelo número da
página virtual (NPV) e por um deslocamento. O NPV identifica unicamente a
página virtual que contém o endereço, funcionando como um índice na tabela de
páginas.
O deslocamento indica a
posição do endereço virtual em relação ao início da página na qual se encontra.
O endereço físico é obtido, então, combinando-se o endereço do frame,
localizado na tabela de páginas, com o deslocamento, contido no endereço
virtual. Além da informação sobre a localização da página virtual, a ETP possui
outras informações, como o bit de validade (valid bit) que indica se uma página
está ou não na memória principal. Se o moveis bit tem valor 0, isto indica que
a página virtual não está na memória principal, mas se é igual a 1, a página
está localizada na memória. Sempre que o processo referencia um endereço
virtual, a unidade de gerência de memória verifica, através do bit de validade,
se a página que contém o endereço referenciado está ou não na memória
principal. Caso a página não esteja na memória, dizemos que ocorreu uma falta
de página (page fault). Neste caso, o sistema transfere a página da memória
secundária para a memória principal, realizando uma operação de E/S conhecida
como page in ou paginação.
O número de page faults
gerado por um processo depende de como o programa foi desenvolvido, além da
política de gerência de memória implementada pelo sistema operacional. O número
de page faults gerado por um processo em um determinado intervalo de tempo é
definido como taxa de paginação do processo. O overhead gerado pelo mecanismo
de paginação é inerente da gerência de memória virtual, porém se a taxa de
paginação dos processos atingir valores elevados, o excesso de operações de E/S
poderá comprometer o desempenho do sistema. Quando um processo referencia um
endereço e ocorre um page fault, o processo em questão passa do estado de
execução para o estado de espera, até que a página seja transferida do disco
para a memória principal. Na troca de contexto, as informações sobre a tabela
de mapeamento são salvas e as informações do novo processo escalonado são
restauradas. Após a transferência da página para a memória principal, o processo
é recolocado na fila de processos no estado de pronto, e quando for
reescalonado poderá continuar sua execução.
REFERÊNCIAS
BIBLIOGRÁFICAS
Memória virtual. Disponível em: http://pt.wikipedia.org/wiki/Mem%C3%B3ria_virtual.
Acesso em: 30 nov. 2013.
Tipos de Memória
moveis Virtual MEMÓRIA VIRTUAL POR PAGINAÇÃO. Disponível em: http://memoriavirtualunisc.blogspot.com.br/p/tipos-de-memoria-virtual.html.
Acesso em: 30 nov. 2013.
Nenhum comentário:
Postar um comentário