पायथन मेमोरी प्रबंधन

सभी को नमस्कार! इसलिए मार्च का लंबा वीकेंड खत्म हो गया। हम कई पाठ्यक्रमों - "पायथन डेवलपर" द्वारा प्रिय को पहला पोस्ट-हॉलिडे प्रकाशन समर्पित करना चाहते हैं, जो 2 सप्ताह से कम समय में शुरू होता है। चलो चलते हैं।

सामग्री

  1. मेमोरी एक खाली किताब है
  2. मेमोरी मैनेजमेंट: हार्डवेयर से लेकर सॉफ्टवेयर तक
  3. पायथन बेस कार्यान्वयन
  4. ग्लोबल इंटरप्रेटर लॉक (GIL) अवधारणा
  5. कचरा इकट्ठा करने वाला
  6. मेमोरी प्रबंधन CPython में:
    • पुला
    • ब्लॉक
    • अखाड़ा
  7. निष्कर्ष



क्या आपने कभी सोचा है कि पायथन बैकस्टेज आपके डेटा को कैसे प्रोसेस करता है? आपके चर स्मृति में कैसे संग्रहीत हैं? किस बिंदु पर उन्हें हटाया जाता है?
इस लेख में, हम पाइथन की आंतरिक संरचना में गहराई से समझेंगे कि स्मृति प्रबंधन कैसे काम करता है।

इस लेख को पढ़ने के बाद, आप:

  • निम्न-स्तरीय संचालन के बारे में अधिक जानें, विशेष रूप से स्मृति।
  • समझें कि पायथन निम्न-स्तरीय संचालन को कैसे अमूर्त करता है।
  • पायथन में स्मृति प्रबंधन एल्गोरिदम के बारे में जानें।

पायथन की आंतरिक संरचना को जानने से उसके व्यवहार के सिद्धांतों की बेहतर समझ मिलेगी। मुझे आशा है कि आप नए दृष्टिकोण से अजगर पर एक नज़र डाल सकते हैं। पर्दे के पीछे, आपके कार्यक्रम को ठीक से काम करने के लिए बहुत सारे तार्किक संचालन हैं।

मेमोरी एक खाली किताब है

आप कंप्यूटर की मेमोरी की कल्पना एक खाली किताब के रूप में कर सकते हैं, इसके लिए बहुत सारी लघुकथाएँ लिखी जा सकती हैं। इसके पृष्ठों पर अभी कुछ भी नहीं है, लेकिन लेखक जल्द ही दिखाई देंगे जो इसमें अपनी कहानियां लिखना चाहते हैं। ऐसा करने के लिए, उन्हें एक जगह की आवश्यकता होगी।
चूंकि वे एक कहानी को दूसरे के ऊपर नहीं लिख सकते हैं, इसलिए उन्हें उन पृष्ठों के बारे में बहुत सावधान रहने की जरूरत है, जिन पर वे लिखते हैं। इससे पहले कि आप लिखना शुरू करें, वे पुस्तक प्रबंधक के साथ परामर्श करें। प्रबंधक तय करता है कि पुस्तक लेखक अपनी कहानी कहां लिख सकते हैं।

चूँकि किताब को कई साल हो गए हैं, इसलिए इसमें कई कहानियाँ पुरानी हो गई हैं। जब कोई इतिहास को नहीं पढ़ता या संबोधित करता है, तो वे इसे नई कहानियों के लिए रास्ता बनाते हैं।
इसके मूल में, कंप्यूटर मेमोरी एक खाली किताब की तरह है। एक निश्चित लंबाई की मेमोरी के निरंतर ब्लॉक को आमतौर पर पेज कहा जाता है, इसलिए यह सादृश्य काम आता है।

लेखक विभिन्न एप्लिकेशन या प्रक्रियाएं हो सकती हैं, जिन्हें मेमोरी में डेटा स्टोर करने की आवश्यकता होती है। एक प्रबंधक जो यह तय करता है कि लेखक अपनी कहानियां कहां लिख सकते हैं, एक मेमोरी मैनेजर की भूमिका निभाता है - एक सॉर्टर। और जो पुरानी कहानियों को मिटा देता है, वह कूड़ा उठाने वाला होता है।

