Memoria virtual é uma técnica
sofisticada e poderosa de gerencia de memoria, onde as memorias principal e
secundária são combinadas, dando ao usuário a ilusão de existir uma memória
muito maior que a capacidade real da memória principal, fundamenta-se em vão
vincular o endereçamento feito pelo programa. Existe uma forte relação entre o
gerenciamento de memória virtual e a arquitetura de hardware do computador, por
motivos de desempenho sendo implementadas algumas ações da memoria virtual para
o hardware. O compartilhamento de memória é extremamente importante em
aplicações que precisam compartilhar dados de memória principal.
Parecido com o compartilhamento de
códigos, o mecanismo de paginação permite que processos façam o mapeamento de
uma mesma área na memoria e tendo acesso compartilhamento de leitura e
gravação.
A memoria virtual por paginação é a
forma de gerenciamento de memoria onde o espaço de endereçamento virtual e o
espaço de endereçamento real são divididos em blocos iguais em tamanho
chamando-se paginas. Paginas no espaço virtual são chamadas paginas virtuais e
paginas no espaço real são denominados paginas reais ou frames. Podemos apontar
como politicas de busca de paginas a paginação por demanda que são as paginas
do processo são transferidas da memória secundária para a principal somente
quando referenciadas; na paginação antecipada o sistema carrega para a memoria
principal, além da pagina referenciada outras que podem ou não ser necessárias
ao processo ao longo do seu processamento isto pode ser aplicada na criação de
um processo ou na ocorrência de um page
fault. As politicas de alocação de páginas determina quantos frames cada
processo pode manter na memoria principal tendo assim duas alternâncias básicas:
Alocação Fixa e Alocação Variável. Os dois problemas são se o numero máximo de
paginas alocadas for muito pequeno, o processo tenderá a ter um elevado numero
de page faults, o que pode impactar no funcionamento do sistema e o outro é no
caso o numero de paginas seja muito grande, cada processo irá ocupar na memoria
principal um espaço maior do que o necessário, reduzindo o numero de processos
residentes e o grau de multiprogramação.
As Politicas de substituição de
páginas é o processo quanto atinge o seu
limite de alocação de frames e necessita alocar novas paginas na memoria
principal, o sistema operacional deve selecionar, dentre diversas paginas
alocadas, qual deverá ser liberada.
Os
algoritmos de substituição de página são:
Ótimo:
O
algoritmo ótimo seleciona para substituição uma página que não será mais
referenciada no futuro ou aquela que levará o maior intervalo de tempo para ser
novamente utilizada.
Aleatório:
O
algoritmo aleatório, como o nome já sugere, não utiliza critério algum de seleção.
Todas as páginas alocadas na memória principal têm a mesma chance de serem
selecionadas.
FIFO (First-ln-First-Out):
No
algoritmo FIFO. a página que primeiro foi utilizada será a primeira a ser escolhida,
ou seja, o algoritmo seleciona a página que está há mais tempo na memória
principal. O algoritmo pode ser implementado associando-se a cada página o
momento em que foi carregada para a memória ou utilizando-se uma estrutura de
fila, onde as páginas mais antigas estão no início e as mais recentes no final.
O
algoritmo FIFO é raramente implementado sem algum outro mecanismo que minimize
o problema da seleção de páginas antigas que são constantemente referenciadas.
LFU
(Least-Frequently-Used):
O
algoritmo LFU seleciona a página menos referenciada, ou seja, o frame menos
utilizado. Para isso, é mantido um contador com o número de referências para
cada página na memória principal. Este esquema, como apresentado, é raramente
implementado, servindo apenas de base para outros algoritmos de substituição.
LRU
(Least-Recently-Used):
O
algoritmo LRU seleciona a página na memória principal que está há mais tempo
sem ser referenciada. Se considerarmos o princípio da localidade, uma página
que não foi utilizada recentemente provavelmente não será referenciada
novamente em um futuro próximo.
Para
implementar esse algoritmo, é necessário que cada página tenha associado o
momento do último acesso, que deve ser atualizado a cada referência a um frame.
Quando for necessário substituir uma página, o sistema fará uma busca por um
frame que esteja há mais tempo sem ser referenciado. Apesar de ser uma
estratégia com uma eficiência comparável ao algoritmo ótimo, é pouco empregada
na prática, devido ao seu elevado custo de implementação.
NRU (Not-Recently-Used):
O
algoritmo NRU é bastante semelhante ao LRU. porém com menor sofisticação. Para
a implementação deste algoritmo é necessário um bit adicional, conhecido como
bit de referência (BR). O bit indica se a página foi utilizada recentemente e
está presente em cada entrada da tabela de páginas.
FIFO com buffer de páginas:
O
algoritmo FIFO com buffer de páginas combina uma lista de páginas alocadas
(LPA) com uma lista de páginas livres (LPL). É importante notar que a página
selecionada e que entrou na LPL continua disponível na memória principal por
um determinado intervalo de tempo. a página não for mais referenciada, com o
passar do tempo irá chegar ao início da LPL. quando será utilizada para um
outro processo. Caso a página seja posteriormente referenciada, o sistema terá
que carregá-la novamente da memória secundária.
FIFO circular (clock):
O
algoritmo FIFO circular utiliza como base o FIFO, porém as páginas alocadas na
memória estão em uma estrutura de lista circular, semelhante a um relógio. Os algoritmos
de substituição de página tem como objetivo selecionar os frames que tenham as
menores chances de serem referenciadas em um futuro próximo. A melhor
estratégia se substituição será aquela que escolhesse um frame que não fosse
mais utilizado no futuro ou levasse mais tempo para ser novamente referenciado.
O principal argumento para o uso de paginas pequenas é a melhor utilização da
memória principal.
A
técnica de partições fixas gera muita perda de memória e não é mais utilizada
na prática. Embora
partições
variáveis seja um mecanismo mais flexível, o desperdício de memória em função
da
fragmentação
externa é um grande problema
Em sistemas multiprogramaveis, onde
diversas aplicações compartilham a memoria principal devem existir mecanismos
para preservar as áreas de memória do sistema operacional e dos diversos
processos dos usuários. O sistema operacional deve impedir modificações sem
autorização, se modificado pode gerar certa instabilidade no sistema.
Memoria
virtual por segmentação é o gerenciamento de memoria onde o espaço de endereçamento
virtual é dividido em blocos de tamanhos diferentes chamados segmentos. Um
programa é dividido logicamente em sub-rotinas e estruturas de dados, que são
alocados em segmentos na memoria principal.
Memoria virtual por segmentação com
paginação é o gerenciamento de memoria onde o espaço de endereçamento é
dividido em segmentos, cada segmento dividido em paginas oferecendo vantagens
técnicas de paginação e segmentação.
Swapping
é quando não se há memoria principal livre para certo processo, sendo assim
selecionado um ou mais processos para saírem da memoria e oferecerem espaço
para novos processos.
Thrashing é a definição da excessiva
transferência de paginas e segmentos entre a memoria principal e memoria
secundária. Esse problema está presente em sistemas que implementam tanto
paginação como segmentação.
Podemos
apontar dois níveis, sendo eles no nível do processo, a excessiva paginação
ocorre devido ao elevado numero de page faults, e o segundo nível é o do
sistema.