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

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

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

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

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

मैनुअल स्मृति प्रबंधन


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

प्रत्येक उपपूल को उपपूल के अंदर नियतन और मुक्त स्मृति ब्लॉकों की पहचान करने वाले नियंत्रण ब्लॉकों की एक सूची द्वारा मैप किया जाता है। स्मृति को पर्याप्त आकार का एक मुक्त क्षेत्र ढूंढकर, या कार्य के क्षेत्र आकार तक उपपूल में अतिरिक्त ब्लॉक नियतन करके नियतन किया जाता है। नियतन स्मृति क्षेत्र के सभी या भाग को मुक्त करना संभव है। 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