मेमोरी मैनेजमेंट: हार्डवेयर से लेकर सॉफ्टवेयर तक

मेमोरी प्रबंधन वह प्रक्रिया है जिसमें सॉफ्टवेयर एप्लिकेशन डेटा को पढ़ते और लिखते हैं। मेमोरी मैनेजर निर्धारित करता है कि प्रोग्राम डेटा कहां रखा जाए। चूंकि स्मृति की मात्रा निश्चित रूप से है, पुस्तक में पृष्ठों की संख्या के अनुसार, तदनुसार, प्रबंधक को आवेदन द्वारा उपयोग के लिए इसे प्रदान करने के लिए मुफ्त स्थान खोजने की आवश्यकता है। इस प्रक्रिया को "मेमोरी एलोकेशन" कहा जाता है।

दूसरी ओर, जब डेटा की आवश्यकता नहीं रह जाती है, तो इसे हटाया जा सकता है। इस मामले में, वे स्मृति को मुक्त करने के बारे में बात करते हैं। लेकिन इसे क्या मुक्त किया गया है और यह कहाँ से आता है?
कंप्यूटर के अंदर कहीं एक भौतिक उपकरण है जो पायथन प्रोग्राम चलाने पर डेटा संग्रहीत करता है। इस उपकरण को प्राप्त करने से पहले पायथन कोड अमूर्त के कई स्तरों से गुजरता है।

उपकरण (रैम, हार्ड डिस्क, आदि) के ऊपर स्थित मुख्य स्तरों में से एक ऑपरेटिंग सिस्टम है। यह मेमोरी के लिए अनुरोधों को पढ़ने और लिखने का प्रबंधन करता है।
ऑपरेटिंग सिस्टम के ऊपर एक एप्लीकेशन लेयर है, जिसमें पायथन इंप्लीमेंटेशन में से एक है (आपके OS में वायर्ड या python.org से डाउनलोड किया गया है)। इस प्रोग्रामिंग भाषा में कोड के लिए मेमोरी मैनेजमेंट को विशेष पायथन टूल्स द्वारा नियंत्रित किया जाता है। स्मृति को प्रबंधित करने के लिए पायथन द्वारा उपयोग किए जाने वाले एल्गोरिदम और संरचनाएं इस लेख का मुख्य विषय हैं।

पायथन बेस कार्यान्वयन

पायथन का आधार कार्यान्वयन, या "शुद्ध पायथन", सी में लिखा गया सीपीथॉन है।
जब मैंने पहली बार इसके बारे में सुना तो मैं बहुत हैरान था। एक भाषा को दूसरी भाषा में कैसे लिखा जा सकता है? खैर, सचमुच नहीं, निश्चित रूप से, लेकिन विचार कुछ इस तरह है।

पायथन भाषा अंग्रेजी में एक विशेष संदर्भ मैनुअल में वर्णित है। हालांकि, यह गाइड अकेले बहुत उपयोगी नहीं है। आपको अभी भी निर्देशिका के नियमों द्वारा लिखित कोड की व्याख्या करने के लिए एक उपकरण की आवश्यकता है।

आपको अपने कंप्यूटर पर कोड निष्पादित करने के लिए कुछ की आवश्यकता होगी। बुनियादी पायथन कार्यान्वयन दोनों स्थितियों को प्रदान करता है। यह पायथन कोड को एक वर्चुअल मशीन में निष्पादित निर्देशों में परिवर्तित करता है।

नोट: वर्चुअल मशीनें भौतिक कंप्यूटर के समान हैं, लेकिन वे सॉफ़्टवेयर में एम्बेडेड हैं। वे विधानसभा कोड के समान बुनियादी निर्देश संसाधित करते हैं।


पायथन एक व्याख्या की गई प्रोग्रामिंग भाषा है। आपका पायथन कोड कंप्यूटर द्वारा आसानी से समझे जाने वाले निर्देशों का उपयोग करके संकलित किया गया है - बायटेकोड । जब आप कोड चलाते हैं, तो इन निर्देशों की व्याख्या वर्चुअल मशीन द्वारा की जाती है।

