मैनुअल मेमोरी प्रबंधन: Difference between revisions

From Vigyanwiki
(TEXT)
(TEXT)
Line 26: Line 26:


* जब किसी अप्रयुक्त वस्तु को कभी भी मुफ्त संग्रहागार में वापस नहीं छोड़ा जाता है, इसे मेमोरी रहस्योद्घाटन के रूप में जाना जाता है। कुछ स्तिथियों में, [[स्मृति रिसाव|मेमोरी रिसाव]] सहनीय हो सकता है, जैसे कि एक प्रोग्राम जो अपने जीवनकाल में सीमित मात्रा में मेमोरी को रहस्योद्घाटन करता है, या एक लघु-संचालन प्रोग्राम जो एक [[ऑपरेटिंग सिस्टम|संचालन प्रणाली]] पर निर्भर करता है जब वह समाप्त होने पर अपने संसाधनों को हटा देता है। हालाँकि, कई स्तिथियों में लंबे समय तक चलने वाले कार्यक्रमों में मेमोरी रहस्योदघाटित होती है, और ऐसे स्तिथियों में मेमोरी की असीमित मात्रा रहस्योदघाटित हो जाती है। जब ऐसा होता है, तो उपलब्ध मुफ्त संग्रहागार का आकार समय के साथ घटता रहता है; जब यह अंततः समाप्त हो जाता है, तब प्रोग्राम ध्वस्त हो जाता है।
* जब किसी अप्रयुक्त वस्तु को कभी भी मुफ्त संग्रहागार में वापस नहीं छोड़ा जाता है, इसे मेमोरी रहस्योद्घाटन के रूप में जाना जाता है। कुछ स्तिथियों में, [[स्मृति रिसाव|मेमोरी रिसाव]] सहनीय हो सकता है, जैसे कि एक प्रोग्राम जो अपने जीवनकाल में सीमित मात्रा में मेमोरी को रहस्योद्घाटन करता है, या एक लघु-संचालन प्रोग्राम जो एक [[ऑपरेटिंग सिस्टम|संचालन प्रणाली]] पर निर्भर करता है जब वह समाप्त होने पर अपने संसाधनों को हटा देता है। हालाँकि, कई स्तिथियों में लंबे समय तक चलने वाले कार्यक्रमों में मेमोरी रहस्योदघाटित होती है, और ऐसे स्तिथियों में मेमोरी की असीमित मात्रा रहस्योदघाटित हो जाती है। जब ऐसा होता है, तो उपलब्ध मुफ्त संग्रहागार का आकार समय के साथ घटता रहता है; जब यह अंततः समाप्त हो जाता है, तब प्रोग्राम ध्वस्त हो जाता है।
* [[गतिशील स्मृति प्रबंधन|गतिशील मेमोरी प्रबंधन]] प्रणाली की भयावह विफलता का परिणाम तब हो सकता है जब किसी वस्तु की पश्च मेमोरी को उसके नीचे से एक से अधिक बार हटा दिया जाता है; एक वस्तु स्पष्ट रूप से एक से अधिक बार नष्ट हो जाती है; जब, मुफ्त संग्रहागार पर आवंटित नहीं की गई वस्तु में प्रकलन करने के लिए एक सूचक का उपयोग करते समय, एक प्रोग्रामर उक्त सूचक के लक्ष्य वस्तु की पश्च मेमोरी को अ'''वमुक्त करने का प्रयास क'''रता है; या जब, किसी वस्तु को सूचक के माध्यम से दूसरे में प्रकलन करते समय, किसी अज्ञात बाहरी कार्य, थ्रेड या प्रक्रिया द्वारा प्रबंधित मेमोरी के मनमाना क्षेत्र, एक प्रोग्रामर उस वस्तु की स्थिति को दूषित करता है, संभवतः इस तरह से अपनी सीमाओं के बाहर लिखने और भ्रष्ट करने के लिए इसकी मेमोरी प्रबंधन डेटा। इस तरह की कार्रवाइयों के परिणाम में [[ढेर भ्रष्टाचार]], एक अलग (और नव निर्मित) वस्तु का समय से पहले विनाश शामिल हो सकता है जो मेमोरी में उसी स्थान पर कब्जा करने के लिए होता है, जो कि हटाए गए वस्तु के रूप में होता है, एक विभाजन दोष ([[[[स्मृति सुरक्षा|मेमोरी सुरक्षा]]]] का उल्लंघन) के कारण प्रोग्राम ध्वस्त हो जाता है। और [[अपरिभाषित व्यवहार]] के अन्य रूप।
* [[गतिशील स्मृति प्रबंधन|गतिशील मेमोरी प्रबंधन]] प्रणाली की भयावह विफलता का परिणाम तब हो सकता है जब किसी वस्तु की पश्च मेमोरी को उसके नीचे से एक से अधिक बार हटा दिया जाता है; एक वस्तु स्पष्ट रूप से एक से अधिक बार नष्ट हो जाती है; जब, मुफ्त संग्रहागार पर आवंटित नहीं की गई वस्तु में प्रकलन करने के लिए एक सूचक का उपयोग करते समय, एक प्रोग्रामर उक्त सूचक के लक्ष्य वस्तु की पश्च मेमोरी को अवमुक्त करने का प्रयास करता है; या जब, किसी वस्तु को सूचक के माध्यम से दूसरे में प्रकलन करते समय, किसी अज्ञात बाहरी कार्य, क्रम या प्रक्रिया द्वारा प्रबंधित मेमोरी के प्रकलित क्षेत्र, एक प्रोग्रामर उस वस्तु की स्थिति को संभवत: इस तरह से कि वह अपनी सीमा के बाहर लिख सके और अपने स्मृति प्रबंधन डेटा को विकृत कर सके। इस तरह की कार्रवाइयों के परिणाम में [[ढेर भ्रष्टाचार]], एक अलग (और नव निर्मित) वस्तु का समय से पहले विनाश सम्मिलित हो सकता है जो मेमोरी में उसी स्थान पर कब्जा करने के लिए होता है।
* हटाए गए वस्तु्स के सूचक्स जंगली सूचक्स बन जाते हैं यदि पोस्ट-डिलीशन का उपयोग किया जाता है; इस तरह के सूचक्स का उपयोग करने का प्रयास करने से मुश्किल-से-निदान बग हो सकते हैं।
* यदि पोस्ट-डिलीशन का उपयोग किया जाता है तो हटाए गए वस्तु के सूचक निलंबित सूचक बन जाते हैं; इस तरह के सूचक का उपयोग करने का प्रयास करने से मुश्किल-निदान बग हो सकते हैं।


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


