Você está entendendo mal a memória virtual. Programas e o sistema operacional sempre operam na memória virtual. Se você malloc 10 bytes, ou 10 milhões, ou 10 bilhões, você está alocando memória virtual. Seu código, seu espaço de pilha (armazenamento automático, alloca, etc.), seu armazenamento global (se você tiver algum), também todos vivem na memória virtual. Se você pegar o endereço de algo, como em &myVariable
, o resultado será um endereço virtual. Você nunca está usando endereços de memória física em um sistema operacional de memória virtual.
A soma total do espaço de endereço virtual necessário pelo SO mais todos os programas que você está executando rotineiramente excede o tamanho da RAM, mesmo nos sistemas atuais. Isso pode até ser verdade para um único programa. Portanto, o uso de RAM + "espaço de troca" para um único processo pode facilmente exceder a RAM.
Heck, todo o sentido da memória virtual - bem, um dos pontos importantes - é permitir que você escreva códigos que precisam de mais "memória" (seja para código, dados, qualquer coisa) do que você tem RAM.
Como outros disseram nos comentários, cabe ao sistema operacional decidir qual parte do espaço de endereço virtual total (para o OS + todos os processos) é mantida na RAM e qual está no disco (no espaço "swap") ). Se você referenciar alguma página (geralmente 4 Kbytes em sistemas x86 / x64) do seu espaço de endereço virtual que não esteja na RAM, o sistema operacional "troca" por você (também dizemos "pagina" ou "falha" ", como isso é estimulado por uma" falha de página "). Algum tempo depois, o sistema operacional pode decidir que está com pouca memória RAM e pode remover algumas das referências mais antigas ou menos referenciadas da RAM. Se esse material foi modificado desde que foi trazido pela última vez para a RAM, a versão modificada deve ser salva em disco - é por isso que as coisas são colocadas em "espaço de troca" (ou em termos do Windows, o arquivo de paginação).
A propósito, o espaço de paginação / swapfile / swap não é de longe o único lugar onde o conteúdo da memória virtual é mantido se ele não estiver na RAM. Arquivos mapeados, que geralmente incluem todos os arquivos de código, são outro local. O código raramente é modificado enquanto está na RAM, de modo que ele geralmente só entra, não sai. Se ele for perdido da RAM, ele é descartado e, se necessário, pode ser novamente trocado do mesmo arquivo original.