Como a memória virtual está realmente aumentando o espaço da memória?

68

Eu entendo que a memória virtual engana o programa, exibindo mais memória do que realmente está disponível.

Mas, no final, ele precisa mapear o endereço lógico para o endereço físico real. Agora, como está aumentando a memória?

    
por Ahti 10.01.2017 / 08:34

8 respostas

116

Não está aumentando a memória física . Sua finalidade é algo completamente diferente. O que ele pode fazer é disponibilizar outros armazenamentos que permitem que os programas usem mais memória do que a fisicamente disponível.

A memória virtual é usada para separar e isolar processos uns dos outros e também permitir que o acesso à memória seja desviado para locais alternativos.

A memória virtual permite que o sistema forneça a cada processo seu próprio espaço de memória isolado de outros processos. Com programas que operam efetivamente em seu próprio espaço, eles dão acesso total a todo o espaço de endereçamento, em vez de ter que trabalhar em torno de outros programas que também podem precisar usar os "mesmos" endereços. Isso tem o efeito colateral de aumentar a confiabilidade e a segurança, pois os processos não podem interferir facilmente uns com os outros.

O espaço de memória virtual de um aplicativo é construído conforme necessário. Um aplicativo parece estar (em si mesmo) em um único bloco contíguo de memória, mas pode estar completamente disperso na memória física.

A memória virtual também permite que os acessos de memória sejam interceptados e desviados, o que nos permite usar recursos como um arquivo de troca. O que isto significa é que podemos empurrar partes da memória que não foram usadas recentemente para o disco e configurar um ponteiro que diz "este bloco de memória está no arquivo x no local y" e então podemos liberar a memória física área para uso por outro aplicativo. Quando uma aplicação precisa dessa memória, ela pode ser lida de volta do disco, colocada em algum local da RAM física (potencialmente diferente de onde ela estava antes) e mapeada de volta para o mesmo local da memória virtual como era antes.

Da mesma forma que o arquivo de paginação é usado, a memória virtual também pode permitir que o sistema operacional faça o que é efetivamente o carregamento "preguiçoso" de bibliotecas compartilhadas para um programa. Quando o programa principal informa ao sistema operacional que deseja usar uma biblioteca específica, o sistema operacional pode economizar tempo verificando os requisitos da biblioteca, alocando o espaço na área de memória virtual para o aplicativo, mas em vez de carregar a biblioteca inteira pode adiar o carregamento de páginas da biblioteca do disco até que elas sejam realmente necessárias. Desta forma, as únicas partes da biblioteca que são carregadas na RAM são as partes que são realmente usadas pelo programa, as partes que nunca são usadas nunca são carregadas e, portanto, não perdem RAM.

Usando essas técnicas, melhoramos a estabilidade do sistema e permitimos que mais processos sejam executados em um espaço confinado sem que eles se afetem indevidamente uns aos outros. Não "aumenta a memória", mas nos permite usar com mais eficiência o que temos.

O arquivo de troca é ativado por sistemas de memória virtual, mas no passado era confundido como sendo a memória virtual.

    
por 10.01.2017 / 08:56
21

Explicação de Layman

O sistema terá que mapear cada endereço virtual para o endereço físico quando essa memória for usada, mas nem toda a memória é usada ao mesmo tempo . Por exemplo, suponha que você tenha 20 guias no seu navegador, cada uma com 1 GB de memória. No sistema operacional sem suporte a memória virtual, você precisaria de 20 GB de RAM para que isso funcionasse. O truque é que você não navega em todas as 20 guias ao mesmo tempo, então o sistema operacional com memória virtual permitirá que você use seu navegador com apenas alguns GB de RAM, trocando as guias inativas pelo disco.

Aspectos mais complexos

A memória virtual não é usada exclusivamente para troca. Sua principal finalidade é evitar a fragmentação de RAM, que é um grande problema em sistemas sem gerenciamento de memória virtual: você pode ter 1 GB de RAM livre, mas se ele vier em 10 MB, um aplicativo que solicite 100 MB não poderá funcionar .

Com o tempo, a memória virtual encontrou ainda mais usos, notavelmente acesso aleatório a arquivos: muitos aplicativos como bancos de dados se tornarão lentos se forem forçados a ler arquivos sequencialmente e trabalharem muito mais rápido se o sistema operacional permitir que eles fiquem todo o arquivo na memória (virtual) e otimizar o IO do disco e o armazenamento em cache com base nos padrões de acesso.

    
por 10.01.2017 / 13:55
5

