Region-based memory management
कंप्यूटर विज्ञान में, क्षेत्र-आधारित स्मृति प्रबंधन एक प्रकार का स्मृति प्रबंधन है जिसमें प्रत्येक आवंटित वस्तु को एक क्षेत्र को सौंपा जाता है। एक क्षेत्र, जिसे एक क्षेत्र, क्षेत्र, क्षेत्र या स्मृति संदर्भ भी कहा जाता है, आवंटित वस्तुओं का एक संग्रह है जिसे एक ही बार में कुशलता से पुनः आवंटित या विच्छेदित किया जा सकता है। स्टैक आवंटन की तरह, क्षेत्र कम ओवरहेड के साथ स्मृति के आवंटन और विलयन की सुविधा प्रदान करते हैं; लेकिन वे अधिक लचीले होते हैं, जिससे वस्तुएं उस स्टैक फ्रेम की तुलना में अधिक समय तक जीवित रह सकती हैं जिसमें उन्हें आवंटित किया गया था। विशिष्ट कार्यान्वयनों में, एक क्षेत्र में सभी वस्तुओं को स्मृति पतों की एक ही सन्निहित सीमा में आवंटित किया जाता है, उसी तरह जैसे स्टैक फ्रेम को आम तौर पर आवंटित किया जाता है। एक सरल उदाहरण के रूप में, निम्नलिखित सी कोड पर विचार करें जो एक जुड़ी हुई सूची डेटा संरचना को आवंटित करता है और फिर उसे अलग करता हैः क्षेत्र * r = क्षेत्र बनाएँ (); लिस्टनोड * हेड = एन. यू. एल. एल.; के लिए (इंट i = 1; i <= 1000; i + +) {लिस्टनोड * न्यूनोड = क्षेत्र से अलग करें (r, साइज़ऑफ़ (लिस्टनोड)); न्यूनोड-> नेक्स्ट = हेड; हेड = न्यूनोड;}///(यहाँ सूची का उपयोग करें)//.// (यहाँ सूची का उपयोग करें)//. क्षेत्र को नष्ट करें (r); हालाँकि इसे जुड़ी हुई सूची बनाने के लिए कई संचालन की आवश्यकता होती है, लेकिन इसे एक ही ऑपरेशन में क्षेत्र को नष्ट करके जल्दी से अलग किया जा सकता है। सूची को पार करने की कोई आवश्यकता नहीं है। कार्यान्वयन सरल स्पष्ट क्षेत्रों को लागू करना सरल है; निम्नलिखित विवरण हैनसन के काम पर आधारित है। प्रत्येक क्षेत्र को स्मृति के बड़े खंडों की एक जुड़ी हुई सूची के रूप में लागू किया जाता है; प्रत्येक खंड कई आवंटन करने के लिए पर्याप्त बड़ा होना चाहिए। वर्तमान ब्लॉक ब्लॉक में अगली मुक्त स्थिति के लिए एक सूचक रखता है, और यदि ब्लॉक भरा जाता है, तो एक नया आवंटित किया जाता है और सूची में जोड़ा जाता है। जब क्षेत्र को अलग कर दिया जाता है, तो अगले-मुक्त-स्थिति सूचक को पहले ब्लॉक की शुरुआत में रीसेट किया जाता है, और ब्लॉकों की सूची को अगले आवंटित क्षेत्र के लिए फिर से उपयोग किया जा सकता है। वैकल्पिक रूप से, जब किसी क्षेत्र का आवंटन रद्द कर दिया जाता है, तो उसके ब्लॉकों की सूची को एक वैश्विक फ्रीलिस्ट के साथ जोड़ा जा सकता है, जिससे अन्य क्षेत्र बाद में नए ब्लॉक आवंटित कर सकते हैं। इस सरल योजना के किसी भी मामले में, क्षेत्रों में अलग-अलग वस्तुओं को अलग करना संभव नहीं है। इस योजना के प्रति आवंटित बाइट की समग्र लागत बहुत कम है; लगभग सभी आवंटन में केवल एक तुलना और अगले-मुक्त-स्थिति सूचक के लिए एक अद्यतन शामिल है। एक क्षेत्र को अलग करना एक निरंतर-समय संचालन है, और शायद ही कभी किया जाता है। विशिष्ट कचरा संग्रह प्रणालियों के विपरीत, डेटा को इसके प्रकार के साथ टैग करने की कोई आवश्यकता नहीं है। इतिहास और अवधारणाएँ क्षेत्रों की मूल अवधारणा बहुत पुरानी है, जो पहली बार 1967 में डगलस टी. रॉस के एईडी फ्री स्टोरेज पैकेज में दिखाई दी थी, जिसमें स्मृति को क्षेत्रों के पदानुक्रम में विभाजित किया गया था; प्रत्येक क्षेत्र का अपना आवंटनकर्ता था, और एक क्षेत्र को एक बार में मुक्त किया जा सकता था, जिससे क्षेत्रों को क्षेत्रों के रूप में उपयोग करने योग्य बनाया जा सकता था। 1976 में, पी. एल./आई. मानक में ए. आर. ई. ए. डेटा प्रकार शामिल था। 1990 में, हैनसन ने प्रदर्शित किया कि सी में स्पष्ट क्षेत्र (जिसे उन्होंने अखाड़ा कहा) प्रति आवंटित बाइट समय प्रदर्शन प्राप्त कर सकते हैं, जो सबसे तेजी से ज्ञात ढेर आवंटन तंत्र से भी बेहतर है। स्पष्ट क्षेत्रों ने कुछ प्रारंभिक सी-आधारित सॉफ्टवेयर परियोजनाओं के डिजाइन में महत्वपूर्ण भूमिका निभाई, जिसमें अपाचे एचटीटीपी सर्वर, जो उन्हें पूल कहता है, और पोस्टग्रेएसक्यूएल डेटाबेस प्रबंधन प्रणाली, जो उन्हें स्मृति संदर्भ कहता है, शामिल हैं। पारंपरिक ढेर आवंटन की तरह, ये योजनाएं स्मृति सुरक्षा प्रदान नहीं करती हैं; एक प्रोग्रामर के लिए एक लटकते हुए सूचक के माध्यम से अलग किए जाने के बाद किसी क्षेत्र तक पहुंचना संभव है, या किसी क्षेत्र को अलग करना भूल जाना, जिससे स्मृति रिसाव होता है। क्षेत्र अनुमान 1988 में, शोधकर्ताओं ने क्षेत्र अनुमान की अवधारणा को पेश करके सुरक्षित स्मृति आवंटन के लिए क्षेत्रों का उपयोग करने के तरीके की जांच शुरू की, जहां क्षेत्रों का निर्माण और विलयन, साथ ही साथ विशेष क्षेत्रों के लिए व्यक्तिगत स्थिर आवंटन अभिव्यक्तियों का असाइनमेंट, संकलक द्वारा संकलन-समय पर डाला जाता है। संकलक इसे इस तरह से करने में सक्षम है कि यह गारंटी दे सकता है कि लटकते संकेत और रिसाव नहीं होते हैं। रुग्गेरी और मुर्ताग के एक प्रारंभिक कार्य में, प्रत्येक कार्य की शुरुआत में एक क्षेत्र बनाया जाता है और अंत में अलग किया जाता है। इसके बाद वे प्रत्येक स्थिर आवंटन अभिव्यक्ति के लिए जीवनकाल निर्धारित करने के लिए डेटा प्रवाह विश्लेषण का उपयोग करते हैं, और इसे सबसे कम उम्र के क्षेत्र को निर्दिष्ट करते हैं जिसमें इसका पूरा जीवनकाल शामिल होता है। 1994 में, इस काम को टोफ्टे और टैल्पिन द्वारा एक मौलिक काम में सामान्यीकृत किया गया था ताकि मानक एम. एल. में प्रकार बहुरूपता और उच्च-क्रम कार्यों का समर्थन किया जा सके, जो एक कार्यात्मक प्रोग्रामिंग भाषा है, जिसमें प्रकार अनुमान और बहुरूपी क्षेत्र प्रकारों और क्षेत्र कलन की सैद्धांतिक अवधारणाओं के आधार पर एक अलग एल्गोरिथ्म का उपयोग किया गया था। उनके काम ने क्षेत्रों सहित लैम्ब्डा कलन का एक विस्तार शुरू किया, जिसमें दो निर्माण जोड़े गएः ρ पर e1: अभिव्यक्ति e1 के परिणाम की गणना करें और इसे क्षेत्र ρ में संग्रहीत करें; e2 के अंत में क्षेत्र ρ: एक क्षेत्र बनाएँ और इसे ρ से बांधें; e2 का मूल्यांकन करें; फिर क्षेत्र को अलग करें। इस वाक्यविन्यास संरचना के कारण, क्षेत्रों को घोंसला बनाया जाता है, जिसका अर्थ है कि यदि r2 को r1 के बाद बनाया जाता है, तो इसे r1 से पहले भी अलग किया जाना चाहिए; परिणाम क्षेत्रों का एक ढेर है। इसके अलावा, क्षेत्रों को उसी कार्य में अलग किया जाना चाहिए जिसमें वे बनाए गए हैं। ऐकेन एट अल द्वारा इन प्रतिबंधों में ढील दी गई थी। इस विस्तारित लैम्ब्डा कलन का उद्देश्य मानक एमएल कार्यक्रमों को मशीन कोड में संकलित करने के लिए एक विश्वसनीय स्मृति-सुरक्षित मध्यवर्ती प्रतिनिधित्व के रूप में काम करना था, लेकिन एक अनुवादक का निर्माण करना जो बड़े कार्यक्रमों पर अच्छे परिणाम देगा, कई व्यावहारिक सीमाओं का सामना करना पड़ा, जिन्हें नए विश्लेषणों के साथ हल किया जाना था, जिसमें पुनरावर्ती कॉल, टेल कॉल से निपटना और उन क्षेत्रों को समाप्त करना शामिल था जिनमें केवल एक ही मूल्य था। यह काम 1995 में पूरा किया गया था और कचरा संग्रह के स्थान पर क्षेत्र आवंटन पर आधारित एमएल के एक संस्करण, एमएल किट में एकीकृत किया गया था। इसने मध्यम आकार के परीक्षण कार्यक्रमों पर दोनों के बीच एक सीधी तुलना की अनुमति दी, जिससे व्यापक रूप से अलग-अलग परिणाम ("10 गुना तेज और चार गुना धीमी") प्राप्त हुए, जो इस बात पर निर्भर करता है कि कार्यक्रम कितना "क्षेत्र-अनुकूल" था; संकलन का समय, हालांकि, मिनटों के क्रम पर था। एम. एल. किट को अंततः दो परिवर्धनों के साथ बड़े अनुप्रयोगों में बढ़ाया गयाः मॉड्यूल के अलग-अलग संकलन के लिए एक योजना, और कचरा संग्रह का पता लगाने के साथ क्षेत्र अनुमान का संयोजन करने वाली एक संकर तकनीक। एम. एल. किट के विकास के बाद, क्षेत्रों को अन्य भाषा वातावरणों के लिए सामान्यीकृत किया जाने लगाः सी प्रोग्रामिंग भाषा के लिए विभिन्न विस्तारः सुरक्षित सी बोली चक्रवात, जो कई अन्य विशेषताओं के साथ स्पष्ट क्षेत्रों के लिए समर्थन जोड़ता है, और उनका उपयोग करने के लिए मौजूदा सी अनुप्रयोगों को स्थानांतरित करने के प्रभाव का मूल्यांकन करता है। आर. सी. नामक सी. के लिए एक विस्तार लागू किया गया था जो स्पष्ट रूप से प्रबंधित क्षेत्रों का उपयोग करता है, लेकिन यह सुनिश्चित करके कि कोई भी क्षेत्र समय से पहले मुक्त न हो, स्मृति सुरक्षा की गारंटी देने के लिए क्षेत्रों पर संदर्भ गिनती का भी उपयोग करता है। क्षेत्र संदर्भ गणना के ओवरहेड को कम कर देते हैं, क्योंकि क्षेत्रों के आंतरिक संदर्भों को संशोधित करने पर गणना को अद्यतन करने की आवश्यकता नहीं होती है। आर. सी. में क्षेत्रों के लिए एक स्पष्ट स्थिर प्रकार की प्रणाली शामिल है जो कुछ संदर्भ गणना अद्यतनों को समाप्त करने की अनुमति देती है। नियंत्रण-सी नामक सी का एक प्रतिबंध, स्मृति सुरक्षा को स्थिर रूप से सुनिश्चित करने के लिए अपने डिजाइन के हिस्से के रूप में, क्षेत्रों (और एक समय में केवल एक क्षेत्र) का उपयोग करने के लिए कार्यक्रमों को सीमित करता है। जावा के एक उपसमुच्चय के लिए क्षेत्रों को लागू किया गया था, और वास्तविक समय जावा में स्मृति प्रबंधन का एक महत्वपूर्ण घटक बन गया, जो उन्हें ऑब्जेक्ट एनकैप्सुलेशन प्रदर्शित करने और क्षेत्र विलयन पर रनटाइम जांच को समाप्त करने के लिए स्वामित्व प्रकारों के साथ जोड़ता है। हाल ही में, एम्बेडेड रियल-टाइम जावा अनुप्रयोगों में क्षेत्रों का अनुमान लगाने के लिए एक अर्ध-स्वचालित प्रणाली का प्रस्ताव किया गया था, जिसमें एक संकलन-समय स्थिर विश्लेषण, एक रनटाइम क्षेत्र आवंटन नीति और प्रोग्रामर संकेत शामिल थे। क्षेत्र वास्तविक समय की गणना के लिए उपयुक्त हैं क्योंकि वृद्धिशील कचरा संग्रह की जटिलता के बिना, उनके ओवरहेड समय का स्थिर रूप से अनुमान लगाया जा सकता है। उन्हें लॉजिक प्रोग्रामिंग भाषाओं प्रोलॉग और मर्करी के लिए टॉफ्टे और टैल्पिन के क्षेत्र अनुमान मॉडल का विस्तार करके लागू किया गया था ताकि बैकट्रैकिंग और कटौती का समर्थन किया जा सके। क्षेत्र-आधारित भंडारण प्रबंधन का उपयोग समानांतर प्रोग्रामिंग भाषा पैरासेल में किया जाता है। पैरासेल में स्पष्ट संकेतों की कमी के कारण, संदर्भ गणना की कोई आवश्यकता नहीं है। नुकसान क्षेत्रों का उपयोग करने वाली प्रणालियाँ उन मुद्दों का अनुभव कर सकती हैं जहाँ क्षेत्र अलग होने से पहले बहुत बड़े हो जाते हैं और इसमें मृत डेटा का एक बड़ा अनुपात होता है; इन्हें आमतौर पर "रिसाव" कहा जाता है (भले ही वे अंततः मुक्त हो जाते हैं)। रिसाव को समाप्त करने में कार्यक्रम का पुनर्गठन शामिल हो सकता है, आमतौर पर नए, कम जीवनकाल वाले क्षेत्रों को पेश करके। इस प्रकार की समस्या को डीबग करना क्षेत्र अनुमान का उपयोग करने वाली प्रणालियों में विशेष रूप से कठिन है, जहां प्रोग्रामर को अंतर्निहित अनुमान एल्गोरिदम को समझना चाहिए, या समस्या का निदान करने के लिए वर्बोस मध्यवर्ती प्रतिनिधित्व की जांच करनी चाहिए। कचरा संग्रहकर्ताओं का पता लगाना कार्यक्रम में बदलाव के बिना समय पर इस प्रकार के डेटा को आवंटित करने में अधिक प्रभावी है; यह संकर क्षेत्र/जी. सी. प्रणालियों के लिए एक औचित्य था। दूसरी ओर, कचरा संग्रहकर्ताओं का पता लगाना भी सूक्ष्म रिसाव प्रदर्शित कर सकता है, यदि डेटा के लिए संदर्भ बनाए रखे जाते हैं जिनका फिर कभी उपयोग नहीं किया जाएगा। क्षेत्र-आधारित स्मृति प्रबंधन तब सबसे अच्छा काम करता है जब क्षेत्रों की संख्या अपेक्षाकृत कम होती है और प्रत्येक में कई वस्तुएँ होती हैं; जिन कार्यक्रमों में कई विरल क्षेत्र होते हैं, वे आंतरिक विखंडन प्रदर्शित करेंगे, जिससे स्मृति बर्बाद हो जाएगी और क्षेत्र प्रबंधन के लिए समय अधिक होगा। फिर से, क्षेत्र अनुमान की उपस्थिति में इस समस्या का निदान करना अधिक कठिन हो सकता है। हाइब्रिड विधियाँ जैसा कि ऊपर उल्लेख किया गया है, आर. सी. क्षेत्रों और संदर्भ गणना के एक संकर का उपयोग करता है, संदर्भ गणना के ऊपरी हिस्से को सीमित करता है क्योंकि क्षेत्रों के आंतरिक संदर्भों को संशोधित होने पर गणना को अद्यतन करने की आवश्यकता नहीं होती है। इसी तरह, कुछ चिह्न-क्षेत्र संकर विधियाँ क्षेत्रों के साथ कचरा संग्रह का पता लगाने को जोड़ती हैं; ये ढेर को क्षेत्रों में विभाजित करके, एक चिह्न-स्वीप पास करके कार्य करती हैं जिसमें जीवित वस्तुओं वाले किसी भी क्षेत्र को चिह्नित किया जाता है, और फिर किसी भी अचिह्नित क्षेत्र को मुक्त किया जाता है। इन्हें प्रभावी बने रहने के लिए निरंतर विखंडन की आवश्यकता होती है। संदर्भ स्मृति प्रबंधन