Memória Virtual

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

Postagens mais visitadas deste blog

Transferência de arquivo por FTP

TIPOS DE PROCESSOS

Tipos de Servidores