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

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

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

कुछ ऑपरेटिंग सिस्टम में, उदाहरण OS/360 और आनुक्रमिक, मेमोरी ऑपरेटिंग सिस्टम द्वारा प्रबंधित की जाती है। अन्य ऑपरेटिंग सिस्टम में, उदा. यूनिक्स की तरह ऑपरेटिंग सिस्टम, मेमोरी को एप्लिकेशन स्तर पर प्रबंधित किया जाता है।

एड्रेस स्पेस के अंदर मेमोरी प्रबंधन को सामान्यतः मैनुअल मेमोरी प्रबंधन या स्वचालित मेमोरी प्रबंधन के रूप में वर्गीकृत किया जाता है।

मैनुअल मेमोरी प्रबंधन


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

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

दक्षता
लागू किया गया विशिष्ट सक्रिय मेमोरी नियतन एल्गोरिथम प्रदर्शन को महत्वपूर्ण रूप से प्रभावित कर सकता है। डिजिटल उपकरण संस्था द्वारा 1994 में किए गए एक अध्ययन में विभिन्न प्रकार के आवंटकों के लिए सम्मिलित ओवरहेड को दिखाया गया है। एकल मेमोरी स्लॉट नियतन करने के लिए न्यूनतम औसत निर्देश स्तर लंबाई 52 थी (जैसा कि विभिन्न प्रकार के सॉफ़्टवेयर पर निर्देश स्तर की रूपरेखा (कंप्यूटर प्रोग्रामिंग) के साथ मापा जाता है)।

कार्यान्वयन
चूंकि नियतन का यथावत् स्पेस पहले से ज्ञात नहीं है, मेमोरी को अप्रत्यक्ष रूप से, सामान्यतः एक पॉइंटर संदर्भ (कंप्यूटर विज्ञान) के माध्यम से अभिगम्य किया जाता है। मेमोरी क्षेत्र को व्यवस्थित करने और भागों को नियतन करने और हटाने के लिए उपयोग किया जाने वाला विशिष्ट एल्गोरिथ्म कर्नेल के साथ जुड़ा हुआ है, और निम्न विधियों में से किसी का भी उपयोग कर सकता है:

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

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

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

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

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

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

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

वास्तविक मेमोरी वाली प्रणाली
वास्तविक मेमोरी भौतिक हार्डवेयर से मेमोरी संगठन को अलग करने की एक विधि है। एप्लिकेशन वास्तविक एड्रेस के माध्यम से मेमोरी पर काम करते हैं। किसी विशेष वास्तविक मेमोरी एड्रेस तक पहुँचने के लिए एप्लिकेशन द्वारा प्रत्येक प्रयास के परिणाम स्वरूप वास्तविक मेमोरी एड्रेस को वास्तविक एड्रेस में अनुवादित किया जाता है। इस तरह वास्तविक मेमोरी के जुड़ने से मेमोरी प्रणाली और अभिगम्य के तरीकों पर कणमय नियंत्रण हो जाता है।

वास्तविक मेमोरी प्रणाली में ऑपरेटिंग सिस्टम सीमित करता है कि कैसे एक प्रक्रिया (कंप्यूटिंग) मेमोरी तक पहुंच सकता है। मेमोरी सुरक्षा नामक यह सुविधा, एक प्रोग्राम में द्वेषपूर्ण या असम्यककार्यता कोड को दूसरे के संचालन में रूकावट करने से रोकने के लिए नियतन नहीं की गई मेमोरी को पढ़ने या लिखने की प्रक्रिया को अस्वीकार करने के लिए उपयोग की जा सकती है।

यद्यपि विशिष्ट प्रक्रियाओं के लिए नियतन मेमोरी सामान्य रूप से पृथक होती है, प्रक्रियाओं को कभी-कभी जानकारी साझा करने में सक्षम होने की आवश्यकता होती है। साझा मेमोरी अंतःप्रक्रम संचार के लिए सबसे तेज़ तकनीकों में से एक है।

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

OS/360 और आनुक्रमिक में मेमोरी प्रबंधन
IBM प्रणाली/360 वास्तविक मेमोरी का समर्थन नहीं करता है। प्रकरण का मेमोरी वियोजन वैकल्पिक रूप से मेमोरी सुरक्षा कुंजी का उपयोग करके पूरा किया जाता है, प्रत्येक प्रकरण के लिए भंडारण को एक अलग कुंजी, पर्यवेक्षक के लिए 0 या 1-15 निर्दिष्ट किया जाता है। OS/360 में मेमोरी प्रबंधन एक पर्यवेक्षक कार्य है। मैक्रो का उपयोग करके संग्रहण का अनुरोध किया जाता है और   मैक्रो का उपयोग करके मुक्त किया जाता है, जिसके परिणामस्वरूप संचालन करने के लिए पर्यवेक्षक (SVC) को निरीक्षण किया जाता है।

