मैनुअल मेमोरी प्रबंधन
This article has multiple issues. Please help improve it or discuss these issues on the talk page. (Learn how and when to remove these template messages)
(Learn how and when to remove this template message)
|
कंप्यूटर विज्ञान में, मैनुअल मेमोरी मैनेजमेंट, प्रोग्रामर द्वारा मैनुअल निर्देशों के उपयोग को अप्रयुक्त वस्तुओं, या कचरा (कंप्यूटर विज्ञान) की पहचान करने और हटाने के लिए संदर्भित करता है। 1990 के दशक के मध्य तक, उद्योग समर्थित मैनुअल मेमोरी प्रबंधन में उपयोग की जाने वाली अधिकांश प्रोग्रामिंग भाषाएं, हालांकि कचरा संग्रह (कंप्यूटर विज्ञान) 1959 से अस्तित्व में है, जब इसे लिस्प (प्रोग्रामिंग भाषा) के साथ पेश किया गया था। आज, हालांकि, जावा (प्रोग्रामिंग भाषा) जैसे कचरा संग्रह वाली भाषाएं तेजी से लोकप्रिय हैं और उद्देश्य सी और स्विफ्ट (प्रोग्रामिंग भाषा) भाषाएं स्वत: संदर्भ गणना के माध्यम से समान कार्यक्षमता प्रदान करती हैं। मुख्य रूप से मैन्युअल रूप से प्रबंधित भाषाएं आज भी व्यापक रूप से उपयोग में हैं सी (प्रोग्रामिंग भाषा) और सी ++ - सी गतिशील स्मृति आवंटन देखें।
विवरण
कई प्रोग्रामिंग लैंग्वेज मैनुअल तकनीकों का उपयोग यह निर्धारित करने के लिए करती हैं कि फ्री स्टोर से एक नई वस्तु कब आवंटित की जाए। सी का उपयोग करता है malloc
समारोह; C++ और Java उपयोग करते हैं new
ऑपरेटर; और कई अन्य भाषाएँ (जैसे कि पायथन) सभी वस्तुओं को मुफ्त स्टोर से आवंटित करती हैं। यह निर्धारित करना कि किसी वस्तु को कब बनाया जाना चाहिए (वस्तु निर्माण) आम तौर पर तुच्छ और अप्रमाणिक है, हालांकि वस्तु पूल जैसी तकनीकों का मतलब है कि तत्काल उपयोग से पहले एक वस्तु बनाई जा सकती है। वास्तविक चुनौती वस्तु विनाश है - यह निर्धारित करना कि कब किसी वस्तु की आवश्यकता नहीं है (अर्थात कचरा है), और इसके अंतर्निहित भंडारण को फिर से उपयोग के लिए मुफ्त स्टोर में वापस करने की व्यवस्था करना। मैनुअल मेमोरी आवंटन में, यह प्रोग्रामर द्वारा मैन्युअल रूप से भी निर्दिष्ट किया जाता है; जैसे कार्यों के माध्यम से free()
सी में, या delete
सी ++ में ऑपरेटर - यह स्वचालित चर में रखी गई वस्तुओं के स्वत: विनाश के विपरीत है, विशेष रूप से (गैर-स्थैतिक) कार्यों के स्थानीय चर, जो सी और सी ++ में उनके दायरे के अंत में नष्ट हो जाते हैं।
मैनुअल मेमोरी मैनेजमेंट तकनीक
This section needs expansion. You can help by adding to it. (January 2022) |
उदाहरण के लिए
- मॉलोक/मुक्त
- स्मृति अखाड़ा
- स्क्रैच बफर
- ...
मैनुअल प्रबंधन और शुद्धता
मैन्युअल मेमोरी प्रबंधन को गलत तरीके से उपयोग किए जाने पर प्रोग्राम में बग के कई प्रमुख वर्गों को सक्षम करने के लिए जाना जाता है, विशेष रूप से मेमोरी सुरक्षा या मेमोरी लीक का उल्लंघन। ये सुरक्षा बग का एक महत्वपूर्ण स्रोत हैं।
- जब किसी अप्रयुक्त वस्तु को कभी भी फ्री स्टोर में वापस नहीं छोड़ा जाता है, इसे मेमोरी लीक के रूप में जाना जाता है। कुछ मामलों में, स्मृति रिसाव सहनीय हो सकता है, जैसे कि एक प्रोग्राम जो अपने जीवनकाल में सीमित मात्रा में मेमोरी को लीक करता है, या एक शॉर्ट-रनिंग प्रोग्राम जो एक ऑपरेटिंग सिस्टम पर निर्भर करता है जब वह समाप्त होने पर अपने संसाधनों को हटा देता है। हालाँकि, कई मामलों में लंबे समय तक चलने वाले कार्यक्रमों में मेमोरी लीक होती है, और ऐसे मामलों में मेमोरी की असीमित मात्रा लीक हो जाती है। जब ऐसा होता है, तो उपलब्ध मुफ्त स्टोर का आकार समय के साथ घटता रहता है; जब यह अंततः समाप्त हो जाता है, तब प्रोग्राम क्रैश हो जाता है।
- गतिशील स्मृति प्रबंधन सिस्टम की भयावह विफलता का परिणाम तब हो सकता है जब किसी ऑब्जेक्ट की बैकिंग मेमोरी को उसके नीचे से एक से अधिक बार हटा दिया जाता है; एक वस्तु स्पष्ट रूप से एक से अधिक बार नष्ट हो जाती है; जब, फ्री स्टोर पर आवंटित नहीं की गई वस्तु में हेरफेर करने के लिए एक पॉइंटर का उपयोग करते समय, एक प्रोग्रामर उक्त पॉइंटर के लक्ष्य ऑब्जेक्ट की बैकिंग मेमोरी को रिलीज़ करने का प्रयास करता है; या जब, किसी ऑब्जेक्ट को पॉइंटर के माध्यम से दूसरे में हेरफेर करते समय, किसी अज्ञात बाहरी कार्य, थ्रेड या प्रक्रिया द्वारा प्रबंधित स्मृति के मनमाना क्षेत्र, एक प्रोग्रामर उस ऑब्जेक्ट की स्थिति को दूषित करता है, संभवतः इस तरह से अपनी सीमाओं के बाहर लिखने और भ्रष्ट करने के लिए इसकी स्मृति प्रबंधन डेटा। इस तरह की कार्रवाइयों के परिणाम में ढेर भ्रष्टाचार, एक अलग (और नव निर्मित) वस्तु का समय से पहले विनाश शामिल हो सकता है जो स्मृति में उसी स्थान पर कब्जा करने के लिए होता है, जो कि हटाए गए वस्तु के रूप में होता है, एक विभाजन दोष ([[स्मृति सुरक्षा]] का उल्लंघन) के कारण प्रोग्राम क्रैश हो जाता है। और अपरिभाषित व्यवहार के अन्य रूप।
- हटाए गए ऑब्जेक्ट्स के पॉइंटर्स जंगली पॉइंटर्स बन जाते हैं यदि पोस्ट-डिलीशन का उपयोग किया जाता है; इस तरह के पॉइंटर्स का उपयोग करने का प्रयास करने से मुश्किल-से-निदान बग हो सकते हैं।
जो भाषाएँ विशेष रूप से कचरा संग्रह (कंप्यूटर विज्ञान) का उपयोग करती हैं, वे दोषों के अंतिम दो वर्गों से बचने के लिए जानी जाती हैं। मेमोरी लीक अभी भी हो सकता है (और बाउंडेड लीक अक्सर जेनरेशनल या रूढ़िवादी कचरा संग्रह के साथ होता है), लेकिन आमतौर पर मैनुअल सिस्टम में मेमोरी लीक से कम गंभीर होता है।
संसाधन अधिग्रहण प्रारंभ है
मैनुअल मेमोरी प्रबंधन का एक शुद्धता लाभ है, जो यह है कि यह संसाधन अधिग्रहण प्रारंभ है (RAII) प्रतिमान के माध्यम से स्वचालित संसाधन प्रबंधन (कंप्यूटिंग) की अनुमति देता है।
यह तब उत्पन्न होता है जब ऑब्जेक्ट दुर्लभ सिस्टम संसाधनों (जैसे ग्राफिक्स संसाधन, फ़ाइल हैंडल, या डेटाबेस कनेक्शन) के मालिक होते हैं, जिन्हें किसी वस्तु के नष्ट होने पर छोड़ देना चाहिए - जब संसाधन स्वामित्व का जीवनकाल वस्तु के जीवनकाल से बंधा होना चाहिए। मैनुअल प्रबंधन वाली भाषाएं ऑब्जेक्ट इनिशियलाइज़ेशन (निर्माणकर्ता में) के दौरान संसाधन प्राप्त करके और ऑब्जेक्ट विनाश (विध्वंसक (कंप्यूटर विज्ञान) में) के दौरान जारी करके इसे व्यवस्थित कर सकती हैं, जो एक सटीक समय पर होता है। इसे रिसोर्स एक्विजिशन इज़ इनिशियलाइज़ेशन के रूप में जाना जाता है।
इसका उपयोग नियतात्मक संदर्भ गणना के साथ भी किया जा सकता है। सी ++ में, इस क्षमता को अन्यथा मैन्युअल ढांचे के भीतर मेमोरी डीलोकेशन को स्वचालित करने के लिए आगे उपयोग करने के लिए रखा जाता है, का उपयोग shared_ptr
स्मृति प्रबंधन करने के लिए भाषा के मानक पुस्तकालय में टेम्पलेट एक सामान्य प्रतिमान है। shared_ptr
हालाँकि, सभी वस्तु उपयोग पैटर्न के लिए उपयुक्त नहीं है।
यह दृष्टिकोण अधिकांश कचरा एकत्रित भाषाओं में उपयोग करने योग्य नहीं है - विशेष रूप से कचरा कलेक्टरों का पता लगाने या अधिक उन्नत संदर्भ गिनती - अंतिम रूप से गैर-नियतात्मक होने के कारण, और कभी-कभी बिल्कुल भी नहीं होता है। यही है, यह परिभाषित करना (या निर्धारित करना) मुश्किल है कि कब या एक finalizer विधि को बुलाया जा सकता है; इसे आमतौर पर फाइनलाइज़र समस्या के रूप में जाना जाता है। जावा और अन्य GC'd भाषाएं निपटान पैटर्न के माध्यम से मेमोरी के अलावा दुर्लभ सिस्टम संसाधनों के लिए अक्सर मैन्युअल प्रबंधन का उपयोग करती हैं: कोई भी वस्तु जो संसाधनों का प्रबंधन करती है, उसे लागू करने की उम्मीद है dispose()
विधि, जो ऐसे किसी भी संसाधन को जारी करती है और वस्तु को निष्क्रिय के रूप में चिह्नित करती है। प्रोग्रामर को आमंत्रित करने की उम्मीद है dispose()
मैन्युअल रूप से दुर्लभ ग्राफिक्स संसाधनों के रिसाव को रोकने के लिए उपयुक्त है। निर्भर करना finalize()
ग्राफिक्स संसाधनों को जारी करने के लिए विधि (कैसे जावा फाइनलाइज़र लागू करता है) व्यापक रूप से जावा प्रोग्रामर के बीच खराब प्रोग्रामिंग अभ्यास के रूप में देखा जाता है, और इसी तरह __del__()
संसाधनों को जारी करने के लिए पायथन में विधि पर भरोसा नहीं किया जा सकता है। स्टैक संसाधनों के लिए (संसाधन प्राप्त किए गए और कोड के एक ब्लॉक के भीतर जारी किए गए), इसे विभिन्न भाषा निर्माणों द्वारा स्वचालित किया जा सकता है, जैसे कि पायथन with
, सी#एस using
या जावा का try
-संसाधनों के साथ।
प्रदर्शन
मैनुअल मेमोरी प्रबंधन के कई समर्थकों का तर्क है कि कचरा संग्रह (कंप्यूटर विज्ञान) जैसी स्वचालित तकनीकों की तुलना में यह बेहतर प्रदर्शन प्रदान करता है। परंपरागत रूप से विलंबता सबसे बड़ा लाभ था, लेकिन अब ऐसा नहीं है। मैनुअल आवंटन में अक्सर संदर्भ का बेहतर स्थान होता है।[citation needed] मैनुअल आवंटन उन प्रणालियों के लिए अधिक उपयुक्त माना जाता है जहां तेजी से सुधार के कारण मेमोरी एक दुर्लभ संसाधन है। मेमोरी सिस्टम बार-बार थ्रैश कर सकता है और कर सकता है क्योंकि प्रोग्राम के कार्य का संग्रह का आकार उपलब्ध मेमोरी के आकार तक पहुंचता है; कचरा-एकत्रित प्रणाली में अप्रयुक्त वस्तुएँ मैन्युअल रूप से प्रबंधित प्रणालियों की तुलना में लंबे समय तक अप्रयुक्त स्थिति में रहती हैं, क्योंकि वे प्रभावी कार्य सेट आकार को बढ़ाते हुए तुरंत पुनः दावा नहीं किए जाते हैं।
मैनुअल प्रबंधन के कई प्रलेखित प्रदर्शन नुकसान हैं:
- को कॉल करता है
delete
और हर बार जब वे बनाए जाते हैं तो एक ओवरहेड होता है, इस ओवरहेड को कचरा संग्रह चक्रों में परिशोधित किया जा सकता है। यह मल्टीथ्रेडेड एप्लिकेशन के लिए विशेष रूप से सच है, जहां डिलीट कॉल को सिंक्रोनाइज़ किया जाना चाहिए। - आवंटन दिनचर्या अधिक जटिल और धीमी हो सकती है। कुछ कचरा संग्रह योजनाएँ, जैसे कि हीप (स्मृति प्रबंधन) संघनन के साथ, मुफ्त स्टोर को मेमोरी की एक साधारण सरणी के रूप में बनाए रख सकती हैं (जैसा कि मैनुअल प्रबंधन योजनाओं के लिए आवश्यक जटिल कार्यान्वयन के विपरीत)।
लेटेंसी एक विवादित बिंदु है जो समय के साथ बदल गया है, प्रारंभिक कचरा संग्रहकर्ता और सरल कार्यान्वयन मैनुअल मेमोरी प्रबंधन की तुलना में बहुत खराब प्रदर्शन करते हैं, लेकिन परिष्कृत आधुनिक कचरा संग्रहकर्ता अक्सर मैनुअल मेमोरी प्रबंधन की तुलना में अच्छा या बेहतर प्रदर्शन करते हैं।
मैनुअल आवंटन लंबे ठहराव के समय से ग्रस्त नहीं होता है जो सरल स्टॉप-द-वर्ल्ड कचरा संग्रह में होता है, हालांकि आधुनिक कचरा कलेक्टरों में संग्रह चक्र होते हैं जो अक्सर ध्यान देने योग्य नहीं होते हैं।[citation needed] मैनुअल मेमोरी प्रबंधन और कचरा संग्रह दोनों ही संभावित असीमित डीललोकेशन समय से ग्रस्त हैं - मैनुअल मेमोरी मैनेजमेंट क्योंकि किसी एक वस्तु को हटाने के लिए इसके सदस्यों को हटाने की आवश्यकता हो सकती है, और इसके सदस्यों के सदस्यों आदि की पुनरावर्ती आवश्यकता हो सकती है, जबकि कचरा संग्रह में लंबे संग्रह चक्र हो सकते हैं। यह विशेष रूप से रीयल-टाइम कंप्यूटिंग सिस्टम में एक समस्या है, जहां असीमित संग्रह चक्र आम तौर पर अस्वीकार्य होते हैं; कचरा संग्राहक को रोककर रीयल-टाइम कचरा संग्रह संभव है, जबकि रीयल-टाइम मैन्युअल मेमोरी प्रबंधन के लिए बड़े डीललोकेशन से बचने या मैन्युअल रूप से डीललोकेशन को रोकने की आवश्यकता होती है।
संदर्भ
- Berger, E. D.; Zorn, B. G.; McKinley, K. S. (November 2002). "Reconsidering Custom Memory Allocation" (PDF). Proceedings of the 17th ACM SIGPLAN conference on Object-oriented programming, systems, languages, and applications. OOPSLA '02. pp. 1–12. CiteSeerX 10.1.1.119.5298. doi:10.1145/582419.582421. ISBN 1-58113-471-1.
बाहरी संबंध
- The Memory Management Reference
- Richard Jones and Rafael Lins, Garbage Collection: Algorithms for Automated Dynamic Memory Management, Wiley and Sons (1996), ISBN 0-471-94148-4