क्या आपने कभी एक्सटेंशन .pyc या __pycache__ फ़ोल्डर वाली फाइलें देखी हैं? यह वही बाईटेकोड है जिसकी व्याख्या वर्चुअल मशीन द्वारा की जाती है।
यह समझना महत्वपूर्ण है कि CPython के अलावा अन्य कार्यान्वयन भी हैं, उदाहरण के लिए IronPython , जो Microsoft सामान्य भाषा रनटाइम (CLR) में संकलित और चलता है। जावा वर्चुअल मशीन में चलने के लिए Jython Java bytecode को संकलित करता है। PyPy भी है जिसके बारे में आप एक अलग लेख लिख सकते हैं, इसलिए मैं केवल इसे पारित करने में उल्लेख करूंगा।

इस लेख में, हम CPython टूल का उपयोग करके मेमोरी प्रबंधन पर ध्यान केंद्रित करेंगे।
नोट: पायथन संस्करण अपडेट किए गए हैं और भविष्य में कुछ भी हो सकता है। लेखन के समय, नवीनतम संस्करण पायथन 3.7 था।

ठीक है, हमारे पास सी में लिखा गया है सीपीथॉन है जो पायथन बाइटकोड की व्याख्या करता है। यह स्मृति प्रबंधन से कैसे संबंधित है? स्मृति को प्रबंधित करने के लिए एल्गोरिदम और संरचनाएं सीपीथॉन कोड में मौजूद हैं, सी में पायथन में इन सिद्धांतों को समझने के लिए, आपको सीपीथॉन की एक बुनियादी समझ की आवश्यकता है।

CPython C में लिखा गया है, जो बदले में ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग का समर्थन नहीं करता है। इस वजह से, CPython कोड में एक दिलचस्प संरचना है।

आपने सुना होगा कि पायथन में सब कुछ एक वस्तु है, उदाहरण के लिए इंट और स्ट्र जैसे प्रकार भी। यह CPython कार्यान्वयन स्तर पर सही है। एक संरचना है जिसे PyObject कहा जाता है जिसका उपयोग सीपीथॉन की प्रत्येक वस्तु करती है।

नोट: C में एक संरचना एक उपयोगकर्ता-परिभाषित डेटा प्रकार है जो अपने आप में विभिन्न प्रकार के डेटा को समूहीकृत करता है। हम ऑब्जेक्ट-ओरिएंटेड भाषाओं के साथ एक सादृश्य आकर्षित कर सकते हैं और कह सकते हैं कि एक संरचना विशेषताओं के साथ एक वर्ग है, लेकिन तरीकों के बिना।

PyObject, पायथन में सभी वस्तुओं का पूर्वज है, जिसमें केवल दो चीजें हैं:

  • ob_refcnt : संदर्भ काउंटर;
  • ob_type : पॉइंटर को दूसरे प्रकार पर।

कचरा संग्रहण के लिए एक संदर्भ काउंटर आवश्यक है। हमारे पास एक विशिष्ट प्रकार की वस्तु के लिए एक संकेतक भी है। ऑब्जेक्ट प्रकार केवल एक और संरचना है जो पायथन में वस्तुओं का वर्णन करता है (जैसे कि तानाशाह या इंट)।

प्रत्येक ऑब्जेक्ट में ऑब्जेक्ट-ओरिएंटेड मेमोरी एलोकेटर होता है जो जानता है कि मेमोरी कैसे आवंटित करें और ऑब्जेक्ट को कैसे स्टोर करें। प्रत्येक ऑब्जेक्ट में एक ऑब्जेक्ट-ओरिएंटेड रिसोर्स लिबरेटर भी होता है जो मेमोरी को साफ करता है अगर उसकी सामग्री की आवश्यकता नहीं है।

स्मृति आवंटन और इसकी सफाई के बारे में बात करने में एक महत्वपूर्ण कारक है। मेमोरी एक साझा कंप्यूटर संसाधन है, और एक बल्कि अप्रिय बात हो सकती है यदि दो प्रक्रियाएं एक ही समय में एक ही मेमोरी स्थान पर डेटा लिखने का प्रयास करती हैं।

ग्लोबल इंटरप्रिटेशन लॉक (GIL)

