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

"स्मृति नियतन" यहां पुनर्निर्देश करता है। मस्तिष्क में स्मृति नियतन के लिए, तंत्रिका स्मृति नियतन देखें।

यह आलेख पता स्थान में स्मृति प्रबंधन के बारे में है। वास्तविक स्मृति के प्रबंधन के लिए, स्मृति प्रबंधन (ऑपरेटिंग सिस्टम) देखें।

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

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

कुछ ऑपरेटिंग सिस्टम में, उदाहरण 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