Memória virtual é uma técnica pela qual é possível
utilizar uma parte do disco rígido como se fosse memória RAM, assim sendo, o sistema operacional é capaz de executar aplicações mesmo
que a soma de todos os programas em execução simultânea supere a da memória RAM instalada no computador. Uma vantagem da técnica de
memória virtual é permitir um número maior de processos compartilhando a
memória principal, já que apenas panes de cada processo estarão residentes.
Isto leva a uma utilização mais eficiente também do processador.
Existe
um forte relacionamento entre a gerência da memória virtual e a arquitetura de
hardware do sistema computacional. Por motivos de desempenho, é comum que
algumas funções da gerência de memória virtual sejam implementadas diretamente
no hardware. Além disso, o código do sistema operacional deve levar em
consideração várias características especificas da arquitetura, especialmente o
esquema de endereçamento do processador.
Proteção de memória
Em qualquer sistema multiprogramável,
deve existir mecanismos para preservar as áreas de memória do sistema
operacional e dos diversos processos dos usuários. O sistema operacional deve
impedir que um processo tenha acesso ou modifique uma página do sistema sem
autorização. Caso uma página do sistema operacional seja indevidamente
alterada, é possível que, como conseqüência, haja uma instabilidade no
funcionamento do sistema ou sua parada completa. Até mesmo páginas dos
processos de usuários necessitam ser protegidas contra alteração, como no caso de
frames contendo código executável.
Um primeiro nível de proteção é
inerente ao próprio mecanismo de memória virtual por paginação.Neste esquema,
cada processo tem a sua própria tabela de mapeamento e a tradução dos endereços
é realizada pelo sistema. Desta forma, não é possível a um processo acessar
áreas de memória de outros processos, a menos que haja compartilhamento
explícito de páginas entre processos. A proteção de acesso é realizada
individualmente em cada página da memória principal, utilizando-se as entradas
das tabelas de mapeamento, onde alguns bits especificam os acessos permitidos.
Compartilhamento
de memória
Em sistemas que implementam memória
virtual, é bastante simples a implementação da reentrância,possibilitando
compartilhamento de código entre os diversos processos. Para isso, basta que as
entradas das tabelas de mapeamento dos processos apontem para os mesmos frames
na memória principal, evitando,assim, várias cópias de um mesmo programa na
memória.
O compartilhamento de memória também é
extremamente importante em aplicações que precisam compartilhar dados na
memória. O mecanismo de paginação permite que processos façam o mapeamento de
uma mesma área na memória e, consequentemente, tenham acesso compartilhado de
leitura e gravação.
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 de 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 páginas reais ou frames. Cada
processo possui sua própria 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.
A definição
do tamanho de página é um fator importante no projeto de sistemas que implementam
memória virtual por paginação. O tamanho da página está associado à arquitetura
do hardware e varia de acordo com o processador.
As páginas grandes tornam menor o tamanho das tabelas de páginas, ocorrendo o problema da fragmentação interna. A fragmentação só é encontrada, realmente, na última página, quando o código não ocupa o frame por completo.
O principal argumento a favor do uso de páginas pequenas é a melhor utilização da memória principal. A partir do princípio da localidade, com páginas pequenas teriamos na memória apenas as partes dos programas com maiores chances de serem executadas. Quanto maior o tamanho de página, maiores as chances de ter na memória código pouco referenciado, ocupando espaço desnecessariamente. Além disso, páginas pequenas reduzem o problema da fragmentação interna
As páginas grandes tornam menor o tamanho das tabelas de páginas, ocorrendo o problema da fragmentação interna. A fragmentação só é encontrada, realmente, na última página, quando o código não ocupa o frame por completo.
O principal argumento a favor do uso de páginas pequenas é a melhor utilização da memória principal. A partir do princípio da localidade, com páginas pequenas teriamos na memória apenas as partes dos programas com maiores chances de serem executadas. Quanto maior o tamanho de página, maiores as chances de ter na memória código pouco referenciado, ocupando espaço desnecessariamente. Além disso, páginas pequenas reduzem o problema da fragmentação interna
Memória virtual por segmentação
Memória virtual por segmentação é a
técnica de gerência de memória onde o espaço de endereçamento virtual é
dividido em blocos de tamanhos diferentes chamados segmentos. Na segmentação é
mais simples o compartilhamento de memória, pois a tabela de segmentos mapeia
estruturas lógicas e não páginas.
Enquanto na técnica de paginação o
programa é dividido em páginas de tamanho fixo. sem qualquer ligação com sua
estrutura, na segmentação existe uma relação entre a lógica do programa e sua
alocação na memória principal.
Na técnica de segmentação, apenas os
segmentos referenciados são transferidos da memória secundária para a memória
principal. Se as aplicações não forem desenvolvidas em módulos, grandes
segmentos estarão na memória desnecessariamente, reduzindo o compartilhamento
da memória e o grau de multiprogramação.
Memória virtual por segmentação com paginação
Memória virtual por segmentação com
paginação é a técnica de gerência de memória onde o espaço de endereçamento é
dividido em segmentos e por sua vez, cada segmento divido em páginas.
Nessa técnica, um endereço virtual é
formado pelo número do segmento virtual (NSV), um número de página virtual
(NPV) e um deslocamento. Através do NSV, obtém-se uma entrada na tabela de
segmentos, que contém informações da tabela de páginas do segmento. 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.
Política
de busca de busca de páginas
A política de busca de páginas determina quando uma página deve ser carregada para a memória. Basicamente, existem duas estratégias para este propósito: paginação por demanda e paginação antecipada. Na paginação por demanda (demand paging), as páginas dos processos são transferidas da memória secundária para a memória principal apenas quando são referenciadas. Na paginação antecipada (antecipatory paging ou prepaging), o sistema carrega para a memória principal, além da página referenciada, outras páginas que podem ou não ser necessárias ao processo ao longo do seu processamento.
Políticas
de alocação de páginas
Em algumas situações,
quando um processo atinge o seu limite de alocação de frames e necessita alocar
novas páginas na memória principal, o sistema operacional deve selecionar,
dentre as diversas páginas alocadas, qual deverá ser liberada. Este mecanismo é
chamado de politica de substituição de páginas.
A política de alocação
de páginas determina quantos frames cada processo pode manter na memória
principal. Existem, basicamente, duas alternativas: alocação fixa e alocação
variável. Na política de alocação fixa, cada processo tem um número máximo de
frames que pode ser utilizado durante a execução do programa. Caso o número de
páginas reais seja insuficiente, uma página do processo deve ser descartada
para que uma nova seja carregada. Na política de alocação variável, o número
máximo de páginas alocadas ao processo pode variar durante sua execução em
função de sua taxa de paginação e da ocupação da memória principal.
A política de alocação
fixa de páginas apresenta dois problemas. Se o número máximo de páginas
alocadas for muito pequeno, o processo tenderá a ter um elevado número de page
faults, o que pode impactar no desempenho de todo o sistema. Por outro lado,
caso o número de páginas seja muito grande, cada processo irá ocupar na memória
principal um espaço maior do que o necessário, reduzindo o número de processos
residentes e o grau de multiprogramação. Nesse caso o sistema pode implementar
a técnica de swapping, retirando e carregando processos da/para a memória
principal.
Políticas
de substituição de páginas
Os algoritmos de
substituição de páginas têm o objetivo de selecionar os frames que tenham as
menores chances de serem referenciados em um futuro próximo; caso contrário, o
frame poderia retornar diversas vezes para a memória principal, gerando vários
page faults e acessos à memória secundária. A partir do princípio da localidade,
a maioria dos algoritmos tenta prever o comportamento futuro das aplicações em
função do comportamento passado, avaliando o número de vezes que uma página
foi referenciada, o momento em que foi carregada para a memória principal e o
intervalo de tempo da última referência.
A melhor estratégia de
substituição de páginas seria aquela que escolhesse um frame que não fosse mais
utilizado no futuro ou levasse mais tempo para ser novamente referenciado.
Abaixo segue os
algoritmos de substituição de páginas:
•Ó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. Apesar de este algoritmo garantir as menores taxas de paginação para os processos, na prática ê impossível de ser implementado, pois o sistema operacional não tem como conhecer o comportamento futuro das aplicações.
•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, inclusive os frames que são freqüentemente referenciados. Apesar de ser uma estratégia que consome poucos recursos do sistema, é raramente implementada, em função de sua baixa eficiência.
•FIFO(First-ln-First-Out)
No FIFO, 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.
•LFU(Least-Frequently-Used)
O algoritmo LFU seleciona a página menos referenciada. Para isso, é mantido um contador com o número de referências para cada página na memória principal. O algoritmo evita selecionar páginas que são bastante utilizadas.
No FIFO, 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.
•LFU(Least-Frequently-Used)
O algoritmo LFU seleciona a página menos referenciada. Para isso, é mantido um contador com o número de referências para cada página na memória principal. O algoritmo evita selecionar páginas que são bastante utilizadas.
•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.
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.
•NRU(Not-Recently-Used)
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.
Quando uma página é carregada para a memória principal, o bit de referência é alterado pelo hardware, indicando que a página foi referenciada (BR = 1). Periodicamente, o sistema altera o valor do bit de referência (BR = 0), e à medida que as páginas são utilizadas, o bit associado a cada frame retorna para 1. Desta forma, é possível distinguir quais frames foram recentemente referenciados.
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.
Quando uma página é carregada para a memória principal, o bit de referência é alterado pelo hardware, indicando que a página foi referenciada (BR = 1). Periodicamente, o sistema altera o valor do bit de referência (BR = 0), e à medida que as páginas são utilizadas, o bit associado a cada frame retorna para 1. Desta forma, é possível distinguir quais frames foram recentemente referenciados.
•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). A LPA organiza as páginas alocadas há mais tempo na memória no início da lista, enquanto as páginas mais recentes no seu final. Da mesma forma, a LPL organiza todos os frames livres da memória principal, , sendo que as páginas livres há mais tempo estão no início e as mais recentes no final.
O algoritmo FIFO com buffer de páginas combina uma lista de páginas alocadas (LPA) com uma lista de páginas livres (LPL). A LPA organiza as páginas alocadas há mais tempo na memória no início da lista, enquanto as páginas mais recentes no seu final. Da mesma forma, a LPL organiza todos os frames livres da memória principal, , sendo que as páginas livres há mais tempo estão no início e as mais recentes no final.
•FIFO
circular (clock)
Para a implementação do algoritmo existe um ponteiro que guarda a posição da página mais antiga na lista. Cada página possui associado um bit de referência, indicando se a página foi recentemente referenciada. Quando é necessário substituir uma página, o sistema verifica se o trame apontado tem o bit de referência desligado (BR = 0). Nesse caso, a página é selecionada para descarte, pois, além de ser a mais antiga, não foi utilizada recentemente. Por outro lado, se a página apontada tem o bit de referência ligado (BR = 1), o bit é desligado e o ponteiro incrementado, pois, apesar de ser a página mais antiga, foi utilizada recentemente. O processo se repete até ser encontrada uma página com bit de referência igual a zero.
Para a implementação do algoritmo existe um ponteiro que guarda a posição da página mais antiga na lista. Cada página possui associado um bit de referência, indicando se a página foi recentemente referenciada. Quando é necessário substituir uma página, o sistema verifica se o trame apontado tem o bit de referência desligado (BR = 0). Nesse caso, a página é selecionada para descarte, pois, além de ser a mais antiga, não foi utilizada recentemente. Por outro lado, se a página apontada tem o bit de referência ligado (BR = 1), o bit é desligado e o ponteiro incrementado, pois, apesar de ser a página mais antiga, foi utilizada recentemente. O processo se repete até ser encontrada uma página com bit de referência igual a zero.
Swapping
A
técnica de swapping em memória virtual possibilita a uma aplicação utilizar
mais memória do que a fisicamente existente.
Quando existem novos processos para serem executados e não há memória principal livre suficiente para alocação, o sistema utiliza o swapping, selecionando um ou mais processos para saírem da memória e oferecer espaço para novos processos. Depois de escolhidos, o sistema retira os processos da memória principal para a memória secundária (swap out), onde as páginas ou segmentos são gravados em um arquixo de swap (swap file). Com os processos salvos na memória secundária, os trames ou segmentos alocados são liberados para novos processos.
Quando existem novos processos para serem executados e não há memória principal livre suficiente para alocação, o sistema utiliza o swapping, selecionando um ou mais processos para saírem da memória e oferecer espaço para novos processos. Depois de escolhidos, o sistema retira os processos da memória principal para a memória secundária (swap out), onde as páginas ou segmentos são gravados em um arquixo de swap (swap file). Com os processos salvos na memória secundária, os trames ou segmentos alocados são liberados para novos processos.
Trhashing
O trhashing é a excessiva
transferência de páginas/segmentos entre a memória principal e a secundária.
Na memória virtual por paginação, o
thrashing ocorre em dois níveis: no do próprio processo e no do sistema. No
nível do processo, a excessiva paginação ocorre devido ao elevado número de
page faults gerado pelo programa em execução.
O thrashing no sistema ocorre quando existem mais processos competindo por memória principal que espaço disponível.
O thrashing em sistemas que implementam segmentação também ocorre em dois níveis. No nível do processo, a transferência excessiva de segmentos é devida à modularização extrema do programa.
O thrashing no sistema ocorre quando existem mais processos competindo por memória principal que espaço disponível.
O thrashing em sistemas que implementam segmentação também ocorre em dois níveis. No nível do processo, a transferência excessiva de segmentos é devida à modularização extrema do programa.