A memória virtual não aumenta a memória, no sentido de realmente adicionar mais hardware de memória principal. Mas pode aumentar o intervalo de endereços utilizáveis . Assim, pode-se ter um programa em execução consistindo em um segmento de código e um segmento de dados (stack & heap), e ambos poderiam ocupar um intervalo de endereços virtuais maiores que o intervalo de físico endereços fornecidos pelo espaço de armazenamento fisicamente real da máquina. O truque é que apenas uma pequena fração desses endereços virtuais é suportada pela memória principal física a qualquer momento [mas tudo é suportado pelo armazenamento em disco] . Isso funciona devido ao fenômeno de localidade de referência : a qualquer momento, somente as instruções em uma ou mais pequenas seções contíguas do segmento de programa estão sendo executadas, e somente dados em uma ou mais pequenas seções contíguas do segmento de dados estão sendo operados em [naturalmente o comportamento é realmente mais complexo, mas ele segue esse padrão por uma grande fração do tempo]

    
por 10.01.2017 / 17:14
4

I understand that virtual memory fools the program by displaying more memory than is actually available.

A motivação original para a memória virtual era uma forma de gerenciamento de memória para fornecer um espaço de endereço maior que a memória física.
O software poderia utilizar o espaço de endereço completo da CPU (por exemplo, espaço de endereço 2 ^ 32), enquanto a memória física real instalada era apenas uma fração desse número.
Programas grandes podem ser portáteis entre computadores que usavam memória virtual sem impor grandes requisitos de memória (instalados). Esse uso da memória virtual estava de volta no dia dos computadores mainframe e da memória do núcleo de ferrite (que era de baixa densidade física e cara).

But ultimately it has to map the logical address to the actually physical address. Now how is it increasing the memory?

A memória virtual evoluiu de apenas uma técnica para fornecer mais espaço de endereçamento para o programa.
A memória virtual é um componente chave no fornecimento de segurança para cada processo em sistemas operacionais modernos, de modo que um processo não pode interferir em outro processo, nem ser comprometido por outro processo. Mas o multiprocessamento (não confunda com multiprocess ors ) com a memória virtual ainda fornece mais memória aparente para o sistema do que a memória física.

Cada processo criado é fornecido com seu próprio espaço de endereço virtual, ou seja, sua própria memória virtual.
A quantidade de memória física que é realmente usada (e mapeada para a memória virtual) para cada processo é dinâmica. Normalmente, apenas a memória virtual que contém o código (também conhecido como texto) e as páginas / segmentos de dados para executar a execução do processo é mapeada para a memória física (ou seja, residente na memória).

Código não essencial (porque não é executado no momento) e dados (porque não estão sendo referenciados / processados) não precisam estar residente na memória o tempo todo. O código e / ou páginas / segmentos de dados podem ser "trocados" para o armazenamento de apoio (por exemplo, espaço de troca ou arquivo de paginação em um HDD ou SSD) e posteriormente "trocados (de volta)" conforme necessário (também conhecido como "sob demanda"). ).

A memória virtual facilita o uso eficiente da memória física finita entre vários processos, cada um com seu próprio espaço de endereço virtual protegido. A soma dessas memórias virtuais normalmente seria maior do que a memória física instalada. A "memória aumentada" é agora da perspectiva do sistema, e não apenas da perspectiva do programa.

    
por 10.01.2017 / 22:10
3

A memória virtual aumenta a quantidade de dados que um programa pode endereçar. Do ponto de vista do software, nós (geralmente) não nos importamos onde os dados são armazenados. Ele pode ser armazenado em memória DRAM física, pode ser armazenado em uma unidade flash conectada à máquina ou pode até ser armazenado em um prato giratório. O que o software se importa é que, quando ele pede para acessar esses dados, é bem sucedido.

Na prática, também queremos que os programas sejam executados rapidamente. Para considerações de velocidade , nos importamos onde estão os dados. Queremos que os dados que estamos acessando com mais frequência sejam armazenados em hardware, o que permite o acesso mais rápido. Nossos programas gostariam que fosse executado inteiramente a partir de DRAM. No entanto, muitas vezes não temos DRAM suficiente para fazer isso. A memória virtual é uma solução.

Com a memória virtual, o sistema operacional "pagina" os dados que não foram usados por algum tempo, armazenando-os em um disco rígido. Isso ainda é acessível, apenas devagar. Se o programa solicitar dados que estão no disco rígido, o sistema operacional terá que reservar um tempo para ler os dados do disco e movê-los de volta para a DRAM.

Em teoria, ele poderia apenas ler os dados diretamente do disco. No entanto, há razões que não são feitas dessa maneira. Os programas não querem ter consciência de todas essas complicações. Podemos e escrevemos softwares que inteligentemente colocam dados em disco (é chamado de cache). No entanto, é preciso muito trabalho extra. O mais rápido que podemos fazer no código é:

if data is not in memory
    read data from disk into memory
operate on data

Um leitor perspicaz notará que, mesmo que os dados estejam na memória, precisamos ter uma condicional para verificar se ela está lá. Isso é muito mais lento do que apenas operar diretamente na memória!

A memória virtual resolve esse problema fazendo o hardware de check-in na CPU. A CPU está em condições de realizar essa operação de memória virtual com extrema rapidez, pois pode dedicar hardware a ela. Qualquer tentativa de fazer isso apenas no software deve usar as partes de propósito geral da CPU, que são naturalmente mais lentas que os transistores dedicados.