GIL साझा संसाधनों जैसे कंप्यूटर मेमोरी के बीच मेमोरी साझा करने की सामान्य समस्या का समाधान है। जब दो धागे एक ही समय में एक ही संसाधन को बदलने की कोशिश करते हैं, तो वे एक-दूसरे की एड़ी पर कदम रखते हैं। नतीजतन, मेमोरी में एक पूर्ण गड़बड़ का गठन होता है और कोई भी प्रक्रिया वांछित परिणाम के साथ अपना काम खत्म नहीं करेगी।

पुस्तक के साथ सादृश्य में लौटते हुए, मान लीजिए कि दोनों लेखकों में से प्रत्येक ने यह तय किया कि उसे इस विशेष क्षण में अपनी कहानी वर्तमान पृष्ठ पर लिखनी चाहिए। उनमें से प्रत्येक कहानी लिखने के लिए दूसरे के प्रयासों को नजरअंदाज कर देता है और पृष्ठ पर हठपूर्वक लिखना शुरू कर देता है। नतीजतन, हमारे पास दो कहानियां हैं, एक दूसरे के ऊपर, और एक बिल्कुल अपठनीय पृष्ठ।

इस समस्या के समाधान में से एक GIL है, जो दुभाषिया को ब्लॉक करता है, जबकि थ्रेड आवंटित संसाधन के साथ इंटरैक्ट करता है, इस प्रकार एक और केवल एक थ्रेड को आवंटित मेमोरी एरिया में लिखने की अनुमति देता है। जब CPython मेमोरी आवंटित करता है, तो यह सुनिश्चित करने के लिए GIL का उपयोग करता है कि यह सही करता है।
इस दृष्टिकोण के कई फायदे और कई नुकसान हैं, यही वजह है कि जीआईएल पायथन समुदाय में संघर्ष का कारण बनता है। जीआईएल के बारे में अधिक जानने के लिए, मैं निम्नलिखित लेख पढ़ने का सुझाव देता हूं।

कचरा इकट्ठा करने वाला

आइए हम किताब के साथ अपने सादृश्य पर लौटें और कल्पना करें कि इसमें कुछ कहानियाँ आशातीत रूप से पुरानी हैं। कोई भी उन्हें पढ़ता है और उन्हें संबोधित करता है। इस मामले में, एक प्राकृतिक समाधान उन्हें अनावश्यक रूप से छुटकारा दिलाना होगा, जिससे नई कहानियों के लिए जगह खाली हो जाएगी।
ऐसी पुरानी अप्रयुक्त कहानियों की तुलना पायथन में उन वस्तुओं से की जा सकती है जिनकी संदर्भ संख्या 0. हो गई है। याद रखें कि पायथन की प्रत्येक वस्तु में एक संदर्भ गणना और एक प्रकार के लिए एक सूचक है।

संदर्भ गणना कई कारणों से बढ़ सकती है। उदाहरण के लिए, यह बढ़ेगा यदि आप एक चर को दूसरे चर पर असाइन करते हैं।



यदि आप ऑब्जेक्ट को तर्क के रूप में पास करते हैं तो यह भी बढ़ेगा।



अंतिम उदाहरण में, यदि आप सूची में ऑब्जेक्ट को शामिल करते हैं तो संदर्भ संख्या बढ़ जाएगी।



पायथन आपको sys मॉड्यूल का उपयोग करके संदर्भ काउंटर का वर्तमान मूल्य जानने देता है। आप sys.getrefcount(numbers) उपयोग कर सकते हैं, लेकिन याद रखें कि कॉलिंग getrefcount() एक दूसरे के संदर्भ काउंटर को getrefcount()

किसी भी स्थिति में, यदि आपके कोड में ऑब्जेक्ट अभी भी आवश्यक है, तो इसके संदर्भ काउंटर के लिए इसका मान 0. से अधिक होगा और जब यह शून्य तक गिरता है, तो मेमोरी को खाली करने के लिए एक विशेष फ़ंक्शन शुरू किया जाएगा, जो इसे मुक्त कर देगा और इसे अन्य वस्तुओं के लिए उपलब्ध कराएगा।

लेकिन "मुक्त स्मृति" का क्या अर्थ है और अन्य वस्तुएं इसका उपयोग कैसे करती हैं? चलो सीधे सीपीटीथॉन में स्मृति प्रबंधन में गोता लगाएँ।

CPython में मेमोरी प्रबंधन