== संसाधन अधिग्रहण प्रारंभ है ==
== संसाधन अधिग्रहण आरंभीकरण है ==
{{main|Resource Acquisition Is Initialization}}
{{main|संसाधन अधिग्रहण आरंभीकरण है}}
स्वतः मेमोरी प्रबंधन का एक शुद्धता लाभ है, जो यह है कि यह [[संसाधन अधिग्रहण प्रारंभ है]] (RAII) प्रतिमान के माध्यम से स्वचालित [[संसाधन प्रबंधन (कंप्यूटिंग)]] की अनुमति देता है।
स्वतः मेमोरी प्रबंधन का एक शुद्धता लाभ है, जो यह है कि यह [[संसाधन अधिग्रहण प्रारंभ है|संसाधन अधिग्रहण आरंभीकरण]] (RAII) प्रतिमान के माध्यम से स्वचालित [[संसाधन प्रबंधन (कंप्यूटिंग)]] की अनुमति देता है।


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


इसका उपयोग नियतात्मक संदर्भ गणना के साथ भी किया जा सकता है। सी ++ में, इस क्षमता को अन्यथा स्वतः ढांचे के भीतर मेमोरी डीलोकेशन को स्वचालित करने के लिए आगे उपयोग करने के लिए रखा जाता है, का उपयोग <code>[[shared_ptr]]</code> मेमोरी प्रबंधन करने के लिए भाषा के मानक पुस्तकालय में टेम्पलेट एक सामान्य प्रतिमान है। <code>shared_ptr</code> हालाँकि, सभी वस्तु उपयोग पैटर्न के लिए उपयुक्त नहीं है।
इसका उपयोग नियतात्मक संदर्भ गणना के साथ भी किया जा सकता है। C ++ में, इस क्षमता को अन्यथा स्वतः ढांचे के भीतर मेमोरी आवंटन रद्द को स्वचालित करने के लिए आगे उपयोग करने के लिए रखा जाता है, <code>[[shared_ptr|शेयर्ड_ptr]]</code> टेम्पलेट का उपयोग मेमोरी प्रबंधन करने के लिए भाषा के मानक पुस्तकालय में एक सामान्य प्रतिमान है। हालाँकि<code>शेयर्ड_ptr</code>, सभी वस्तु उपयोग पतिरूप के लिए उपयुक्त नहीं है।


