Posso ficar sem memória virtual no linux?
-
05-07-2019 - |
Pergunta
Meu aplicativo semelhante ao programa hypotetical:
for(;;) {
for (i=0; i<1000; i++) {
p[i] = malloc(random_number_between_1000_and_100000());
p[i][0]=0; // update
}
for (i=0; i<1000; i++) {
free(p[i]);
}
}
Não tem vazamentos de memória, mas no meu sistema, o consumo de memória (em cima, VSS coluna) cresce sem limites (tais como 300% de memória física disponível). Isso é normal?
Atualização - usar a memória para um tempo e depois libertá-la. Será esta uma diferença?
Solução
Tente adicionar
sbrk(-1);
no final de cada ciclo para ver se faz diferença.
A livre () somente desaloca memória, mas ele não dá-lo de volta para o OS.
Outras dicas
O comportamento é normal. Citando man 3 malloc
:
Bugs
Por padrão, o Linux segue uma estratégia de alocação de memória otimista. Isto significa que quando malloc () retorna não-NULL não há nenhuma garantia de que o memória está realmente disponível. Este é realmente um mau bug. No caso de se verificar que o sistema está sem memória, uma ou mais processos serão morto pelo assassino OOM infame. No caso do Linux é usado em circunstâncias onde seria menos desejável, de repente, perder algum aleatoriamente processos escolhido, e além disso a versão do kernel é suficientemente recente, pode-se desligar este comportamento overcommitting usando um comando como:
# echo 2 > /proc/sys/vm/overcommit_memory
Veja também o diretório Documentação kernel, arquivos vm / overcommit-contábeis e sysctl / vm.txt.
Você precisa tocar (leitura / gravação) a memória do kernel do Linux para realmente reservá-lo.
O sistema operacional geralmente aloca todas as páginas como Copy-on-write clones do "0" página, que é uma página fixo preenchido com zeros. Leitura das páginas irá retornar 0 como esperado. Contanto que você apenas lê, todas as referências ir o a mesma memória física. Uma vez que você escrever um valor de "vaca" é quebrada e um real, física, quadro de página é alocado para você. este meios que, enquanto você não escreve para a memória que você pode manter alocação de memória até que o espaço de endereço de memória virtual se esgotar ou sua mesa página enche toda a memória disponível.
Enquanto você não tocar esses pedaços alocados o sistema realmente não vai alocá-los para você.
No entanto, você pode ficar sem espaço endereçável que é um limite imposta pelo sistema operacional para os processos, e não é necessariamente o máximo que você pode abordar com o tipo de ponteiro sistemas.