मैं आवेदन डोमेन नहीं समझता


80

.NET के पास एप्लिकेशन डोमेन की यह अवधारणा है जो मुझे समझ में आता है कि इसका उपयोग मेमोरी में असेंबली लोड करने के लिए किया जा सकता है। मैंने एप्लिकेशन डोमेन पर कुछ शोध किया है और साथ ही इस विषय पर कुछ अतिरिक्त ज्ञान के लिए अपने स्थानीय पुस्तक स्टोर पर भी जा सकता हूं लेकिन यह बहुत ही डरावना लगता है।

सभी मुझे पता है कि मैं आवेदन डोमेन के साथ कर सकता हूं स्मृति में विधानसभाओं को लोड करना है और जब मैं चाहता हूं तो मैं उन्हें अनलोड कर सकता हूं।

मेरे द्वारा अनुप्रयोग डोमेन के बारे में बताई गई अन्य क्षमताएं क्या हैं? क्या थ्रेड्स सम्मान अनुप्रयोग डोमेन सीमाएँ हैं? क्या संचार के प्रदर्शन से परे मुख्य एप्लिकेशन डोमेन के अलावा अन्य एप्लिकेशन डोमेन में असेंबलियों को लोड करने से कोई कमियां हैं?

अनुप्रयोग डोमेन पर चर्चा करने वाले संसाधनों के लिंक अच्छे भी होंगे। मैंने पहले ही MSDN की जाँच कर ली है जिसमें उनके बारे में अधिक जानकारी नहीं है।

जवाबों:


100

AppDomains सबसे अच्छा एक बहुत हल्के वजन प्रक्रिया के रूप में कल्पना की।

वहाँ। नेट प्रक्रिया प्रति एन AppDomains हो सकता है लेकिन आम तौर पर बोल वहाँ केवल एक है। AppDomains का वास्तविक लाभ यह है कि वे आपकी प्रक्रिया के भीतर एक अलगाव सीमा प्रदान करते हैं। ऑब्जेक्ट्स केवल एक दूसरे से AppDomain सीमा में रीमोटिंग या सीरियललाइज़ेशन के माध्यम से बात कर सकते हैं।

एक प्रक्रिया के भीतर पूरी तरह से अलग-अलग सुरक्षा स्तरों पर 2 AppDomains को चलाना भी संभव है। इससे आप अपने मुख्य एप्लिकेशन को फुल ट्रस्ट में चला सकते हैं, जबकि बहुत कम ट्रस्ट स्तर पर अनट्रेस्ड प्लगइन्स चला सकते हैं।

कंबल को हां या ना कहना मुश्किल है, चाहे कोई अप्पडोमैन का सम्मान करता हो या नहीं। एकल धागे के लिए एन अलग-अलग AppDomains में होना संभव है। ऐसी स्थिति संभव है यदि एक AppDomain में कोई ऑब्जेक्ट किसी अन्य AppDomain में किसी ऑब्जेक्ट को दूरस्थ कॉल करता है। पूरा करने के लिए थ्रेड को AppDomains के बीच संक्रमण करना होगा।

AppDomains का नुकसान मुख्य रूप से जटिलता है। अपने सिर को इधर-उधर करने के लिए रिमोटिंग में थोड़ा समय लग सकता है और ठीक से AppDomain की स्थापना एक गैर तुच्छ प्रक्रिया हो सकती है।

आप AppDomains पर MSDN प्रलेखन के माध्यम से एक नज़र रखना चाहते हैं। एक सक्स् टर ट्यूटोरियल ढूंढना कठिन है जो उनका वर्णन करता है क्योंकि उनके पास विभिन्न प्रकार की जटिल विशेषताएं हैं। यह एक अच्छा अवलोकन प्रदान करता है जो यदि आपके प्रश्न का सीधे उत्तर नहीं देता है तो कम से कम आपको सही जगह पर इंगित करेगा।

http://msdn.microsoft.com/en-us/library/cxk374d9.aspx

यह दस्तावेज़ अब बनाए नहीं रखा गया है कृपया इसे अद्यतन संस्करण के लिए देखें: https://msdn.microsoft.com/en-us/library/2bh4z9hs(v=vs.110).aspx


4
मुख्य चिंता यह है कि मैं उन क्षमताओं को समझ नहीं पा रहा हूं, जिनका उपयोग करके मुझे मिल रहा है। मैंने पढ़ा कि वे एक हल्की प्रक्रिया हैं, लेकिन उन्हें लगता है कि कैरी सिर्फ इतना है और मुझे कुछ याद आ रहा है जो मुझे बाद में काट सकता है। IE मैं जरूरत से ज्यादा निकाल रहा हूं।
जेरेमी एडवर्ड्स

92