यह दृष्टिकोण अधिकांश अपशिष्ट एकत्रित भाषाओं में उपयोग करने योग्य नहीं है - विशेष रूप से अपशिष्ट कलेक्टरों का पता लगाने या अधिक उन्नत संदर्भ गिनती - अंतिम रूप से गैर-नियतात्मक होने के कारण, और कभी-कभी बिल्कुल भी नहीं होता है। यही है, यह परिभाषित करना (या निर्धारित करना) मुश्किल है कि कब या एक [[finalizer]] विधि को बुलाया जा सकता है; इसे आमतौर पर [[फाइनलाइज़र समस्या]] के रूप में जाना जाता है। जावा और अन्य GC'd भाषाएं [[निपटान पैटर्न]] के माध्यम से मेमोरी के अलावा दुर्लभ प्रणाली संसाधनों के लिए अक्सर स्वतः प्रबंधन का उपयोग करती हैं: कोई भी वस्तु जो संसाधनों का प्रबंधन करती है, उसे लागू करने की उम्मीद है <code>dispose()</code> विधि, जो ऐसे किसी भी संसाधन को जारी करती है और वस्तु को निष्क्रिय के रूप में चिह्नित करती है। प्रोग्रामर को आमंत्रित करने की उम्मीद है <code>dispose()</code> स्वतः रूप से दुर्लभ ग्राफिक्स संसाधनों के रिसाव को रोकने के लिए उपयुक्त है। निर्भर करना <code>finalize()</code> ग्राफिक्स संसाधनों को जारी करने के लिए विधि (कैसे जावा फाइनलाइज़र लागू करता है) व्यापक रूप से जावा प्रोग्रामर के बीच खराब प्रोग्रामिंग अभ्यास के रूप में देखा जाता है, और इसी तरह <code>__del__()</code> संसाधनों को जारी करने के लिए पायथन में विधि पर भरोसा नहीं किया जा सकता है। स्टैक संसाधनों के लिए (संसाधन प्राप्त किए गए और कोड के एक ब्लॉक के भीतर जारी किए गए), इसे विभिन्न भाषा निर्माणों द्वारा स्वचालित किया जा सकता है, जैसे कि पायथन <code>with</code>, सी#एस <code>using</code> या जावा का <code>try</code>-संसाधनों के साथ।
यह दृष्टिकोण अधिकांश अपशिष्ट एकत्रित भाषाओं में उपयोग करने योग्य नहीं है - विशेष रूप से अपशिष्ट संग्रहकर्ता का पता लगाने या अधिक उन्नत संदर्भ गिनती करने में- अंतिम रूप से गैर-नियतात्मक होने के कारण, और कभी-कभी बिल्कुल भी नहीं होता है। यही है, यह परिभाषित करना (या निर्धारित करना) मुश्किल है कि कब एक [[finalizer|फ़िनलिज़र]] विधि को बुलाया जा सकता है; इसे सामान्यतः [[फाइनलाइज़र समस्या]] के रूप में जाना जाता है। जावा और अन्य GC'd भाषाएं [[निपटान पैटर्न|निपटान पतिरूप]] के माध्यम से मेमोरी के अलावा दुर्लभ प्रणाली संसाधनों के लिए प्रायः स्वतः प्रबंधन का उपयोग करती हैं: कोई भी वस्तु जो संसाधनों का प्रबंधन करती है, उसे <code>डिस्पोस()</code> विधि लागू करने की उम्मीद है, जो ऐसे किसी भी संसाधन को जारी करती है और वस्तु को निष्क्रिय के रूप में चिह्नित करती है। दुर्लभ ग्राफिक्स संसाधनों के "लीकिंग" को रोकने के लिए प्रोग्रामर से अपेक्षा की जाती है कि वे मैन्युअल रूप से <code>डिस्पोस()</code> को लागू करें। ग्राफिक्स संसाधनों को जारी करने के लिए <code>finalize()</code> विधि (जावा कैसे अंतिम निर्णय को लागू करता है) के आधार पर जावा प्रोग्रामर के बीच व्यापक रूप से खराब प्रोग्रामिंग अभ्यास के रूप में देखा जाता है, और इसी तरह पायथन में अनुरूप __del__ () विधि पर संसाधनों को जारी करने के लिए भरोसा नहीं किया जा सकता है। स्टैक संसाधनों के लिए (संसाधन प्राप्त किए गए और कूट के एक ब्लॉक के भीतर जारी किए गए), इसे विभिन्न भाषा निर्माणों द्वारा स्वचालित किया जा सकता है, जैसे कि पायथन <code>with</code>, C#s <code>using</code> या जावा के <code>try</code>-संसाधनों के साथ।


