A memória virtual é uma técnica que os SOs utilizam para gerenciar a memória
que permite que os processos (programas) consigam endereçar muito mais memória do que a fisicamente disponível (DEITEL, 2005). A ideia básica da memória
virtual é que o tamanho combinado do programa e seus dados podem exceder a
quantidade de memória física disponível para o mesmo (TANNENBAUM, 2016).
A memória virtual disponibiliza para os programas uma quantidade de memória
que é a soma da memória primária (RAM) com uma área de troca de dados em
disco, denominada área de swap. O swapping é uma técnica que retira os dados
que não estão em uso da memória primária (RAM) e armazena temporariamente
em uma área de troca do disco rígido e transfere do disco rígido para a memória
RAM, sempre que for referenciada ou necessária.
A memória virtual pode ser implementada basicamente por meio dos seguintes
mecanismos:
a) Paginação: técnica em que o espaço de endereçamento virtual é dividido em
blocos, denominados páginas, de tamanho e posição fixas, geralmente com um
tamanho de 4kB, aos quais se associa um número. O SO efetua um mapeamento
das unidades de alocação em endereços de memória, determinando também quais
estão presentes na memória física e quais estão nos arquivos de troca;
b) Segmentação: técnica em que o espaço de endereçamento virtual é dividido
em blocos de tamanho fixo ou variável, definidos por um início e um tamanho de
acordo com o segmento, que pode ser um conjunto de variáveis ou um conjunto
de rotinas de um programa, cuja posição também pode ser fixa ou variável. O SO
mapeia estes blocos em endereços de memória, efetuando um controle de quais
blocos estão presentes na memória física e quais estão nos arquivos de troca.
Estas duas técnicas só podem ser implementadas se o processador dispuser de
mecanismos de deslocamento dos endereços referenciados pelo programa para as
regiões de memória que efetivamente serão usadas, com um sofisticado mecanismo de endereçamento de memória mantido pelo SO e implementados como uma
unidade de gerenciamento de memória ou Memory Management Unit (MMU).
Além dos mecanismos de paginação ou segmentação, a memória virtual exige
a disponibilização de espaço nos dispositivos de armazenamento secundário para
a criação de um ou mais arquivos de troca – os swapfiles.
A memória total de um sistema é, portanto, a soma de sua memória física (de
tamanho fixo) com a memória virtual do sistema. O tamanho da memória virtual
do sistema é definido por, basicamente, o menor valor dentre os seguintes:
- Capacidade de endereçamento do processador,
- Capacidade de administração de endereços do sistema operacional e
- Capacidade de armazenamento dos dispositivos de armazenamento secundário
(unidades de disco).
Para implementar a memória virtual, a maioria dos SOs modernos utiliza as técnicas
de paginação combinadas com a segmentação e os sistemas híbridos que utilizam a
paginação combinada com segmentação, e são implementadas tabelas para realizar
a conversão de endereços virtuais em endereços físicos. Estas tabelas, suportadas
diretamente pelo hardware do sistema e mantidas pelo SO são, juntamente com
os mecanismos de conversão de endereços, o ponto central destes esquemas de
organização de memória.
Neste modelo de gerenciamento, o endereço virtual é composto de duas partes,
um número da página virtual e um deslocamento dentro da página. O número da
página virtual é usado como índice em uma tabela de páginas, ou seja, é somado
ao endereço de base da tabela de páginas, mantido em um registrador qualquer
do processador, obtendo-se uma referência para uma entrada da tabela que contêm o endereço real da moldura de página desejada. Somando-se o deslocamento,
contido no endereço virtual, ao endereço da moldura de página, obtido da tabela
de páginas, obtêm-se o endereço real completo.
Os mecanismos de memória virtual baseiam-se no fato de que os processos são
armazenados em várias páginas da memória e que algumas destas páginas podem
estar armazenadas em arquivos especiais denominados arquivos de troca (swap
file). Quando um processo necessita acessar uma porção de seu código cuja página
não esteja na memória real, ocorre um pagefault, ou seja, é detectada a falta de
uma página que deverá ser carregada novamente para a memória principal.
As operações de substituição de páginas são lentas, pois envolvem uma interrupção do processamento e o acesso à memória secundária, ou seja, necessitam
acessar dispositivos de entrada e saída, muito mais lentos do que a memória primária.
Se a página substituída for necessária em breve ou for preciso um número
muito grande de substituições para execução dos programas ativos, ocorrerá a
hiperpaginação (hiperpaging ou thrashing) ou seja, uma degradação significativa
da performance do sistema, devido ao excesso de operações de troca de páginas,
normalmente quando os programas estão exigindo bem mais memória física do
que a instalada.
Desta forma, o SO precisa prover um mecanismo capaz de identificar quais
páginas da memória não estão em uso (ou não serão necessárias logo) e movê-las
para a área de swap do disco. O grande problema consiste, então, em determinar
qual página será substituída ou copiada para os arquivos de troca, como forma de
liberar espaço para aquela página que se tornou necessária. Um algoritmo ótimo de
troca de páginas deveria ser capaz de identificar qual página não mais será utilizada
ou estabelecer aquela que demorará mais a ser novamente utilizada, minimizando
a ocorrência de pagefaults e, com isto, as operações de troca de páginas. Como
não é possível realizar tal previsão, outras formas de se definir qual página será
substituída são empregadas (DEITEL, 2005).
Os algoritmos que tratam deste problema são aqueles que implementam as
estratégias de substituição (replacementstrategies) e são denominados algoritmos
de troca ou algoritmos de substituição de páginas. Os algoritmos de substituição
de páginas mais comuns são os que implementam uma fila simples ou utilizam
alguma técnica mais complexa marcando as páginas que foram referenciadas ou
modificadas nos últimos instantes, removendo aquelas que estão há mais tempo sem serem utilizadas.
A técnica de página é utilizada para facilitar a movimentação de pequenas páginas
(4Kb) entre a memória RAM e o arquivo do disco rígido, porém esta técnica gera um
grande número de pagefaults, pois as páginas não têm o menor contexto com as
demais. Para contornar essa deficiência, é associada a ela a técnica de segmentação,
que divide o programa em segmentos cujos blocos têm grande relação. Assim, o
algoritmo de substituição de página carrega e retira, cada vez, todas as páginas ou
a maioria das páginas de um mesmo segmento de um programa.
Comentários
Postar um comentário