इस भाग में, हम सीपीथॉन मेमोरी आर्किटेक्चर और एल्गोरिदम में डुबकी लेंगे जिसके द्वारा यह संचालित होता है।

जैसा कि पहले उल्लेख किया गया है, भौतिक उपकरणों और सीपीथॉन के बीच अमूर्तता के स्तर के रूप में ऐसी चीज है। ऑपरेटिंग सिस्टम (OS) भौतिक मेमोरी को सार करता है और वर्चुअल मेमोरी का एक स्तर बनाता है जो कि पायथन सहित अनुप्रयोगों तक पहुंच सकता है।

एक ओएस-उन्मुख वर्चुअल मेमोरी मैनेजर पायथन प्रक्रियाओं के लिए एक विशिष्ट मेमोरी क्षेत्र आवंटित करता है। तस्वीर में, गहरे भूरे रंग के क्षेत्र अंतरिक्ष हैं जो पायथन प्रक्रिया में रहते हैं।



आंतरिक उपयोग और गैर-ऑब्जेक्ट मेमोरी के लिए पायथन मेमोरी का हिस्सा उपयोग करता है। दूसरे भाग को वस्तुओं के भंडारण में विभाजित किया गया है (आपका इंट, तानाशाह , आदि) अब मैं एक बहुत ही सरल भाषा में बात करता हूं, हालांकि आप हुड के नीचे देख सकते हैं, अर्थात सीपीथॉन के स्रोत कोड में और देखें कि यह सब व्यावहारिक दृष्टिकोण से कैसे होता है। ।

CPython में, ऑब्जेक्ट ऑब्जेक्ट एरिया के भीतर मेमोरी आवंटित करने के लिए एक ऑब्जेक्ट एलोकेटर जिम्मेदार है। यह वस्तुओं के इस वितरक में है कि सभी जादू किया जाता है। इसे हर बार कहा जाता है जब प्रत्येक नई वस्तु को मेमोरी या फ्री मेमोरी पर कब्जा करने की आवश्यकता होती है।

आमतौर पर, उदाहरण के लिए, जैसे कि इंट या लिस्ट में पायथन में डेटा जोड़ना और हटाना एक समय में बहुत सारे डेटा का उपयोग नहीं करता है। यही कारण है कि डिस्पेंसर की वास्तुकला प्रति यूनिट समय में कम मात्रा में डेटा के साथ काम करने पर केंद्रित है। इसके अलावा, वह पहले से मेमोरी आवंटित नहीं करता है, अर्थात्, उस क्षण तक जब तक कि यह बिल्कुल आवश्यक न हो जाए।

स्रोत कोड में टिप्पणियां आवंटनकर्ता को "एक विशेष उद्देश्य वाली तेज मेमोरी आवंटनकर्ता के रूप में परिभाषित करती हैं जो सार्वभौमिक मॉलोक फ़ंक्शन की तरह काम करता है।" तदनुसार, सी में, मेमोरी को आवंटित करने के लिए मॉलोक का उपयोग किया जाता है।

अब आइए सीपीएचथॉन की स्मृति आवंटन रणनीति पर एक नज़र डालें। सबसे पहले, हम तीन मुख्य भागों के बारे में बात करते हैं और वे एक दूसरे से कैसे संबंधित हैं।

Arenas स्मृति के सबसे बड़े क्षेत्र हैं जो स्मृति में पृष्ठों की सीमाओं तक स्थान घेरते हैं। पेज बॉर्डर (पेज स्प्रेड) ओएस द्वारा उपयोग की जाने वाली एक निश्चित लंबाई की मेमोरी के निरंतर ब्लॉक का चरम बिंदु है। पायथन सिस्टम पेज की सीमा को 256 KB पर सेट करता है।



एरेनास के अंदर पूल (पूल) होते हैं, जिन्हें स्मृति का एक आभासी पृष्ठ माना जाता है (4 Kb)। वे हमारे सादृश्य में पृष्ठों की तरह दिखते हैं। पूल को मेमोरी - ब्लॉक के भी छोटे टुकड़ों में विभाजित किया गया है।

