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


70

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

Mas, em última análise, ele precisa mapear o endereço lógico para o endereço realmente físico. Agora, como está aumentando a memória?


12
Esse é o conceito antigo. 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. Mas foi aí que a memória era de baixa densidade e muito cara. Atualmente, o principal motivo para o uso de memória virtual é a segurança do processo.
serragem

2
"Agora, como está aumentando a memória?". Não faz. O aplicativo não está ciente de memória física do sistema é apenas cientes da memória virtual que é a razão quando um aplicativo reclama de não ter memória suficiente ele está falando sobre a memória virtual e não memória física
Ramhound

2
Lembre-se de que os sistemas de memória virtual são bastante inteligentes. Se n processos tiverem a mesma página somente leitura, todos os n processos poderão usar a mesma página de memória física.
precisa saber é o seguinte

65
Não pense na memória virtual como enganando nada. Memória é a capacidade abstrata de armazenar e recuperar dados . A memória virtual fornece uma implementação para essa abstração. O fato de parte da abstração ser apoiada pela RAM e parte do disco é um detalhe de implementação da abstração.
precisa saber é o seguinte

4
@HagenvonEitzen Não tenho certeza de como a memória está "sempre" no disco ... além das páginas lidas originalmente no disco, a menos que uma página seja trocada, seu conteúdo pode nunca estar no disco, e isso é especialmente verdade para as páginas fixadas na memória, por exemplo devido a ser crítico para a funcionalidade do kernel.
Michael

Respostas:


116

Não está aumentando a memória física . Seu objetivo é algo completamente diferente. O que ele pode fazer é disponibilizar outras lojas de backup que permitem que os programas usem mais memória do que a disponível fisicamente.

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

A memória virtual permite que o sistema dê a cada processo seu próprio espaço de memória isolado de outros processos. Com os programas operando efetivamente em seu próprio espaço, ele oferece acesso total a todo o espaço de endereço, em vez de precisar solucionar 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 entre si.

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

A memória virtual também permite que os acessos à memória sejam interceptados e desviados, o que nos permite usar recursos como um arquivo de troca. O que isso significa é que podemos enviar partes da memória que não foram usadas recentemente para o disco e configurar um ponteiro que diz "esse bloco de memória está no arquivo x no local y" e depois podemos liberar a memória física área para uso por outro aplicativo. Quando um aplicativo precisa dessa memória, ele pode ser lido novamente a partir do disco, colocado em algum local da RAM física (potencialmente diferente de onde estava antes) e mapeado de volta para o mesmo local da memória virtual anterior.

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 carregamento efetivamente "lento" das bibliotecas compartilhadas de um programa. Quando o programa principal diz 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 nele pode adiar o carregamento de páginas da biblioteca do disco até que sejam realmente necessárias. Dessa forma, as únicas partes da biblioteca que são carregadas na RAM são as que são realmente usadas pelo programa, as partes que nunca são usadas nunca são carregadas e, portanto, não desperdiçam 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. Não "aumenta a memória", mas nos permite usar mais efetivamente o que temos.

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


Comentários não são para discussão prolongada; esta conversa foi movida para o bate-papo .
Sathyajith Bhat

21

Explicação de Layman

O sistema precisará 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 navegador, cada uma com 1 GB de memória. No sistema operacional sem suporte à memória virtual, você precisaria de 20 GB de RAM para que isso funcionasse. O truque é que você não navega pelas 20 guias ao mesmo tempo, portanto o sistema operacional com memória virtual permitirá que você use seu navegador assim 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. Na verdade, seu principal objetivo é evitar a fragmentação da RAM, o que é um grande problema em sistemas sem gerenciamento de memória virtual: é possível que você tenha 1 GB de RAM livre, mas se houver blocos de 10 MB, um aplicativo solicitando 100 MB não funcionará. .

Com o tempo, a memória virtual encontrou ainda mais usos, notavelmente acesso aleatório a arquivos: muitos aplicativos, como bancos de dados, tornam-se dolorosamente lentos se forem forçados a ler arquivos sequencialmente e funcionam muito mais rapidamente se o sistema operacional permitir que eles finjam que o arquivo inteiro está localizado (virtual ) e otimize a E / S de disco e o cache com base nos padrões de acesso.


9
é triste vivermos em um mundo em que cada guia do navegador exija 1 GB de memória
#

9
@tbodt Eu culpo os antigos egípcios. Se eles soubessem o que estavam fazendo domesticando aqueles gatos traquinas!
Dmitry Grigoryev

@ tbodt É um pouco de exagero também. Meu navegador com 8 guias abertas ocupa apenas 500 MB de memória.
precisa saber é o seguinte

2
@ Random832 Claro que é um exagero, embora não tenha certeza da linha entre exagero e ser à prova de futuro. Meu primeiro PC tinha 32 MB de RAM e eu podia abrir facilmente 8 abas no Opera sem trocar de forma visível. Agora são necessários 500 MB e, em outros 20 anos, pode chegar a 8 GB.
Dmitry Grigoryev

5