OS/360 में विवरण इस बात पर निर्भर करता है कि प्रणाली कैसे उत्पन्न होती है, उदाहरण के लिए, PCP, MFT, MVT के लिए।

OS/360 MVT में,प्रकरण के क्षेत्र के अंदर उप-नियतन या साझा प्रणाली पंक्ति क्षेत्र (SQA), आकार में 2 KB के गुणक क्षेत्र—एक सुरक्षा कुंजी द्वारा संरक्षित क्षेत्र का आकार उप-निकाय पर आधारित होता है उप-निकायों की संख्या 0-255 है। एक क्षेत्र के अंदर उप-निकाय को या तो कार्य की भंडारण सुरक्षा या पर्यवेक्षक की कुंजी, कुंजी 0 निर्दिष्‍ट की जाती है। उप-निकाय 0–127 को कार्य की कुंजी प्राप्त होती है। प्रारंभ में केवल उप-निकाय शून्य बनाया जाता है, और सभी उपयोगकर्ता संग्रहण अनुरोध उप-निकाय 0 से संतुष्ट होते हैं, जब तक कि मेमोरी अनुरोध में कोई अन्य निर्दिष्ट नहीं किया जाता है। उप-निकाय 250–255 कार्य की ओर से पर्यवेक्षक द्वारा मेमोरी अनुरोधों द्वारा बनाए जाते हैं। इनमें से अधिकांश को कुंजी 0 दी गई है, हालांकि कुछ को कार्य की कुंजी मिलती है। MFT में उप-निकाय नंबर भी प्रासंगिक हैं, हालांकि विवरण बहुत सरल हैं। MFT गतिशील क्षेत्रों के अतिरिक्त संचालक द्वारा पुन: परिभाषित निश्चित विभाजन का उपयोग करता है और PCP में केवल एक ही विभाजन होता है।

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

OS/VS1 के विवरण समान हैं MFT और MVT के लिए; OS/VS2 के विवरण MVT के विवरण के समान हैं, इसके अतिरिक्त कि पृष्ठ का आकार 4 KiB है। OS/VS1 और OS/VS2 दोनों के लिए साझा प्रणाली पंक्ति क्षेत्र (SQA) अप्राप्य है।

MVS में एड्रेस स्पेस में एक अतिरिक्त पृष्ठांकन योग्य साझा क्षेत्र, सामान्य भंडारण क्षेत्र (CSA) और अतिरिक्त निजी क्षेत्र, प्रणाली कार्य क्षेत्र (SWA) सम्मिलित होता है। साथ ही, भंडारण कुंजी 0-7 सभी विशेषाधिकार प्राप्त कोड द्वारा उपयोग के लिए आरक्षित हैं।

यह भी देखें

 * गतिशील सरणी
 * अपशिष्ट संग्रह (कंप्यूटर विज्ञान)
 * मेमोरी से बाहर
 * क्षेत्र आधारित मेमोरी प्रबंधन

संदर्भ

 * OS360Sup
 * OSVS1Dig
 * OSVS1Dig

अग्रिम पठन

 * Donald Knuth. Fundamental Algorithms, Third Edition. Addison-Wesley, 1997. ISBN 0-201-89683-4. Section 2.5: Dynamic Storage Allocation, pp. 435–456.
 * Simple Memory Allocation Algorithms (originally published on OSDEV Community)

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

 * मेमोरी एड्रेस
 * कंप्यूटर का प्रदर्शन
 * UNIX- जैसे
 * मैनुअल मेमोरी प्रबंधन
 * चंकिंग (कंप्यूटिंग)
 * निर्देश पथ की लंबाई
 * सूचक (कंप्यूटर प्रोग्रामिंग)
 * वृक्ष डेटा संरचना
 * दो की शक्ति
 * साझा मेमोरी (इंटरप्रोसेस संचार)

बाहरी संबंध

 * "Generic Memory Manager" C++ library
 * Sample bit-mapped arena memory allocator in C
 * TLSF: a constant time allocator for real-time systems
 * Slides on Dynamic memory allocation
 * Inside A Storage Allocator
 * The Memory Management Reference
 * The Memory Management Reference, Beginner's Guide Allocation


 * Linux Memory Management
 * Memory Management For System Programmers
 * VMem - general malloc/free replacement. Fast thread safe C++ allocator
 * Operating System Memory Management