== प्रदर्शन ==
== प्रदर्शन ==


स्वतः मेमोरी प्रबंधन के कई समर्थकों का तर्क है कि अपशिष्ट संग्रह (कंप्यूटर विज्ञान) जैसी स्वचालित तकनीकों की तुलना में यह बेहतर प्रदर्शन प्रदान करता है। परंपरागत रूप से विलंबता सबसे बड़ा लाभ था, लेकिन अब ऐसा नहीं है। स्वतः आवंटन में अक्सर संदर्भ का बेहतर स्थान होता है।{{Citation needed|date=December 2011}}
स्वतः मेमोरी प्रबंधन के कई समर्थकों का तर्क है कि अपशिष्ट संग्रह (कंप्यूटर विज्ञान) जैसी स्वचालित तकनीकों की तुलना में यह बेहतर प्रदर्शन प्रदान करता है। परंपरागत रूप से विलंबता सबसे बड़ा लाभ था, लेकिन अब ऐसा नहीं है। स्वतः आवंटन में प्रायः संदर्भ का बेहतर स्थान होता है।{{Citation needed|date=December 2011}}
स्वतः आवंटन उन प्रणालियों के लिए अधिक उपयुक्त माना जाता है जहां तेजी से सुधार के कारण मेमोरी एक दुर्लभ संसाधन है। मेमोरी प्रणाली बार-बार थ्रैश कर सकता है और कर सकता है क्योंकि प्रोग्राम के [[कार्य का संग्रह]] का आकार उपलब्ध मेमोरी के आकार तक पहुंचता है; अपशिष्ट-एकत्रित प्रणाली में अप्रयुक्त वस्तुएँ स्वतः रूप से प्रबंधित प्रणालियों की तुलना में लंबे समय तक अप्रयुक्त स्थिति में रहती हैं, क्योंकि वे प्रभावी कार्य सेट आकार को बढ़ाते हुए तुरंत पुनः दावा नहीं किए जाते हैं।


स्वतः प्रबंधन के कई प्रलेखित प्रदर्शन नुकसान हैं:
स्वतः आवंटन उन प्रणालियों के लिए अधिक उपयुक्त माना जाता है जहां तेजी से सुधार के कारण मेमोरी एक दुर्लभ संसाधन है। मेमोरी प्रणाली बार-बार थ्रैश कर सकता है क्योंकि प्रोग्राम के [[कार्य का संग्रह|कार्य संग्रह]] का आकार उपलब्ध मेमोरी के आकार तक पहुंचता है; अपशिष्ट-एकत्रित प्रणाली में अप्रयुक्त वस्तुएँ स्वतः रूप से प्रबंधित प्रणालियों की तुलना में लंबे समय तक अप्रयुक्त स्थिति में रहती हैं, क्योंकि वे प्रभावी कार्य सम्मुच्चय आकार को बढ़ाते हुए पुनः दावा नहीं किए जाते हैं।


