एरिक्सुन ने प्रश्न # 1 का उत्तर दिया है, और मैंने प्रश्न # 3 (मूल # 4) का उत्तर दिया है, लेकिन अब प्रश्न # 2 का उत्तर दें:
यह विशेष रूप से 50.5mb क्यों जारी करता है - वह राशि जो इसके आधार पर जारी की जाती है?
यह किस पर आधारित है, आखिरकार, पायथन के अंदर संयोगों की एक पूरी श्रृंखला है और malloc
यह भविष्यवाणी करना बहुत कठिन है।
सबसे पहले, आप स्मृति को कैसे माप रहे हैं, इसके आधार पर, आप केवल उन पृष्ठों को माप सकते हैं जो वास्तव में स्मृति में मैप किए गए हैं। उस स्थिति में, पेजर द्वारा किसी भी समय स्वैप किया जाता है, मेमोरी को "मुक्त" के रूप में दिखाया जाएगा, भले ही इसे मुक्त नहीं किया गया हो।
या आप इन-उपयोग पृष्ठों को माप सकते हैं, जो आवंटित-लेकिन-कभी भी छुआ जाने वाले पृष्ठों की गणना नहीं कर सकते हैं (सिस्टम पर जो कि बेहतर तरीके से आवंटित किए गए हैं, जैसे कि लिनक्स), वे पृष्ठ जो आवंटित किए गए लेकिन टैग किए गए हैं MADV_FREE
, आदि।
यदि आप वास्तव में आवंटित पृष्ठों को माप रहे हैं (जो वास्तव में करने के लिए बहुत उपयोगी चीज नहीं है, लेकिन ऐसा लगता है कि आप क्या पूछ रहे हैं), और पृष्ठों को वास्तव में निपटाया गया है, दो परिस्थितियों में ऐसा हो सकता है: या तो आप ' brk
डेटा खंड (आजकल बहुत कम) को सिकोड़ने या उपयोग करने के लिए, या आपने munmap
मैप किए गए सेगमेंट को जारी करने के लिए उपयोग या समान किया है। (उत्तरार्द्ध में सैद्धांतिक रूप से एक मामूली रूपांतर भी है, जिसमें मैप किए गए सेगमेंट के भाग को जारी करने के तरीके हैं - उदाहरण के लिए, इसे उस सेगमेंट के MAP_FIXED
लिए चुराएं MADV_FREE
जिसे आप तुरंत अनमैप करते हैं।)
लेकिन अधिकांश कार्यक्रम सीधे मेमोरी पेजों से चीजों को आवंटित नहीं करते हैं; वे malloc
-स्टाइल एलोकेटर का उपयोग करते हैं । जब आप कॉल करते हैं free
, तो आवंटनकर्ता केवल ओएस के लिए पृष्ठों को जारी कर सकता है यदि आप केवल free
मैपिंग में अंतिम लाइव ऑब्जेक्ट (या डेटा सेगमेंट के अंतिम एन पृष्ठों में) हो सकते हैं। ऐसा कोई तरीका नहीं है कि आपका एप्लिकेशन यथोचित भविष्यवाणी कर सके, या यह भी पता लगा सके कि यह पहले से हुआ था।
CPython इसे और भी जटिल बनाता है - इसमें कस्टम मेमोरी एलोकेटर के शीर्ष पर कस्टम 2-स्तरीय ऑब्जेक्ट एलोकेटर है malloc
। ( अधिक विस्तृत विवरण के लिए स्रोत टिप्पणियां देखें ।) और उस के शीर्ष पर, यहां तक कि सी एपीआई स्तर पर, बहुत कम पायथन, शीर्ष स्तर की वस्तुओं के डील-डौल होने पर आप सीधे नियंत्रण भी नहीं करते हैं।
इसलिए, जब आप एक ऑब्जेक्ट जारी करते हैं, तो आप कैसे जानते हैं कि क्या यह ओएस को मेमोरी जारी करने जा रहा है? ठीक है, पहले आपको यह जानना होगा कि आपने अंतिम संदर्भ जारी कर दिया है (किसी भी आंतरिक संदर्भ सहित, जिसके बारे में आपको पता नहीं था), जीसी को इससे निपटने की अनुमति देता है। (अन्य कार्यान्वयनों के विपरीत, कम से कम CPython किसी वस्तु को जितनी जल्दी हो सके अनुमति दे देगा।) यह आमतौर पर अगले स्तर पर कम से कम दो चीजों को निपटाता है (जैसे, एक स्ट्रिंग के लिए, आप PyString
ऑब्जेक्ट जारी कर रहे हैं , और स्ट्रिंग बफर )।
यदि आप करते हैं एक वस्तु पुनःआवंटन, जानने के लिए कि इस वस्तु भंडारण के एक ब्लॉक पुनःआवंटन को अगले स्तर नीचे का कारण बनता है, तो आप वस्तु संभाजक की आंतरिक स्थिति पता करने के लिए, साथ ही साथ यह कैसे लागू हो जाता है के रूप में की है। (यह स्पष्ट रूप से तब तक नहीं हो सकता है जब तक कि आप ब्लॉक की आखिरी चीज़ को नहीं निपटा रहे हों, और तब भी, ऐसा नहीं हो सकता।)
यदि आप कर वस्तु भंडारण के एक ब्लॉक पुनःआवंटन, पता करने के लिए यह एक का कारण बनता है कि क्या free
कॉल, आप PyMem संभाजक की आंतरिक स्थिति पता करने के लिए, साथ ही साथ यह कैसे लागू हो जाता है के रूप में की है। (फिर से, आपको एक malloc
एड क्षेत्र के अंतिम इन-उपयोग ब्लॉक को डील करना होगा, और तब भी, ऐसा नहीं हो सकता है।)
यदि आप ऐसा free
एक malloc
एड क्षेत्र, पता करने के लिए यह एक का कारण बनता है कि क्या munmap
या समकक्ष (या brk
), आप की आंतरिक स्थिति पता करने के लिए है malloc
, यह कैसे लागू हो जाता है और साथ ही। और यह एक, दूसरों के विपरीत, अत्यधिक मंच-विशिष्ट है। (और फिर, आपको आम तौर पर malloc
एक mmap
सेगमेंट में अंतिम इन-डील का उपयोग करना होगा , और तब भी ऐसा नहीं हो सकता है।)
इसलिए, यदि आप यह समझना चाहते हैं कि यह 50.5mb के रिलीज के लिए क्यों हुआ, तो आपको इसे नीचे से ऊपर ट्रेस करना होगा। malloc
जब आपने एक या एक से अधिक free
कॉल किए (तो शायद 50.5mb से अधिक के लिए) 50.5mb पृष्ठों को अनमैप क्यों किया ? आपको अपने प्लेटफ़ॉर्म को पढ़ना होगा malloc
, और फिर इसकी वर्तमान स्थिति देखने के लिए विभिन्न तालिकाओं और सूचियों पर चलना होगा। (कुछ प्लेटफार्मों पर, यह सिस्टम-स्तर की जानकारी का उपयोग भी कर सकता है, जो ऑफ़लाइन निरीक्षण करने के लिए सिस्टम का स्नैपशॉट बनाए बिना कैप्चर करना बहुत असंभव है, लेकिन सौभाग्य से यह आमतौर पर एक समस्या नहीं है।) और फिर आपको यात्रा करना होगा। ऊपर के 3 स्तरों पर एक ही काम करें।
तो, प्रश्न का एकमात्र उपयोगी उत्तर "क्योंकि" है।
जब तक आप संसाधन-सीमित (जैसे, एम्बेडेड) विकास नहीं कर रहे हैं, आपके पास इन विवरणों की परवाह करने का कोई कारण नहीं है।
और यदि आप संसाधन-सीमित विकास कर रहे हैं, तो इन विवरणों को जानना बेकार है; आपको बहुत अधिक उन सभी स्तरों के आसपास एंड-रन करना होगा और विशेष रूप mmap
से मेमोरी की आवश्यकता आपको एप्लिकेशन स्तर पर होगी (संभवतः एक सरल, अच्छी तरह से समझी गई, बीच में आवेदन-विशिष्ट क्षेत्र आवंटनकर्ता)।