A memória virtual não aumenta a memória, no sentido de realmente adicionar mais hardware à memória principal. Mas PODE aumentar o intervalo de endereços utilizáveis . Portanto, é possível ter um programa em execução que consiste em um segmento de código e um segmento de dados (pilha e pilha), e ambos podem ocupar um intervalo de endereços virtuais maiores que o intervalo de endereços físicos fornecido pelo espaço de armazenamento fisicamente real do 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, no final, tudo é suportado pelo armazenamento em disco] . Isso funciona por causa do fenômeno da localidade de referência: A qualquer momento, apenas as instruções em uma ou mais pequenas seções contíguas do segmento de programa estão sendo executadas e apenas os dados em uma ou mais pequenas seções contíguas do segmento de dados estão sendo operados [é claro que o comportamento é realmente mais complexo , mas segue esse padrão por uma grande fração do tempo]


4

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

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, 2 ^ 32 de espaço de endereço), enquanto a memória física instalada real era apenas uma fração desse número.
Programas grandes podem ser portáveis ​​entre computadores que usem memória virtual sem impor enormes requisitos de memória (instalados).
Esse uso da memória virtual estava no tempo dos computadores mainframe e da memória principal de ferrite (que era de baixa densidade física e cara).

Mas, em última análise, ele precisa mapear o endereço lógico para o endereço realmente físico. Agora, como está aumentando a memória?

A memória virtual evoluiu de apenas uma técnica para fornecer mais espaço de endereço para o programa.
A memória virtual é um componente essencial no fornecimento de segurança para cada processo nos sistemas operacionais modernos, para que um processo não possa interferir em outro processo, nem ser comprometido por outro processo.
Mas multiprocessamento (não confunda com multiprocess RUP ) com a memória virtual ainda não fornecer memória mais aparente para o sistema de 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 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 (também conhecida como residente na memória).

Código não essencial (porque atualmente não é executado) e dados (porque não está sendo referenciado / processado) não precisam ser residentes na memória o tempo todo. O código e / ou as páginas / segmentos de dados podem ser "trocados" para o armazenamento de backup (por exemplo, espaço de troca ou arquivo de página 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 que a memória física instalada.
O "aumento da memória" agora é da perspectiva do sistema, e não apenas da perspectiva do programa.


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 na memória DRAM física, em uma unidade flash conectada à máquina ou em uma bandeja giratória. O que o software se importa é que, quando pede para acessar esses dados, ele obtém êxito.

Na prática, também queremos que os programas sejam executados rapidamente. Por considerações de velocidade , nos preocupamos onde estão os dados. Queremos que os dados que estamos acessando com mais frequência sejam armazenados em hardware que permita o acesso mais rápido. Nossos programas iria gostar de correr inteiramente fora de DRAM. No entanto, geralmente 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 são usados ​​há algum tempo, armazenando-os em um disco rígido. Isso ainda está acessível, apenas lento. Se o programa solicitar dados que estão no disco rígido, o sistema operacional precisará reservar um tempo para ler os dados do disco e movê-los novamente para a DRAM.

Em teoria, ele poderia apenas ler os dados diretamente do disco. No entanto, há razões para que isso não seja feito. Os programas não querem ter conhecimento de todas essas complicações. Podemos escrever e escrever um software que coloca dados no disco de maneira inteligente (é chamado de cache). No entanto, é preciso muito trabalho extra. O mais rápido que podemos fazer em código é:

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

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

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

Isso leva ao motivo pelo qual sempre paginamos os dados na memória em vez de apenas lê-los do disco e deixá-los assim. Dividimos a memória em "páginas", cada uma delas 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 os dados presentes, o hardware da CPU fornece acesso aos dados diretamente na DRAM. Quando os dados não estão presentes, é emitida uma "falha de página", dizendo ao sistema operacional para carregar essa página do disco em alguma página física da memória e atualize a tabela para apontar a CPU para essa nova página física.

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


2

Isso é feito temporariamente.

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 continuará como esperado; se não for encontrado, um endereço físico deverá ser alocado e o conteúdo carregado de algum outro armazenamento - o "espaço de troca". Se todo 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 salvo no espaço de troca) para disponibilizar endereços físicos.

A memória alocada máxima é 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.)


1

O conceito básico baseia-se no fato de que uma CPU moderna pode gerenciar tabelas de conversão controlando "quais intervalos de endereços um determinado processo foi alocado para uso e quais endereços físicos (pense em A00..Axx linhas em um barramento de memória), SE FOR QUALQUER , atualmente, são usados ​​para realmente armazenar os dados. "SE ALGUM", porque "nenhum" é um estado possível e aceitável: Nesse caso, uma condição de erro (a chamada "falha de página") será aumentada no nível do hardware - e esse erro acionará um manipulador no nível do sistema operacional que possa, 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 encontrar um local real para colocar coisas (em caso de gravação), atualize a tabela de conversão mencionada acima,e somente então o controle manual volta ao processo que tentou acessar essa memória ... e que não será o mais sábio do que aconteceu.


1

Memória virtual:

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

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

3) permite que um espaço de endereço virtual menor (por exemplo, 32 bits) seja mapeado para um espaço de endereço 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ço físico seja processada 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 um do outro.

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

Isso pode acontecer em um único processo ou sistema operacional - a maioria dos sistemas operacionais derivados do BSD UNIX possui uma única página de leitura e zeros, que pode ser mapeada para qualquer página virtual preenchida com zero, normalmente COW (Copiar na gravação - zeros somente leitura, gravações interceptadas) e página não compartilhada e tornada gravável).

Isso pode acontecer entre processos - por exemplo, o UNIX fork () cria processos filhos que compartilham quase toda a memória virtual de uma maneira COW.

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

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.