* को कॉल करता है <code>delete</code> और हर बार जब वे बनाए जाते हैं तो एक ओवरहेड होता है, इस ओवरहेड को अपशिष्ट संग्रह चक्रों में परिशोधित किया जा सकता है। यह मल्टीथ्रेडेड एप्लिकेशन के लिए विशेष रूप से सच है, जहां डिलीट कॉल को सिंक्रोनाइज़ किया जाना चाहिए।
स्वतः प्रबंधन के कई प्रलेखित प्रदर्शन हानि हैं:
 
* <code>delete</code> की मांग करता है और हर बार जब वे बनाए जाते हैं तो एक उपरिव्यय होता है, इस उपरिव्यय को अपशिष्ट संग्रह चक्रों में परिशोधित किया जा सकता है। यह बहु सूत्रित एप्लिकेशन के लिए विशेष रूप से सच है, जहां डिलीट मांग को तुल्यकालित किया जाना चाहिए।
* आवंटन दिनचर्या अधिक जटिल और धीमी हो सकती है। कुछ अपशिष्ट संग्रह योजनाएँ, जैसे कि [[हीप (स्मृति प्रबंधन)|हीप (मेमोरी प्रबंधन)]] संघनन के साथ, मुफ्त संग्रहागार को मेमोरी की एक साधारण सरणी के रूप में बनाए रख सकती हैं (जैसा कि स्वतः प्रबंधन योजनाओं के लिए आवश्यक जटिल कार्यान्वयन के विपरीत)।
* आवंटन दिनचर्या अधिक जटिल और धीमी हो सकती है। कुछ अपशिष्ट संग्रह योजनाएँ, जैसे कि [[हीप (स्मृति प्रबंधन)|हीप (मेमोरी प्रबंधन)]] संघनन के साथ, मुफ्त संग्रहागार को मेमोरी की एक साधारण सरणी के रूप में बनाए रख सकती हैं (जैसा कि स्वतः प्रबंधन योजनाओं के लिए आवश्यक जटिल कार्यान्वयन के विपरीत)।


लेटेंसी एक विवादित बिंदु है जो समय के साथ बदल गया है, प्रारंभिक अपशिष्ट संग्रहकर्ता और सरल कार्यान्वयन स्वतः मेमोरी प्रबंधन की तुलना में बहुत खराब प्रदर्शन करते हैं, लेकिन परिष्कृत आधुनिक अपशिष्ट संग्रहकर्ता अक्सर स्वतः मेमोरी प्रबंधन की तुलना में अच्छा या बेहतर प्रदर्शन करते हैं।
लेटेंसी एक विवादित बिंदु है जो समय के साथ बदल गया है, प्रारंभिक अपशिष्ट संग्रहकर्ता और सरल कार्यान्वयन स्वतः मेमोरी प्रबंधन की तुलना में बहुत खराब प्रदर्शन करते हैं, लेकिन परिष्कृत आधुनिक अपशिष्ट संग्रहकर्ता प्रायः स्वतः मेमोरी प्रबंधन की तुलना में अच्छा या बेहतर प्रदर्शन करते हैं।
 
स्वतः आवंटन लंबे ठहराव के समय से ग्रस्त नहीं होता है जो सरल स्टॉप-द-वर्ल्ड अपशिष्ट संग्रह में होता है, हालांकि आधुनिक अपशिष्ट संकलनकर्ता में संग्रह चक्र होते हैं जो प्रायः ध्यान देने योग्य नहीं होते हैं।{{Citation needed|date=September 2021}}