पूल के सभी ब्लॉक एक "आकार वर्ग" में पाए जाते हैं। आकार वर्ग ब्लॉक का आकार निर्धारित करता है, जिसमें एक निश्चित मात्रा में अनुरोधित डेटा होता है। नीचे दी गई तालिका में ग्रेडेशन को सीधे स्रोत कोड में टिप्पणियों से लिया गया है:



उदाहरण के लिए, यदि 42 बाइट्स की आवश्यकता है, तो डेटा को 48 बाइट ब्लॉक में रखा जाएगा।

पुला

ताल एक ही आकार के वर्ग के ब्लॉक से बने होते हैं। प्रत्येक पूल एक ही आकार वर्ग के अन्य पूल के साथ एक दोहरी लिंक की गई सूची के सिद्धांत पर काम करता है। इसलिए, एल्गोरिथ्म आसानी से आवश्यक ब्लॉक आकार के लिए आवश्यक जगह पा सकता है, यहां तक ​​कि कई पूलों के बीच भी।

उपयोग की usedpools list उन सभी पूलों का ट्रैक रखती है जिनमें प्रत्येक आकार वर्ग के डेटा के लिए किसी प्रकार का मुफ्त स्थान उपलब्ध है। जब आवश्यक ब्लॉक आकार का अनुरोध किया जाता है, तो एल्गोरिथ्म इसके लिए एक उपयुक्त पूल खोजने के लिए उपयोग किए गए पूलों की सूची की जांच करता है।

ताल तीन अवस्थाओं में हैं: प्रयुक्त, पूर्ण, खाली। उपयोग किए गए पूल में ब्लॉक होते हैं जिसमें कुछ जानकारी लिखी जा सकती है। पूर्ण पूल के ब्लॉक सभी वितरित हैं और पहले से ही डेटा शामिल हैं। खाली पूलों में कोई डेटा नहीं होता है और यदि आवश्यक हो तो आकार वर्गों को तोड़ दिया जा सकता है।

खाली पूलों ( freepools list ) की freepools list में क्रमशः सभी पूल एक खाली अवस्था में हैं। लेकिन वे किस बिंदु पर उपयोग किए जाते हैं?

मान लीजिए कि आपके कोड को 8 बाइट्स का मेमोरी क्षेत्र चाहिए। यदि 8 बाइट्स के वर्ग आकार के साथ इस्तेमाल किए गए पूल की सूची में कोई पूल नहीं हैं, तो एक नया खाली पूल 8 बाइट्स के भंडारण ब्लॉकों के रूप में आरंभीकृत किया जाता है। फिर खाली पूल का उपयोग किए गए पूल की सूची में जोड़ा जाता है और निम्नलिखित प्रश्नों में इसका उपयोग किया जा सकता है।

एक पूर्ण पूल कुछ ब्लॉकों को मुक्त करता है जब उनमें इस जानकारी की आवश्यकता नहीं होती है। इस पूल को इसके आकार वर्ग के अनुसार उपयोग की गई सूची में जोड़ा जाएगा। आप देख सकते हैं कि एल्गोरिदम के अनुसार पूल अपने राज्यों और यहां तक ​​कि आकार वर्गों को कैसे बदलते हैं।

ब्लॉक



जैसा कि आंकड़े से देखा जा सकता है, पूल में मेमोरी को मुक्त करने के लिए पॉइंटर्स होते हैं। उनके काम में थोड़ी बारीकियां होती हैं। स्रोत कोड में टिप्पणियों के अनुसार, वितरक "किसी भी स्तर (अखाड़ा, पूल, ब्लॉक) को किसी भी स्मृति क्षेत्र को छूने की कोशिश नहीं करता है जब तक कि इसकी आवश्यकता न हो।"

इसका मतलब है कि एक ब्लॉक में तीन राज्य हो सकते हैं। उन्हें निम्नानुसार परिभाषित किया जा सकता है:

  • अछूता : स्मृति के क्षेत्र जो आवंटित नहीं किए गए हैं;
  • नि : शुल्क : स्मृति के क्षेत्र जो आवंटित किए गए थे लेकिन बाद में सीपीथॉन द्वारा मुक्त कर दिए गए क्योंकि उनके पास प्रासंगिक जानकारी नहीं थी;
  • वितरित : स्मृति क्षेत्र जिसमें वर्तमान में वर्तमान जानकारी है।

