2010-06-10 15 views
7

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

मेरी चिंता कार्य प्रबंधक में दिखाए गए अनुसार प्रत्येक प्रक्रिया की भौतिक स्मृति पदचिह्न में है।

मुझे पता है कि फ्रेमवर्क पर्दे के पीछे स्मृति प्रबंधन करता है क्योंकि यह कुछ चीजों के लिए स्मृति के कुछ हिस्सों को समर्पित करता है जो सीधे मेरे आवेदन से संबंधित नहीं हैं।

प्रश्न।क्या .NET Framework में प्रक्रियाओं की स्मृति पदचिह्न को कम करने का कोई तरीका है, यह तब चलता है जब कई प्रक्रियाएं एक ही समय में चलती हैं? (नोबिश अनुमान) जैसा कि, System.dll पहले से ही एक प्रक्रिया द्वारा लोड किया गया है, क्या फ्रेमवर्क प्रत्येक प्रक्रिया के लिए लोड करता है, या इसमें प्रक्रियाओं के बीच इसे साझा करने का कोई तरीका है?

मैं जितना संभव हो उतना छोटा (संसाधन-वार) ऐप्स लिखने का प्रयास नहीं कर रहा हूं (यदि मैं था, तो शायद मैं पहले स्थान पर .NET Framework का उपयोग नहीं करूँगा), लेकिन अगर ऐसा कुछ है जो मैं कर सकता हूं संसाधनों का अधिक उपयोग करने के बारे में कुछ, मैं इसके बारे में जानना चाहता हूं।

उत्तर

5

जब एनजीईएन प्री-जेआईटी असेंबली के लिए उपयोग किया जाता है, तो ऐसा किया जाता है कि यदि एक ही असेंबली कई प्रक्रियाओं में लोड हो जाती है तो निष्पादन योग्य कोड उनके बीच साझा किया जा सकता है (अन्यथा प्रत्येक प्रक्रिया में दोनों की एक प्रति होना चाहिए मूल आईएल और जेआईटी संकलित कोड)।

अधिकांश (सभी?) ढांचे में आधार पुस्तकालयों के NGEN संकलित कर रहे हैं जब ढांचा इस कारण से (भी NET अनुप्रयोगों के प्रारंभिक स्टार्टअप समय को कम करने के लिए)

रीको निर्विवाद विशेषज्ञ है के लिए आंशिक रूप से स्थापित किया गया है इस पर: http://blogs.msdn.com/b/ricom/archive/2004/10/18/244242.aspx

इसके अलावा उन पृष्ठों की कई प्रक्रियाओं भर में साझा किया जा सकता है ताकि हम ngen'd छवियों में साझा किए जाने योग्य कोड डाल प्रोत्साहित करना चाहते - jitted कोड साझा नहीं किया जा सकता है।

1

विंडोज ऑपरेटिंग सिस्टम में कई प्रक्रियाओं की स्मृति पदचिह्न को कम करने का एक तरीका है। इसे पेजिंग के रूप में जाना जाता है।

+0

मुझे वह शब्द याद नहीं आया। धन्यवाद! –

0

मुझे इस तरह कुछ करने के लिए नेट फ्रेमवर्क की उम्मीद नहीं है, और मुझे यह वैसे पसंद है। कारण यह है कि मैं प्रत्येक प्रक्रिया के लिए राज्य प्रबंधन करने के लिए नेट फ्रेमवर्क पर भरोसा नहीं करता। मेरा मतलब है, अगर एक डीएलएल दो प्रक्रियाओं द्वारा साझा किया जाता है, तो संदर्भ और राज्य प्रत्येक मामले के लिए अलग हो सकता है, और हमें अलग-अलग उदाहरणों की आवश्यकता हो सकती है।

उदाहरण के लिए, winword.exe लेते हैं - यदि दो प्रक्रियाओं ने दो अलग-अलग दस्तावेज़ खोले हैं, तो स्मृति में चलने वाले विन्डोज़ के दो उदाहरण होंगे। मैं नहीं चाहता कि नेट एफ/डब्ल्यू उसमें दखल दे, खासकर जब यह COM दुनिया की बात आती है।

हालांकि, मैं इसे डीएलएल में इतनी बुद्धिमान होने के लिए छोड़ दूंगा, एक सिंगलटन के रूप में व्यवहार करता हूं यदि आप कई उदाहरणों को एक साथ चलाना नहीं चाहते हैं।

1

सीएलआर और जेआईटी कंपाइलर नियमित विंडोज डीएलएल हैं। कोड का केवल एक उदाहरण आभासी स्मृति में लोड किया गया है, इसके पृष्ठ किसी भी .NET प्रक्रिया द्वारा साझा किए जाते हैं। उनका डेटा प्रत्येक प्रक्रिया के लिए निजी है। .NET ढांचे में किसी भी असेंबली के लिए भी यही सच है, जब वे मशीन पर .NET स्थापित किए गए थे तो वे ngen-ed थे। यह शायद आपके कोड के लिए सच नहीं है, जेआईटी संकलित कोड तेज नहीं है।शायद ही कभी एक बिंदु है क्योंकि आप अक्सर एक ही कार्यक्रम को एक से अधिक बार नहीं चलाते हैं।

जैसे ही .NET स्वचालित रूप से स्मृति का प्रबंधन करता है, तो विंडोज भी करता है। बस एकमात्र चीज जो आप कर सकते हैं, प्रक्रिया को सेट करके अक्सर आपके प्रोग्राम को डिस्क पर बदलना पड़ता है। मैक्सवर्क्सिंगसेट। यह बुद्धिमान नहीं है। आपके ऐप की मुख्य विंडो को कम करने से यह भी हो जाता है।

अंगूठे के नियम के रूप में, आप अपने कार्यक्रम में उचित निर्णय नहीं ले सकते हैं और सही ढंग से अनुमान लगा सकते हैं कि कामकाजी सेट को ट्रिम करना बुद्धिमान है या नहीं। आप नहीं जानते कि अन्य प्रक्रियाएं क्या चल रही हैं और उन्हें कितनी रैम चाहिए। विंडोज करता है

संबंधित मुद्दे