क्षेत्र आधारित स्मृति प्रबंधन

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

उदाहरण
एक सरल उदाहरण के रूप में, निम्नलिखित सी (प्रोग्रामिंग भाषा) कोड पर विचार करें जो एक लिंक्ड सूची डेटा संरचना आवंटित करता है और फिर हटा देता है:

<वाक्यविन्यास प्रकाश लैंग = सी> क्षेत्र * आर = createRegion ; लिस्टनोड * हेड = न्यूल; के लिए (int i = 1; i <= 1000; i++) { लिस्टनोड * न्यूनोड = एलोकेटफ्रॉम रीजन (आर, साइजोफ (लिस्टनोड)); नया नोड-> अगला = सिर; सिर = नया नोड; } // ... // (यहां सूची का उपयोग करें) // ... नष्ट क्षेत्र (आर); 

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

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

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

इतिहास और अवधारणाएँ
क्षेत्रों की मूल अवधारणा बहुत पुरानी है, पहली बार डगलस टी. रॉस के एईडी फ्री स्टोरेज पैकेज में 1967 की शुरुआत में दिखाई दी, जिसमें मेमोरी को ज़ोन के पदानुक्रम में विभाजित किया गया था; प्रत्येक क्षेत्र का अपना आवंटक था, और एक क्षेत्र को एक ही बार में मुक्त किया जा सकता था, जिससे क्षेत्रों को क्षेत्रों के रूप में प्रयोग करने योग्य बनाया जा सके। 1976 में, PL/I मानक में AREA डेटा प्रकार शामिल था। 1990 में, हैनसन ने सी में स्पष्ट क्षेत्रों का प्रदर्शन किया (जिसे उन्होंने एरेनास कहा) प्रति आबंटित बाइट समय प्रदर्शन प्राप्त कर सकता है, यहां तक ​​कि सबसे तेजी से ज्ञात ढेर आवंटन तंत्र से भी बेहतर। कुछ शुरुआती सी-आधारित सॉफ़्टवेयर परियोजनाओं को डिज़ाइन करने में स्पष्ट क्षेत्र महत्वपूर्ण थे, जिनमें Apache HTTP सर्वर शामिल है, जो उन्हें पूल कहता है, और PostgreSQL डेटाबेस प्रबंधन प्रणाली, जो उन्हें मेमोरी संदर्भ कहते हैं। पारंपरिक हीप आवंटन की तरह, ये योजनाएँ मेमोरी सुरक्षा प्रदान नहीं करती हैं; एक प्रोग्रामर के लिए यह संभव है कि किसी क्षेत्र को लटकने वाला सूचक के माध्यम से हटाए जाने के बाद, या किसी क्षेत्र को हटाना भूल जाए, जिससे स्मृति रिसाव हो जाए।

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

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

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


 * इ1 ρ पर: अभिव्यक्ति ई के परिणाम की गणना करें1 और इसे क्षेत्र पी में स्टोर करें?
 * letregion ρ ई में2 अंत: एक क्षेत्र बनाएँ और इसे ρ से बाइंड करें; ई का मूल्यांकन करें2; फिर क्षेत्र को हटा दें।

इस वाक्यात्मक संरचना के कारण, क्षेत्र नेस्टेड हैं, जिसका अर्थ है कि यदि r2 आर के बाद बनाया गया है1, इसे r से पहले भी आवंटित किया जाना चाहिए1; परिणाम क्षेत्रों का ढेर है। इसके अलावा, क्षेत्रों को उसी कार्य में हटा दिया जाना चाहिए जिसमें वे बनाए गए हैं। ऐकेन एट अल द्वारा इन प्रतिबंधों में ढील दी गई थी। इस विस्तारित लैम्ब्डा कैलकुस का उद्देश्य मशीन कोड में मानक एमएल प्रोग्रामों को संकलित करने के लिए एक सिद्ध मेमोरी-सुरक्षित इंटरमीडिएट प्रतिनिधित्व के रूप में सेवा करना था, लेकिन एक अनुवादक का निर्माण जो बड़े कार्यक्रमों पर अच्छे नतीजे देगा, कई व्यावहारिक सीमाओं का सामना करना पड़ा जिसे नए के साथ हल किया जाना था विश्लेषण, जिसमें पुनरावर्ती कॉल, टेल कॉल से निपटना और उन क्षेत्रों को समाप्त करना शामिल है जिनमें केवल एक मान होता है। यह काम 1995 में पूरा हुआ था और एमएल किट में एकीकृत, कचरा संग्रह के स्थान पर क्षेत्र आवंटन के आधार पर एमएल का एक संस्करण। इसने मध्यम आकार के परीक्षण कार्यक्रमों पर दोनों के बीच प्रत्यक्ष तुलना की अनुमति दी, व्यापक रूप से अलग-अलग परिणाम देने वाले (10 गुना तेज और चार गुना धीमी गति से) यह इस बात पर निर्भर करता है कि कार्यक्रम क्षेत्र के अनुकूल कैसे था; हालाँकि, संकलन समय मिनटों के क्रम में था। एमएल किट को अंततः दो परिवर्धन के साथ बड़े अनुप्रयोगों में बढ़ाया गया था: मॉड्यूल के अलग-अलग संकलन के लिए एक योजना, और कचरा संग्रह का पता लगाने के साथ क्षेत्र अनुमान के संयोजन वाली एक संकर तकनीक।