स्वतः आवंटन लंबे ठहराव के समय से ग्रस्त नहीं होता है जो सरल स्टॉप-द-वर्ल्ड अपशिष्ट संग्रह में होता है, हालांकि आधुनिक अपशिष्ट कलेक्टरों में संग्रह चक्र होते हैं जो अक्सर ध्यान देने योग्य नहीं होते हैं।{{Citation needed|date=September 2021}}
स्वतः मेमोरी प्रबंधन और अपशिष्ट संग्रह दोनों ही संभावित असीमित पुनःआवंटन समय से ग्रस्त हैं - स्वतः मेमोरी प्रबंधन क्योंकि किसी एक वस्तु को हटाने के लिए इसके सदस्यों को हटाने की आवश्यकता हो सकती है, और इसके सदस्यों के सदस्यों आदि की पुनरावर्ती आवश्यकता हो सकती है, जबकि अपशिष्ट संग्रह में लंबे संग्रह चक्र हो सकते हैं। यह विशेष रूप से [[रीयल-टाइम कंप्यूटिंग|समयोचित कंप्यूटिंग]] प्रणाली में एक समस्या है, जहां असीमित संग्रह चक्र सामान्यतः अस्वीकार्य होते हैं; अपशिष्ट संग्राहक को रोककर समयोचित अपशिष्ट संग्रह संभव है, जबकि समयोचित स्वतः मेमोरी प्रबंधन के लिए बड़े पुनःआवंटन से बचने या स्वतः रूप से पुनःआवंटन को रोकने की आवश्यकता होती है।
स्वतः मेमोरी प्रबंधन और अपशिष्ट संग्रह दोनों ही संभावित असीमित डीललोकेशन समय से ग्रस्त हैं - स्वतः मेमोरी प्रबंधन क्योंकि किसी एक वस्तु को हटाने के लिए इसके सदस्यों को हटाने की आवश्यकता हो सकती है, और इसके सदस्यों के सदस्यों आदि की पुनरावर्ती आवश्यकता हो सकती है, जबकि अपशिष्ट संग्रह में लंबे संग्रह चक्र हो सकते हैं। यह विशेष रूप से [[रीयल-टाइम कंप्यूटिंग]] प्रणाली में एक समस्या है, जहां असीमित संग्रह चक्र सामान्यतः अस्वीकार्य होते हैं; अपशिष्ट संग्राहक को रोककर रीयल-टाइम अपशिष्ट संग्रह संभव है, जबकि रीयल-टाइम स्वतः मेमोरी प्रबंधन के लिए बड़े डीललोकेशन से बचने या स्वतः रूप से डीललोकेशन को रोकने की आवश्यकता होती है।


==संदर्भ==
==संदर्भ==

Revision as of 01:49, 28 February 2023

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

विवरण

कई प्रोग्रामिंग भाषा स्वतः तकनीकों का उपयोग यह निर्धारित करने के लिए करती हैं कि मुक्त संग्रहागार से एक नई वस्तु कब आवंटित की जाए। C मल्लोकफलन का उपयोग करता है ; C++ और Java न्यू संचालक का उपयोग करते हैं; और कई अन्य भाषाएँ (जैसे कि पायथन) सभी वस्तुओं को मुफ्त संग्रहागार से आवंटित करती हैं। यह निर्धारित करना कि किसी वस्तु को कब बनाया जाना चाहिए (वस्तु निर्माण) सामान्यतः तुच्छ और अप्रमाणिक है, हालांकि वस्तु पूल जैसी तकनीकों का मतलब है कि तत्काल उपयोग से पहले एक वस्तु बनाई जा सकती है। वास्तविक चुनौती वस्तु विनाश है - यह निर्धारित करना कि कब किसी वस्तु की आवश्यकता नहीं है (अर्थात अपशिष्ट है), और इसके अंतर्निहित भंडारण को फिर से उपयोग के लिए मुफ्त संग्रहागार में वापस करने की व्यवस्था करना। स्वतः मेमोरी आवंटन में, यह प्रोग्रामर द्वारा स्वतः रूप से भी निर्दिष्ट किया जाता है; जैसे कार्यों के माध्यम से C में free(), या C ++ में delete संचालक - यह स्वचालित चर में रखी गई वस्तुओं के स्वत: विनाश के विपरीत है, विशेष रूप से (गैर-स्थैतिक) कार्यों के स्थानीय चर, जो C और C ++ में उनके दायरे के अंत में नष्ट हो जाते हैं।

