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

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

उदाहरण
एक सरल उदाहरण के रूप में, नीचे दिए गए सी (प्रोग्रामिंग भाषा) कोड के बारे में विचार करें जो एक लिंक किए गए सूची की डेटा संरचना को आवंटित करता है और उसके बाद फिर एक डीलॉकेट करता है Region *r = createRegion;

ListNode *head = NULL; for (int i = 1; i <= 1000; i++) { ListNode* newNode = allocateFromRegion(r, sizeof(ListNode)); newNode->next = head; head = newNode; } // ... // (use list here) // ... destroyRegion(r);

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

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

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

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

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

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

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


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

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

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


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

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

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

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