Isso leva ao motivo de sempre voltarmos os dados para a memória, em vez de apenas lê-los do disco e deixá-los assim. Nós dividimos a memória em "páginas", cada uma das quais é marcada como presente ou não presente na memória. O sistema operacional mantém essa tabela em um formato conveniente para a CPU usar diretamente. Sempre que um programa acessa dados que estão presentes, o hardware na CPU lhes dá acesso aos dados diretamente na DRAM. Quando os dados não estão presentes, uma "falha de página" é emitida, informando ao sistema operacional para carregar essa página fora do disco para uma página física de memória e atualizar a tabela para apontar a CPU nesta nova página física. / p>

A chave para todo esse problema é minimizar seu uso. Na prática, descobrimos que os sistemas operacionais são muito bons em escolher quais dados manter na memória e quais dados devem ser enviados para o disco, então a grande maioria dos acessos à memória ocorre sem nunca causar uma falha de página.

    
por 10.01.2017 / 21:01
2

Isso faz com que as entradas do mapa sejam temporárias.

Quando um programa acessa um endereço lógico, a CPU procura no mapa um endereço físico correspondente. Se for encontrado, o acesso à memória prosseguirá conforme o esperado; se não for encontrado, um endereço físico deve ser alocado e o conteúdo carregado de algum outro armazenamento - o "espaço de troca". Se cada endereço físico já tiver sido alocado para algum endereço lógico, alguns endereços lógicos deverão ser "trocados" (seu conteúdo será salvo novamente no espaço de troca) para disponibilizar endereços físicos.

A memória máxima alocada é o tamanho do espaço de troca, que pode ser muito maior que a memória instalada. Pode ser útil pensar no espaço de troca como a memória "real" e na RAM como um cache de alta velocidade para o espaço de troca.

(Isso está longe de ser uma descrição completa, ele pretende responder à pergunta imediata sem entrar em detalhes relevantes, mas desnecessários.)

    
por 11.01.2017 / 21:16
1

O conceito básico se baseia no fato de que uma CPU moderna pode gerenciar tabelas de tradução mantendo o controle de quais intervalos de endereços foram alocados a certos processos e quais endereços físicos (pense em linhas A00..Axx em um barramento de memória) , IF ANY, atualmente são usados para armazenar os dados. "IF ANY" porque "none at all" é um estado possível e aceitável: Neste caso, uma condição de erro (a chamada "falha de página") será aumentada um nível de hardware - e esse erro acionará um manipulador de nível do SO que pode, por exemplo, carregar o conteúdo da memória que foi gravado em um arquivo de troca em qualquer local livre na memória física (no caso de uma leitura) ou localizar um local real para colocar coisas (no caso de uma gravação), atualize a tabela de tradução acima mencionada, e somente então controle de mão de volta ao processo que tentou acessar aquela memória ... e qual não será o mais sábio do que aconteceu.

    
por 10.01.2017 / 11:48
0

Memória virtual:

1) permite que um grande espaço de endereçamento virtual seja mapeado para uma quantidade menor de memória física, com excesso de "trocado" para o disco, ou SSD, ou prospectivamente para NVRAM e outros dispositivos.

2) permite que um espaço de endereçamento virtual maior (por exemplo, 64 bits) seja mapeado para um espaço de endereçamento físico menor (por exemplo, 32 ou 64 bits)

3) permite que um espaço de endereçamento virtual menor (por exemplo, 32 bits) seja mapeado para um espaço de endereçamento físico maior (por exemplo, 40 bits) e, assim, permite que aplicativos mais antigos aproveitem mais DRAM física.

4) permite que a memória física fragmentada e não contígua no espaço de endereçamento físico seja contígua no espaço de endereço virtual.

5) permite que os processos recebam seus próprios espaços de endereço virtual e, portanto, sejam isolados uns dos outros.

6) permite que diferentes endereços virtuais compartilhem os mesmos valores de dados para alocar uma única página física.

Isso pode acontecer dentro de um único processo ou sistema operacional - a maioria dos SOs derivados do BSD UNIX possui uma única página de zeros somente leitura, que pode ser mapeada em qualquer página virtual preenchida com zero, geralmente COW (Copy On Write - zeros somente leitura , escreve preso e página não compartilhada e feito gravável).

Pode acontecer entre processos - por ex. O UNIX fork () cria processos filhos que compartilham quase toda a memória virtual de maneira COW.

Isso pode acontecer entre sistemas operacionais - por exemplo, Os sistemas operacionais convidados em um host de máquina virtual podem ter páginas desduplicadas, COW compartilhadas etc. (alguns ataques de segurança recentes tiraram vantagem disso.)

7) a memória virtual pode permitir que partes do espaço de endereçamento virtual sejam mapeadas para arquivos ou para a memória mapeada em outros processadores, seja no mesmo sistema de multiprocessadores ou na Internet.

    
por 17.01.2017 / 06:26