नई भाषा वातावरण के लिए सामान्यीकरण
एमएल किट के विकास के बाद, क्षेत्रों को अन्य भाषा परिवेशों के लिए सामान्यीकृत किया जाने लगा:


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

नुकसान
क्षेत्रों का उपयोग करने वाली प्रणालियाँ उन मुद्दों का अनुभव कर सकती हैं जहाँ क्षेत्र आवंटित होने से पहले बहुत बड़े हो जाते हैं और मृत डेटा का एक बड़ा हिस्सा होता है; इन्हें आमतौर पर लीक कहा जाता है (भले ही वे अंततः मुक्त हो जाते हैं)। लीक को खत्म करने में कार्यक्रम का पुनर्गठन शामिल हो सकता है, आमतौर पर नए, छोटे-जीवनकाल क्षेत्रों को पेश करके। इस प्रकार की समस्या को डिबग करना क्षेत्र अनुमान का उपयोग करने वाली प्रणालियों में विशेष रूप से कठिन है, जहां प्रोग्रामर को अंतर्निहित अनुमान एल्गोरिथ्म को समझना चाहिए, या समस्या का निदान करने के लिए वर्बोज़ मध्यवर्ती प्रतिनिधित्व की जांच करनी चाहिए। इस प्रकार के डेटा को प्रोग्राम में बदलाव किए बिना समयबद्ध तरीके से हटाने के लिए ट्रेसिंग कचरा संग्रहकर्ता अधिक प्रभावी होते हैं; यह हाइब्रिड क्षेत्र/जीसी सिस्टम के लिए एक औचित्य था। दूसरी ओर, कचरा संग्राहकों का पता लगाना सूक्ष्म लीक भी प्रदर्शित कर सकता है, यदि डेटा के संदर्भों को बनाए रखा जाता है जो फिर कभी उपयोग नहीं किया जाएगा।

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

हाइब्रिड तरीके
जैसा कि ऊपर उल्लेख किया गया है, आरसी क्षेत्रों और संदर्भ गिनती के एक संकर का उपयोग करता है, संदर्भ गणना के ऊपरी हिस्से को सीमित करता है क्योंकि संदर्भ आंतरिक क्षेत्रों को संशोधित होने पर गिनती को अद्यतन करने की आवश्यकता नहीं होती है। इसी तरह, कुछ मार्क-क्षेत्र हाइब्रिड विधियाँ क्षेत्रों के साथ कचरा संग्रहण का पता लगाती हैं; ढेर को क्षेत्रों में विभाजित करके ये कार्य करते हैं, एक मार्क-स्वीप पास करते हैं जिसमें जीवित वस्तुओं वाले किसी भी क्षेत्र को चिह्नित किया जाता है, और फिर किसी भी अचिह्नित क्षेत्र को मुक्त किया जाता है। इन्हें प्रभावी बने रहने के लिए लगातार डीफ़्रेग्मेंटेशन की आवश्यकता होती है।

इस पेज में लापता आंतरिक लिंक की सूची

 * ढेर आवंटन
 * अपाचे HTTP सर्वर
 * स्मृति सुरक्षा
 * उच्च-क्रम समारोह
 * बहुरूपता टाइप करें
 * अनुमान टाइप करें
 * क्षेत्र प्रकार
 * लैम्ब्डा कैलकुलस
 * मध्यवर्ती प्रतिनिधित्व
 * संदर्भ गिनती
 * कचरा संग्रह का पता लगाना