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

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

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

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

पता स्थान के भीतर मेमोरी प्रबंधन को आम तौर पर या तो मैन्युअल मेमोरी प्रबंधन या स्वचालित चर  के रूप में वर्गीकृत किया जाता है।

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


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

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

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

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

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

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

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

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

एलोका का एक सुरक्षित संस्करण कहा जाता है _malloca, जो त्रुटियों की रिपोर्ट करता है, Microsoft Windows पर मौजूद है। इसके उपयोग की आवश्यकता है _freea. gnulib एक समान इंटरफ़ेस प्रदान करता है, हालांकि अतिप्रवाह पर 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 के विवरण समान हैं एमएफटी और एमवीटी के लिए; OS/VS2 का विवरण MVT के समान है, सिवाय इसके कि पृष्ठ का आकार 4 KiB है। OS/VS1 और OS/VS2 दोनों के लिए साझा सिस्टम कतार क्षेत्र (SQA) नॉनपेजेबल है।

एमवीएस में एड्रेस स्पेस में एक अतिरिक्त पेजेबल शेयर्ड एरिया, कॉमन स्टोरेज एरिया (सीएसए), और एक अतिरिक्त प्राइवेट एरिया, सिस्टम वर्क एरिया (एसडब्ल्यूए) शामिल है। साथ ही, स्टोरेज कुंजियाँ 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