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

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

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

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

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

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


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

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

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

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

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

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

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

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

एलोका का एक सुरक्षित संस्करण कहा जाता है _malloca, जो त्रुटियों की रिपोर्ट करता है, Microsoft Windows पर सम्मिलित है। इसके उपयोग की आवश्यकता है _freea. gnulib एक समतुल्य इंटरफ़ेस प्रदान करता है, यद्यपि अतिप्रवाह पर SEH अपवाद फेंकने के अतिरिक्त, यह बड़े आकार का एड्रेस चलने पर malloc को प्रतिनिधि करता है। इसी तरह की सुविधा को मैन्युअल लेखा और आकार-जांच का उपयोग करके अनुकरण किया जा सकता है, जैसे कि उपयोग में 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