फ्रीब्लॉक पॉइंटर फ्री मेमोरी ब्लॉक्स की एकल-लिंक्ड सूची है। दूसरे शब्दों में, यह मुफ्त स्थानों की एक सूची है जहां आप जानकारी लिख सकते हैं। यदि मुक्त ब्लॉकों में अधिक मेमोरी की आवश्यकता होती है, तो आवंटनकर्ता पूल में अछूता ब्लॉकों का उपयोग करता है।

जैसे ही मेमोरी मैनेजर ब्लॉक जारी करता है, ये ब्लॉक फ्री ब्लॉक की सूची में सबसे ऊपर जुड़ जाते हैं। वास्तविक सूची में मेमोरी ब्लॉकों का एक निरंतर अनुक्रम नहीं हो सकता है, जैसा कि पहले "सफल" आंकड़े में है।



अखाड़ा

एरेनास में पूल होते हैं। अखाड़े, पूलों के विपरीत, स्पष्ट राज्य विभाजन नहीं करते हैं।

वे स्वयं एक दोगुनी लिंक वाली सूची में व्यवस्थित होते हैं जिसे प्रयोग करने योग्य एरेनास (usable_arenas) की सूची कहा जाता है। यह सूची मुक्त पूल की संख्या के अनुसार क्रमबद्ध है। कम मुक्त पूल, सूची के शीर्ष के करीब अखाड़ा।



इसका मतलब यह है कि सबसे अधिक पूर्ण क्षेत्र को और भी अधिक डेटा रिकॉर्ड करने के लिए चुना जाएगा। लेकिन वास्तव में क्यों? जहां सबसे अधिक खाली स्थान है वहां डेटा क्यों नहीं लिखा जाता है?

यह हमें पूरी तरह से मुक्त स्मृति के विचार में लाता है। तथ्य यह है कि कुछ मामलों में, जब मेमोरी को मुक्त किया जाता है, तब भी यह ऑपरेटिंग सिस्टम के लिए दुर्गम रहता है। पायथन प्रक्रिया इसे वितरित करती है और बाद में नए डेटा के लिए इसका उपयोग करती है। पूर्ण मेमोरी डीलक्लोलेशन मेमोरी को ऑपरेटिंग सिस्टम पर लौटाता है।

एरेनास एकमात्र ऐसे क्षेत्र नहीं हैं जिन्हें पूरी तरह से खाली किया जा सकता है। इस प्रकार, हम समझते हैं कि जो एरेना "खाली के करीब" सूची में हैं उन्हें मुक्त किया जाना चाहिए। इस स्थिति में, मेमोरी क्षेत्र को वास्तव में पूरी तरह से मुक्त किया जा सकता है, और तदनुसार, आपके पायथन प्रोग्राम की कुल मेमोरी क्षमता कम हो जाती है।

निष्कर्ष

मेमोरी प्रबंधन कंप्यूटर के साथ काम करने में सबसे महत्वपूर्ण भागों में से एक है। एक तरह से या किसी अन्य, पायथन वस्तुतः अपने सभी कार्यों को चुपके से करता है।

इस लेख से आपने सीखा:

  • स्मृति प्रबंधन क्या है और यह क्यों महत्वपूर्ण है;
  • सीपीथॉन, एक मूल पायथन कार्यान्वयन क्या है;
  • CPython के मेमोरी मैनेजमेंट में डेटा संरचनाएं और एल्गोरिदम कैसे काम करते हैं और आपके डेटा को स्टोर करते हैं।

पायथन अमूर्त एक कंप्यूटर के साथ काम करने की कई बारीकियों को बाहर करता है। इससे उच्च स्तर पर काम करना संभव हो जाता है और आपके प्रोग्राम के बाइट्स कहाँ और कैसे संग्रहीत किए जाते हैं, इस विषय पर सिरदर्द से छुटकारा मिलता है।

इसलिए हमने पायथन में स्मृति प्रबंधन के बारे में सीखा। परंपरागत रूप से, हम आपकी टिप्पणियों की प्रतीक्षा कर रहे हैं, और हम आपको पाइथन डेवलपर कोर्स में एक खुले दिन के लिए भी आमंत्रित करते हैं, जो 13 मार्च को होगा

Source: https://habr.com/ru/post/hi443312/


All Articles