निम्नलिखित सी कोड है, जो 100,000 4KB आकार पृष्ठों बनाता है पर विचार करें, तो 99,999 पृष्ठों को मुक्त कर देते हैं और, अंत में, अंतिम पृष्ठ को मुक्त कर देते:मेमोरी रिसाव
#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;
}
आप इसे संकलन हैं, चलाने यह और इस प्रक्रिया 'स्मृति उपयोग पर नजर रखने के लिए, आप देख सकते हैं कि स्मृति के उपयोग पहले getchar
(के बाद (जब स्मृति 100,000 पृष्ठों के लिए आवंटित किया जाता है), तो यह एक ही के बाद भी 99,999 पृष्ठों को डी-आवंटित किए जाते हैं रहता है दूसरे से पहले 400MB के बारे में पहुंचता है getchar
) और, आखिरकार, यह अंतिम पृष्ठ को आवंटित होने पर 1 एमबी तक गिर जाता है।
तो, मेरे सवाल क्यों हो रहा है है? पूरी याददाश्त ओएस में क्यों लौटी जाती है जब सभी पेज मुक्त हो जाते हैं? क्या कोई पृष्ठ आकार या कोई पृष्ठ संरेखण है जो इस तरह की चीज को होने से रोकता है? मेरा मतलब है, क्या कोई पृष्ठ आकार या संरेखण है जो किसी भी मॉलोकर्ड पेज को पूरी तरह से ऑपरेटिंग सिस्टम पर वापस कर देता है जब केवल एक पृष्ठ मुक्त हो जाता है?
ऐसा इसलिए होता है क्योंकि आवंटन इतने छोटे होते हैं कि आपकी सी लाइब्रेरी अपने अनियंत्रित डेटा को गतिशील रूप से आकार देने के लिए 'sbrk()' का उपयोग करती है। यह अनुक्रमिक है, इसलिए जब नवीनतम आवंटन मुक्त हो जाता है तो यह केवल तंग हो सकता है। यदि आप 131072 बाइट्स (128 के) कहने के लिए आवंटन आकार बढ़ाते हैं, तो 'स्ट्रेस' से पता चलता है कि यह आवंटन के लिए 'mmap()' का उपयोग करता है, और प्रत्येक 'मुक्त()' वास्तव में ओएस को आवंटन देता है। तो, आवंटन कैश का उपयोग करें, और केवल ओएस को बड़े भाग पूछें/वापस करें। –
@ नाममात्र अंतिम आदमी, आपने मेरी जान बचाई! ऊपर और नीचे टिप्पणियों के लिए बहुत बहुत धन्यवाद। यही वही है जो मैं जवाब से उम्मीद कर रहा था। यदि आपने इसका जवाब दिया था (टिप्पणी नहीं की थी), तो मैंने आपका जवाब स्वीकार कर लिया होगा ... – LuisABOL