मैं अप्रबंधित संसाधनों के बारे में जानना चाहता हूं। क्या कोई मुझे एक मूल विचार दे सकता है?
मैं अप्रबंधित संसाधनों के बारे में जानना चाहता हूं। क्या कोई मुझे एक मूल विचार दे सकता है?
जवाबों:
प्रबंधित संसाधनों का अर्थ मूल रूप से "प्रबंधित मेमोरी" है जो कचरा कलेक्टर द्वारा प्रबंधित किया जाता है। जब आपके पास अब प्रबंधित ऑब्जेक्ट (जो प्रबंधित मेमोरी का उपयोग करता है) का कोई संदर्भ नहीं है, तो कचरा संग्रहकर्ता (अंततः) आपके लिए उस मेमोरी को जारी करेगा।
मानव रहित संसाधन तब सब कुछ हैं, जिसके बारे में कचरा कलेक्टर को पता नहीं है। उदाहरण के लिए:
आम तौर पर आप उन अप्रबंधित संसाधनों को जारी करना चाहते हैं इससे पहले कि आप उन सभी संदर्भों को खो दें जो आपके पास उनके प्रबंधन के उद्देश्य हैं। आप Dispose
उस वस्तु पर कॉल करके ऐसा करते हैं , या (C # में) उस using
स्टेटमेंट का उपयोग करते हैं जो Dispose
आपके लिए कॉलिंग को हैंडल करेगा ।
यदि आप Dispose
अपने मानव रहित संसाधनों की सही ढंग से उपेक्षा करते हैं, तो कचरा संग्राहक अंततः आपके लिए इसे संभाल लेंगे जब उस संसाधन युक्त वस्तु को एकत्र किया जाता है (यह "अंतिम रूप" है)। लेकिन क्योंकि कूड़ा उठाने वाले ने मानव रहित संसाधनों के बारे में नहीं जाना है, इसलिए यह नहीं बता सकता है कि इसे जारी करने के लिए कितनी बुरी तरह से ज़रूरत है - इसलिए यह आपके प्रोग्राम के लिए खराब प्रदर्शन या संसाधनों से पूरी तरह से बाहर चलाने के लिए संभव है।
यदि आप अपने आप को एक वर्ग लागू करते हैं जो अप्रबंधित संसाधनों को संभालता है, तो इसे लागू करना Dispose
और Finalize
सही ढंग से लागू करना आपके ऊपर है।
Dispose
या उपयोग करने के लिए कहां कहता है using
।
IDisposable
। एक वर्ग तो करता है को लागू IDisposable
है, तो आप चाहिए साथ उस वर्ग के उदाहरणों के निपटान using
या Dispose()
जब आप उन लोगों के साथ किया जाता है। इसके आधार पर, आपका कॉन्सेप्ट धारण करता है: यदि कोई वर्ग लागू करता है IDisposable
, तो यह संभवतः मानव रहित संसाधनों को आंतरिक रूप से रखता है।
कुछ उपयोगकर्ता प्रबंधित संसाधनों के बीच खुली फाइलें, डीबी कनेक्शन, आवंटित मेमोरी, बिटमैप, फ़ाइल स्ट्रीम आदि को रैंक करते हैं, अन्य जो अप्रबंधित हैं। तो क्या वे प्रबंधित या अप्रबंधित हैं?
मेरी राय है, कि प्रतिक्रिया अधिक जटिल है: जब आप फ़ाइल को .NET में खोलते हैं, तो आप शायद कुछ अंतर्निहित .NET क्लास System.IO.File, FileStream या कुछ और का उपयोग करते हैं। क्योंकि यह एक सामान्य .NET क्लास है, इसलिए इसे मैनेज किया जाता है। लेकिन यह एक आवरण है, जो अंदर "गंदे काम" करता है (Win32 dlls का उपयोग करके ऑपरेटिंग सिस्टम के साथ संचार करता है, निम्न स्तर के कार्यों या यहां तक कि कोडांतरक निर्देशों को कॉल करता है) जो वास्तव में फ़ाइल खोलते हैं। और यह है, जो .NET के बारे में पता नहीं है, अप्रबंधित है। लेकिन आप शायद असेंबलर निर्देशों का उपयोग करके अपने आप फ़ाइल को खोल सकते हैं और .NET फ़ाइल फ़ंक्शन को बायपास कर सकते हैं। फिर हैंडल और ओपन फ़ाइल अप्रबंधित संसाधन हैं।
DB के साथ भी ऐसा ही है: यदि आप कुछ DB असेंबली का उपयोग करते हैं, तो आपके पास DbConnection इत्यादि जैसी कक्षाएं हैं, उन्हें .NET और प्रबंधित के लिए जाना जाता है। लेकिन वे "गंदे काम" को लपेटते हैं, जो अप्रबंधित है (सर्वर पर मेमोरी आवंटित करें, इसके साथ कनेक्शन स्थापित करें, ...)। यदि आप इस रैपर क्लास का उपयोग नहीं करते हैं और अपने आप से कुछ नेटवर्क सॉकेट खोलते हैं और कुछ आदेशों का उपयोग करके अपने स्वयं के अजीब डेटाबेस के साथ संवाद करते हैं, तो यह अप्रबंधित है।
इन आवरण वर्गों (फ़ाइल, DbConnection आदि) को प्रबंधित किया जाता है, लेकिन वे आपके जैसे ही अप्रबंधित संसाधनों का उपयोग करते हैं, यदि आप रैपर का उपयोग नहीं करते हैं और अपने आप से "गंदा काम" करते हैं। और इसलिए ये रैपर डिस्पोज / फाइनल पैटर्न लागू करते हैं। यह उनकी जिम्मेदारी है कि प्रोग्रामर को अप्रबंधित संसाधनों को जारी करने की अनुमति दें जब रैपर की जरूरत न हो, और जब रैपर कचरा एकत्र हो जाए तो उन्हें रिहा कर दें। रैपर कूड़ा इकट्ठा करने वाले द्वारा सही तरीके से एकत्र किया जाएगा, लेकिन डिस्पोजल / फाइनल पैटर्न का उपयोग करके अंदर के अप्रबंधित संसाधनों को एकत्र किया जाएगा।
यदि आप अपनी क्लास में बिल्ट-इन .NET या 3rd पार्टी रैपर क्लासेस और कुछ असेंबलर इंस्ट्रक्शन्स आदि के द्वारा फाइल का इस्तेमाल नहीं करते हैं, तो ये ओपन फाइल्स अनवांटेड हैं और आप डिस्प्यूट / फाइनल पैटर्न को लागू करना चाहिए। यदि आप नहीं करते हैं, तो स्मृति रिसाव हो जाएगा, हमेशा के लिए बंद संसाधन आदि तब भी जब आप इसका उपयोग नहीं करते हैं (फ़ाइल संचालन पूर्ण) या आपके समाप्त होने के बाद भी।
लेकिन इन रैपरों का उपयोग करते समय आपकी जिम्मेदारी भी है। उन लोगों के लिए, जो डिस्पोज़ / अंतिम रूप से लागू करते हैं (आप उन्हें पहचानते हैं, कि वे आईडीसोपायरी को लागू करते हैं), अपने डिस्पोज़ / फाइनल पैटर्न को भी लागू करें और इन रैपरों को भी डिस्पोज़ करें या अपने अप्रबंधित संसाधनों को जारी करने के लिए उन्हें संकेत दें। यदि आप नहीं करते हैं, तो संसाधन कुछ अनिश्चित समय के जारी होने के बाद होंगे, लेकिन इसे तुरंत जारी करने के लिए साफ है (फ़ाइल को तुरंत बंद करें और इसे खुला न छोड़ें और यादृच्छिक कई मिनटों / घंटों के लिए अवरुद्ध करें)। इसलिए आपकी कक्षा की डिस्पोज़ विधि में आप अपने सभी उपयोग किए गए रैपरों के डिस्पोज़ तरीकों को कहते हैं।
unmanaged vs managed resources
एक "अप्रबंधित संसाधन" एक चीज नहीं है, बल्कि एक जिम्मेदारी है। यदि कोई ऑब्जेक्ट एक अप्रबंधित संसाधन का मालिक है, तो इसका मतलब है कि (1) इसके बाहर कुछ इकाई को इस तरह से हेरफेर किया गया है, जो सफाई नहीं होने पर समस्या पैदा कर सकता है, और (2) ऑब्जेक्ट में ऐसी सफाई करने के लिए आवश्यक जानकारी है और जिम्मेदार है करने के लिए।
यद्यपि कई प्रकार के अप्रबंधित संसाधन विभिन्न प्रकार के ऑपरेटिंग-सिस्टम संस्थाओं (फाइल, जीडीआई हैंडल, आवंटित मेमोरी ब्लॉक आदि) के साथ बहुत दृढ़ता से जुड़े हुए हैं, एक भी प्रकार की इकाई नहीं है जो उन सभी द्वारा साझा की गई जिम्मेदारी के अलावा अन्य है। साफ - सफाई। आमतौर पर, यदि किसी वस्तु की या तो सफाई करने की ज़िम्मेदारी है, तो उसके पास एक निपटान पद्धति होगी जो उसे सभी क्लीनअप के लिए निर्देश देती है जिसके लिए वह ज़िम्मेदार है।
कुछ मामलों में, ऑब्जेक्ट इस संभावना के लिए भत्ते बनाएंगे कि उन्हें पहले डिस्पोजल कहे बिना किसी को छोड़ दिया जाए। जीसी वस्तुओं को अधिसूचना को अनुरोध करने की अनुमति देता है कि उन्हें छोड़ दिया गया है (अंतिम रूप से एक रूटीन को कॉल करके), और ऑब्जेक्ट इस अधिसूचना का उपयोग स्वयं सफाई करने के लिए कर सकते हैं।
"प्रबंधित संसाधन" और "अप्रबंधित संसाधन" जैसे शब्द, दुर्भाग्य से, विभिन्न लोगों द्वारा अलग-अलग चीजों का उपयोग करने के लिए उपयोग किए जाते हैं; स्पष्ट रूप से सोचें कि वस्तुओं के संदर्भ में सोचना अधिक उपयोगी है क्योंकि या तो कोई सफाई जिम्मेदारी नहीं है, सफाई की जिम्मेदारी है जिसे केवल तभी ध्यान रखा जाएगा यदि निपटान कहा जाता है, या सफाई जिम्मेदारी होने पर जिसे निपटान के माध्यम से ध्यान रखा जाना चाहिए, लेकिन जो हो सकता है अंतिम रूप से भी ध्यान रखना चाहिए।
एक प्रबंधित और अप्रबंधित संसाधन के बीच मूल अंतर यह है कि कचरा कलेक्टर सभी प्रबंधित संसाधनों के बारे में जानता है, किसी समय जीसी साथ आएगा और एक प्रबंधित वस्तु से जुड़े सभी मेमोरी और संसाधनों को साफ करेगा। जीसी अप्रबंधित संसाधनों के बारे में नहीं जानता है, जैसे कि फ़ाइलें, स्ट्रीम और हैंडल, इसलिए यदि आप उन्हें अपने कोड में स्पष्ट रूप से साफ नहीं करते हैं तो आप मेमोरी लीक और लॉक किए गए संसाधनों के साथ समाप्त हो जाएंगे।
यहां से चोरी हुई , पूरी पोस्ट पढ़ने के लिए स्वतंत्र महसूस करें।
कोई भी संसाधन जिसके लिए .NET प्रबंधित हीप में मेमोरी आवंटित की गई है वह एक प्रबंधित संसाधन है। सीएलआर इस तरह की स्मृति से पूरी तरह अवगत हैं और यह सुनिश्चित करने के लिए सब कुछ करेंगे कि यह अनाथ नहीं है। और कुछ भी अप्रबंधित नहीं है। उदाहरण के लिए, COM के साथ इंटरॉपिंग करने से, प्रॉक्स मेमोरी स्पेस में ऑब्जेक्ट्स बन सकते हैं, लेकिन CLR इसका ध्यान नहीं रखेगा। इस मामले में प्रबंधित वस्तु जो कि प्रबंधित बाउंड्री के पार कॉल करती है, उसे इससे आगे की किसी भी चीज की जिम्मेदारी होनी चाहिए।
आइए पहले समझते हैं कि VB6 या C ++ प्रोग्राम (नॉन डॉटनेट एप्लिकेशन) कैसे निष्पादित करते थे। हम जानते हैं कि कंप्यूटर केवल मशीन स्तर कोड को समझते हैं। मशीन स्तर कोड को देशी या बाइनरी कोड भी कहा जाता है। इसलिए, जब हम VB6 या C ++ प्रोग्राम निष्पादित करते हैं, तो संबंधित भाषा संकलक, संबंधित भाषा स्रोत कोड को मूल कोड में संकलित करता है, जिसे तब अंतर्निहित ऑपरेटिंग सिस्टम और हार्डवेयर द्वारा समझा जा सकता है।
मूल कोड (अनमैन्डेड कोड) ऑपरेटिंग सिस्टम पर विशिष्ट (देशी) है, जिस पर यह उत्पन्न होता है। यदि आप इस संकलित मूल कोड को लेते हैं और किसी अन्य ऑपरेटिंग सिस्टम पर चलने का प्रयास करते हैं तो यह विफल हो जाएगा। तो कार्यक्रम निष्पादन की इस शैली के साथ समस्या यह है कि, यह एक मंच से दूसरे मंच तक पोर्टेबल नहीं है।
आइए अब समझते हैं, कि .Net प्रोग्राम कैसे निष्पादित होता है। डॉटनेट का उपयोग करके हम विभिन्न प्रकार के एप्लिकेशन बना सकते हैं। कुछ सामान्य प्रकार के .NET अनुप्रयोगों में वेब, विंडोज, कंसोल और मोबाइल एप्लिकेशन शामिल हैं। आवेदन के प्रकार के बावजूद, जब आप किसी भी .NET अनुप्रयोग को निष्पादित करते हैं, तो निम्न होता है
.NET एप्लिकेशन इंटरमीडिएट भाषा (IL) में संकलित हो जाता है। IL को आम मध्यवर्ती भाषा (CIL) और Microsoft मध्यवर्ती भाषा (MSIL) के रूप में भी जाना जाता है। .NET और non .NET एप्लिकेशन दोनों एक असेंबली उत्पन्न करते हैं। असेंबलियों में .DLL या .EXE का एक्सटेंशन होता है। उदाहरण के लिए यदि आप एक विंडोज़ या कंसोल एप्लिकेशन को संकलित करते हैं, तो आपको एक .EXE मिलता है, जैसे कि जब हम एक वेब या क्लास लाइब्रेरी प्रोजेक्ट संकलित करते हैं तो हमें एक .DLL मिलता है। .NET और NON .NET असेंबली के बीच अंतर यह है कि, DOTNET असेंबली इंटरमीडिएट भाषा प्रारूप में है, जहाँ NON DOTNET असेंबली मूल कोड स्वरूप में है।
NON DOTNET एप्लिकेशन सीधे ऑपरेटिंग सिस्टम के शीर्ष पर चल सकते हैं, जहाँ DOTNET एप्लीकेशन एक वर्चुअल वातावरण के शीर्ष पर चलते हैं जिसे कॉमन लैंग्वेज रनटाइम (CLR) कहा जाता है। सीएलआर में जस्ट इन-टाइम कंपाइलर (जेआईटी) नामक एक घटक होता है, जो इंटरमीडिएट भाषा को देशी कोड में परिवर्तित कर देगा जिसे अंतर्निहित ऑपरेटिंग सिस्टम समझ सकता है।
इसलिए, .NET में एप्लिकेशन के निष्पादन में 2 चरण होते हैं। 1. भाषा संकलक, इंटरमीडिएट भाषा में स्रोत कोड को संकलित करता है (IL) 2. सीएलआर में JIT संकलक, IL को मूल कोड में परिवर्तित करता है, जिसे फिर अंतर्निहित ऑपरेटिंग सिस्टम पर चलाया जा सकता है ।
चूंकि, .NET असेंबली इंटरमेडाइट लैंग्वेज फॉर्मेट में होती है, न कि नेटिव कोड। .NET असेंबली किसी भी प्लेटफॉर्म पर पोर्टेबल होती है, जब तक कि टारगेट प्लेटफॉर्म में कॉमन लैंग्वेज रनटाइम (CLR) होता है। लक्ष्य प्लेटफ़ॉर्म का सीएलआर इंटरमेडिट भाषा को देशी कोड में परिवर्तित करता है जिसे अंतर्निहित ऑपरेटिंग सिस्टम समझ सकता है। इंटरमीडिएट लिंगेज को प्रबंधित कोड भी कहा जाता है। ऐसा इसलिए है क्योंकि सीएलआर उस कोड का प्रबंधन करता है जो इसके अंदर चलता है। उदाहरण के लिए, VB6 प्रोग्राम में, डेवलपर किसी ऑब्जेक्ट द्वारा खपत की गई मेमोरी को डी-आवंटित करने के लिए जिम्मेदार होता है। यदि कोई प्रोग्रामर मेमोरी को डी-आबंटित करना भूल जाता है, तो हम मेमोरी अपवादों से बाहर निकलने में मुश्किल में पड़ सकते हैं। दूसरी ओर एक .NET प्रोग्रामर को किसी ऑब्जेक्ट द्वारा उपभोग की गई मेमोरी को डी-आवंटित करने के बारे में चिंता करने की आवश्यकता नहीं है। स्वचालित मेमोरी प्रबंधन, जिसे हड़पने के संग्रह के रूप में भी जाना जाता है, सीएलआर द्वारा प्रदान किया जाता है। इसके अलावा, कचरा संग्रहण से, CLR द्वारा प्रदान किए गए कई अन्य लाभ हैं, जिनके बारे में हम बाद के सत्र में चर्चा करेंगे। चूंकि, सीएलआर इंटरमीडिएट भाषा का प्रबंधन और निष्पादन कर रहा है, इसलिए इसे (IL) को प्रबंधित कोड भी कहा जाता है।
.NET विभिन्न प्रोग्रामिंग भाषाओं जैसे C #, VB, J #, और C ++ का समर्थन करता है। C #, VB और J # केवल प्रबंधित कोड (IL) उत्पन्न कर सकते हैं, जहां C ++ प्रबंधित कोड (IL) और संयुक्त राष्ट्र प्रबंधित कोड (Native code) दोनों उत्पन्न कर सकता है।
मूल कोड को स्थायी रूप से कहीं भी संग्रहीत नहीं किया जाता है, हम प्रोग्राम को बंद करने के बाद मूल कोड को फेंक दिया जाता है। जब हम प्रोग्राम को फिर से निष्पादित करते हैं, तो मूल कोड फिर से उत्पन्न हो जाता है।
.NET प्रोग्राम जावा प्रोग्राम एक्जीक्यूशन के समान है। जावा में हमारे पास बाइट कोड और जेवीएम (जावा वर्चुअल मशीन) हैं, जहां .NET के रूप में हम इंटरमीडिएट भाषा और सीएलआर (सामान्य भाषा रनटाइम)
यह इस लिंक से प्रदान किया गया है - वह एक महान शिक्षक है। http://csharp-video-tutorials.blogspot.in/2012/07/net-program-execution-part-1.html