JaredPar का जवाब अच्छा है, सिवाय इसके कि वह AppDomains के लिए raison d'etre को नोट नहीं करता है - जो कि आप केवल उसके AppDomain को अनलोड करके एक असेंबली UNLOAD कर सकते हैं। यदि आप एक लंबे समय से चलने वाली ओएस प्रक्रिया हैं, और आपको लोड करने की उम्मीद है और फिर बाद में जो भी कारण के लिए असेंबलियों को अनलोड करना है, तो आपको एक AppDomain की आवश्यकता है। यहां प्रोटोटाइपिक उदाहरण ASP.NET है, जो मांग पर ऐप कोड असेंबलियों को लोड करता है और फिर बाद में उन्हें अनलोड कर सकता है, जब ऐप अब सक्रिय रूप से उपयोग नहीं किए जा रहे हैं।

आपके द्वारा अनलोड करने की क्षमता के लिए भुगतान की जाने वाली लागत स्वतंत्रता है - आपको AppDomain सीमा पर संचार करने की आवश्यकता है, आप एक सरल विधि कॉल नहीं कर सकते। आपको AppDomain जीवनचक्र का प्रबंधन करने की आवश्यकता है। आदि।

यदि आपको केवल असेंबलियों को गतिशील रूप से लोड करने की आवश्यकता है और आपको नहीं लगता है कि आपको एक एकल प्रक्रिया के जीवन के दौरान उन्हें उतारने की आवश्यकता होगी, तो आपको संभवतः कई AppDomains चलाने की आवश्यकता नहीं है। यहां एक अच्छा उदाहरण एक समृद्ध ऐप हो सकता है जो प्लग-इन मॉडल का समर्थन करता है, जहां यह "आदि" निर्देशिका में प्लग-इन असेंबलियों को सूँघता है और उन्हें सभी को लोड करता है। हालांकि, अगर प्लग-इन प्लग-इन को लोड करने के लिए मॉडल कॉल करता है ... अच्छी तरह से।

आउटलाइनर परिदृश्य हैं। जैसे, मान लीजिए कि आप एक ही समय में एक असेंबली के 2 अलग-अलग संस्करणों को लोड करना चाहते हैं। यदि आप उन्हें AppDomains से अलग नहीं करते हैं, तो आप नुकसान में भाग सकते हैं। लेकिन यह काफी दुर्लभ होगा।

AppDomains के अस्तित्व को सही ठहराने वाला मुख्य परिदृश्य एक लंबी चलने वाली प्रक्रिया है जो असेंबली को अनलोड करने में सक्षम होना चाहिए।

जब आप किसी असेंबली को अनलोड करना चाहते हैं, तो बेशक, OS प्रक्रिया पर भरोसा कर सकते हैं। दूसरे शब्दों में, आपके पास 3 या 4 सहयोगी प्रक्रियाएं चल सकती हैं, प्रत्येक असेंबली के अपने सेट के साथ, और जब आप किसी असेंबली को अनलोड करना चाहते हैं, तो उस असेंबली को होस्ट करने वाली प्रक्रिया को बंद कर दें। लेकिन AppDomain ऐसा करने के लिए एक उच्च-परिपूर्ण तंत्र प्रदान करता है, जिसके लिए प्रोसेस स्टॉप / स्टार्ट या क्रॉस-प्रोसेस कॉम्स की आवश्यकता नहीं होती है, जो कि पहले से वर्णित क्रॉस-ऐपडोमेन कॉम्स से कहीं अधिक भारी है। मेरा मतलब है कि यह अभी भी रिमोट है लेकिन यह धीमी और अधिक संदर्भ स्विचिंग है।


17
एक शब्द का उपयोग क्यों करें यदि आपको लगता है कि आपको इसे परिभाषित करना है?
ब्लूराजा - डैनी पफ्लुघोटे

44
क्योंकि कंप्यूटर विज्ञान के सवालों के जवाब में फ्रेंच शब्दों का उपयोग करना मज़ेदार है।
चेसो

13
@ BlueRaja-DannyPflughoeft और यह उन लोगों को शिक्षित करने में मदद करता है, जो आमतौर पर इस्तेमाल किए जाने वाले विदेशी शब्द से परिचित नहीं हो सकते हैं, जो पूरी तरह से एक विचार को समाहित करता है जो अंग्रेजी में बहुत अधिक अनाड़ी रूप से परिभाषित है।
सैम होल्डर

6
@SHHolder जुड़ा विकिपीडिया लेख कहता है कि अंग्रेजी अनुवाद "अस्तित्व का कारण" है। ऐसा नहीं लगता है कि बहुत ही मुझे परिभाषित किया गया है।
Bognar

5
मेरे पैसे के लिए यह सबसे अच्छा उत्तर है, क्योंकि "raison d'etre" MSDN पर कहीं भी स्पष्ट रूप से नहीं कहा गया है, जहां तक ​​मुझे मिल सकता है।
डैन लिंग

27

कुछ चीजें जो आप AppDomains के साथ कर सकते हैं:

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

सीधे शब्दों में कहें, यह एक सुरक्षा सीमा है और एक प्रक्रिया सीमा को अधिकतम करती है। जहाँ तक प्रदर्शन जाता है, एक प्रक्रिया के भीतर कई AppDomains महत्वपूर्ण ओवरहेड का प्रतिनिधित्व नहीं करते हैं। एक AppDomain के बजाय एक अलग प्रक्रिया शुरू करना कहीं अधिक महंगा है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.