स्वतः मेमोरी प्रबंधन तकनीक

उदाहरण के लिए

स्वतः प्रबंधन और शुद्धता

स्वतः मेमोरी प्रबंधन को गलत तरीके से उपयोग किए जाने पर प्रोग्राम में बग के कई प्रमुख वर्गों को सक्षम करने के लिए जाना जाता है, विशेष रूप से मेमोरी सुरक्षा या मेमोरी रहस्योद्घाटन का उल्लंघन। ये सुरक्षा बग का एक महत्वपूर्ण स्रोत हैं।

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

जो भाषाएँ विशेष रूप से अपशिष्ट संग्रह (कंप्यूटर विज्ञान) का उपयोग करती हैं, वे दोषों के अंतिम दो वर्गों से बचने के लिए जानी जाती हैं। मेमोरी रहस्योद्घाटन अभी भी हो सकता है (और परिबद्ध रहस्योद्घाटन प्रायः पीढ़ीगत या रूढ़िवादी अपशिष्ट संग्रह के साथ होता है), लेकिन सामान्यतः स्वतः प्रणाली में मेमोरी रहस्योद्घाटन से कम गंभीर होता है।

संसाधन अधिग्रहण आरंभीकरण है

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

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

इसका उपयोग नियतात्मक संदर्भ गणना के साथ भी किया जा सकता है। C ++ में, इस क्षमता को अन्यथा स्वतः ढांचे के भीतर मेमोरी आवंटन रद्द को स्वचालित करने के लिए आगे उपयोग करने के लिए रखा जाता है, शेयर्ड_ptr टेम्पलेट का उपयोग मेमोरी प्रबंधन करने के लिए भाषा के मानक पुस्तकालय में एक सामान्य प्रतिमान है। हालाँकिशेयर्ड_ptr, सभी वस्तु उपयोग पतिरूप के लिए उपयुक्त नहीं है।

यह दृष्टिकोण अधिकांश अपशिष्ट एकत्रित भाषाओं में उपयोग करने योग्य नहीं है - विशेष रूप से अपशिष्ट संग्रहकर्ता का पता लगाने या अधिक उन्नत संदर्भ गिनती करने में- अंतिम रूप से गैर-नियतात्मक होने के कारण, और कभी-कभी बिल्कुल भी नहीं होता है। यही है, यह परिभाषित करना (या निर्धारित करना) मुश्किल है कि कब एक फ़िनलिज़र विधि को बुलाया जा सकता है; इसे सामान्यतः फाइनलाइज़र समस्या के रूप में जाना जाता है। जावा और अन्य GC'd भाषाएं निपटान पतिरूप के माध्यम से मेमोरी के अलावा दुर्लभ प्रणाली संसाधनों के लिए प्रायः स्वतः प्रबंधन का उपयोग करती हैं: कोई भी वस्तु जो संसाधनों का प्रबंधन करती है, उसे डिस्पोस() विधि लागू करने की उम्मीद है, जो ऐसे किसी भी संसाधन को जारी करती है और वस्तु को निष्क्रिय के रूप में चिह्नित करती है। दुर्लभ ग्राफिक्स संसाधनों के "लीकिंग" को रोकने के लिए प्रोग्रामर से अपेक्षा की जाती है कि वे मैन्युअल रूप से डिस्पोस() को लागू करें। ग्राफिक्स संसाधनों को जारी करने के लिए finalize() विधि (जावा कैसे अंतिम निर्णय को लागू करता है) के आधार पर जावा प्रोग्रामर के बीच व्यापक रूप से खराब प्रोग्रामिंग अभ्यास के रूप में देखा जाता है, और इसी तरह पायथन में अनुरूप __del__ () विधि पर संसाधनों को जारी करने के लिए भरोसा नहीं किया जा सकता है। स्टैक संसाधनों के लिए (संसाधन प्राप्त किए गए और कूट के एक ब्लॉक के भीतर जारी किए गए), इसे विभिन्न भाषा निर्माणों द्वारा स्वचालित किया जा सकता है, जैसे कि पायथन with, C#s 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.


बाहरी संबंध