nihayet son sayfayı boşaltır, ardından 99.999 sayfaları boşaltır, 100.000 4KB'dir boyutlu sayfaları oluşturur aşağıdaki C kodu, düşünün ve:Bellek sızıntısı
#include <stdio.h>
#include <stdlib.h>
#define NUM_PAGES 100000
int main() {
void *pages[NUM_PAGES];
int i;
for(i=0; i<NUM_PAGES; i++) {
pages[i] = malloc(4096);
}
printf("%d pages allocated.\n", NUM_PAGES);
getchar();
for(i=0; i<NUM_PAGES-1; i++) {
free(pages[i]);
}
printf("%d pages freed.\n", NUM_PAGES-1);
getchar();
free(pages[NUM_PAGES-1]);
printf("Last page freed.\n");
getchar();
return 0;
}
bunu derlemek, çalıştırmak İşlemin bellek kullanımını izler, bellek kullanımının ilk getchar
'dan (bellek 100.000 sayfa için ayrıldığında) yaklaşık 400MB'a ulaştığını görebilirsiniz, sonra 99.999 sayfa ayrıldıktan sonra bile aynı kalır (saniye sonra) getchar
) ve son sayfa ayrıldığında son olarak 1MB'a düşüyor.
Yani, sorum bu neden oluyor? Tüm sayfalar sadece tüm sayfalar serbest bırakıldığında neden işletim sistemine döndürülür? Bu tür bir şeyin gerçekleşmesini engelleyen sayfa boyutu veya herhangi bir sayfa hizalaması var mı? Demek istediğim, herhangi bir sayfa boyutu veya hizalama var mıdır, sadece bir sayfa boşaldığında kötü bir sayfanın tümüyle işletim sistemine döndürülmesini sağlar mı?
Bu, ayırmaların çok küçük olmasından dolayı, C kitaplığınız, başlatılmamış verilerini dinamik olarak yeniden boyutlandırmak için sbrk() işlevini kullanır. Sıralıdır, bu yüzden sadece en son tahsisat boşaldığında büzülür. Atama boyutunu 131072 bayt (128k) olarak artırırsanız, strace, bunun yerine tahsisler için 'mmap()' kullandığını gösterir ve her bir 'free()' aslında OS'ye ayırmayı döndürür. Bu nedenle, bir ayırma önbelleği kullanın ve yalnızca büyük parçaları OS'ye isteyin/döndürün. –
@NominalAnimal Adam, hayatımı kurtardın! Yukarıdaki ve aşağıdaki yorumlar için çok teşekkür ederim. Tam olarak cevaplardan beklediğim buydu. Eğer cevapladıysanız (yorumda bulunmadıysanız), cevabınızı kabul ederdim ... – LuisABOL