Existe uma desvantagem nisso, ou seja, ter a memória da aplicação consistindo em múltiplos pedaços em endereços mais distantes um do outro, então o que poderia teoricamente ser alcançado se toda a memória do aplicativo fosse alocada como um grande pedaço?
Você terá que:
-
observe o que é memória virtual e física e como elas são mapeadas.
-
veja se o armazenamento em cache é feito na camada virtual ou física em sua arquitetura.
-
veja como seu sistema operacional faz as coisas
A memória física fragmentada é importante? Apenas se isso resultar em mapas virtuais e físicos mais complexos (mmu, etc) Um bloco virtual contíguo com físico não contíguo pode resultar em um mapa de pesquisa muito mais complexo. O Linux tem vários tamanhos de páginas que ele pode usar, ele tentará usar o maior que puder (para melhor corresponder ao malloc). No meu sistema Debian jessie com kernel 4.6.0-0 amd64, tenho tamanhos de página de 4k (154964 em uso), 2M (3753 em uso) e 1G (1 em uso).
A memória virtual fragmentada é importante? Eu não posso ver que isso acontece, se o processo solicitou vários blocos com vários malocs, então ele os verá como separados, mesmo que adjacentes. Um maloc deve ser contíguo no virtual. O sistema de segurança, mas pode proteger os blocos entre cada bloco maloced, evitando assim que eles sejam adjacentes.
No Linux, muito será compartilhado entre processos: Se o mesmo arquivo executável, eles compartilharão todos os blocos somente leitura do executável (texto, dados-ro, etc.). Eles também compartilharão dados inicializados (dados), até que um deles mude uma página, então esta página é copiada. O mesmo é feito para todas as bibliotecas vinculadas dinâmicas, então elas compartilharão muitas delas. Além disso, os arquivos no disco são a troca para essa memória, por isso não se incomodará em ler os dados até que eles precisem (o programa começará a ser executado sem que nada seja lido, isso resultará em um erro e uma página sendo lido, então o programa será executado, até que haja outra falha, etc etc). Se houver falta de memória, a página pode ser descartada, pode ser lida novamente (não é necessário trocá-la). Isso pode causar muitas leituras de disco quando a memória estiver baixa, resultando em uma inicialização mais lenta. Se os processos forem iniciados separadamente, o segundo processo pressionando o subsistema de memória fará com que páginas não utilizadas sejam descartadas (provavelmente páginas que foram usadas na inicialização do processo 1, mas que não foram usadas desde então).
(algumas arquiteturas armazenam em cache memória física: isso é o mais óbvio. Outros armazenam memória virtual: isso pode resultar em duas vezes a mesma memória física. Isso é um desperdício, mas mais simples e rápido. nível 1, onde precisa ser rápido, cache físico em outros níveis onde precisa ser eficiente em termos de memória.).