2011-01-16 10 views
5

मेरा छोटा तनाव परीक्षण, जो एक लूप में यादृच्छिक लंबाई सरणी (100..200 एमबी प्रत्येक) आवंटित करता है, 64 बिट Win7 मशीन पर और 32 बिट एक्सपी (वीएम में) पर अलग व्यवहार दिखाता है। दोनों प्रणालियां आम तौर पर एलओएच में फिट होने के रूप में अधिकतर सरणी आवंटित करती हैं। फिर जब तक आभासी पता स्थान भर नहीं जाता है तब तक LOH बड़ा और बड़ा हो जाता है। अब तक अपेक्षित व्यवहार। लेकिन आगे के अनुरोधों के मुकाबले - दोनों अलग-अलग व्यवहार करते हैं:.NET प्रबंधित ढेर कब और कैसे बदल रहा है?

Win7 पर एक आउटऑफमेमरी एक्सेप्शन (ओओएम) फेंक दिया जाता है, एक्सपी पर ऐसा लगता है कि ढेर बढ़ जाता है और डिस्क पर भी बदल जाता है - कम से कम कोई ओओएम फेंक दिया नहीं जाता है। (पता नहीं, अगर इसे वर्चुअल बॉक्स में चल रहे XP के साथ करना पड़ सकता है।)

प्रश्न: रनटाइम (या ओएस?) कैसे तय करता है, प्रबंधित स्मृति आवंटन अनुरोधों के लिए, चाहे यह बहुत बड़ा हो आवंटित करने के लिए, ओओएम उत्पन्न होता है या बड़े ऑब्जेक्ट ढेर में वृद्धि हो रही है - अंततः डिस्क पर भी बदल दिया जाता है? यदि यह स्वैप किया गया है, तो ओओएम कब से होता है?

आईएमओ यह प्रश्न सभी उत्पादन वातावरण के लिए महत्वपूर्ण है, संभावित रूप से बड़े डेटासेट से निपटना। किसी भी तरह से यह जानने के लिए और अधिक "सुरक्षित" लगता है, सिस्टम ओओएम फेंकने की तुलना में ऐसी परिस्थितियों में (स्वैप करके) नाटकीय रूप से धीमा हो जाएगा। कम से कम, यह किसी भी तरह निर्धारक रूप से होना चाहिए, है ना?

@Edit: अनुप्रयोग एक 32 बिट आवेदन,

+0

"भौतिक पता स्थान तक" क्या आपका मतलब उस प्रक्रिया का आभासी पता स्थान नहीं है? – CodesInChaos

+0

और क्या आपका प्रोग्राम किसी भी सीसीपीयू या 32 बिट पर सेट है? 64 बिट प्रोग्राम में यादों में से आसानी से नहीं होना चाहिए। मैं उम्मीद करता हूं कि कंप्यूटर इससे पहले लंबे समय तक स्वैपिंग के कारण रुक जाए। – CodesInChaos

+0

आप सही हैं: "वर्चुअल एड्रेस स्पेस" का मतलब था। और हां, प्रॉग 32 बिट एप्लिकेशन के लिए संकलित करता है, Win7 पर WOW चला रहा है। – user492238

उत्तर

8

सामान्य नियम लागू होते हैं, एक प्रबंधित प्रक्रिया विंडोज स्मृति प्रबंधक द्वारा अलग तरह से व्यवहार नहीं कर रहा है विन 7 पर 32 बिट मोड में इसलिए चल रहा है। स्मृति के भाग के लिए अंतिम स्रोत विंडोज मेमोरी मैनेजर है। यदि यह अनुरोधित स्मृति आवंटन को फिट करने के लिए वर्चुअल मेमोरी एड्रेस स्पेस में छेद नहीं पा रहा है तो यह वर्चुअलअलोक() कॉल में विफल रहता है और सीएलआर ओओएम उत्पन्न करता है।

स्वैपिंग व्यवहार के लिए वही है, यदि रैम में पृष्ठों को अन्य प्रक्रियाओं के पृष्ठों या यहां तक ​​कि उसी प्रक्रिया के पृष्ठों को मैप करने के लिए आवश्यक है तो वे स्वैप हो जाएंगे। यह अन्यथा ओओएम से जुड़ा नहीं है।

आप यह नहीं मान सकते कि यह XP पर ठीक उसी तरह काम करेगा जैसा यह Win7 x64 पर करता है। जब आप अपना प्रोग्राम लक्ष्यीकरण करते हैं तो x64 पर ओओएम प्राप्त करना कोई भी असामान्य है, 64-बिट ऑपरेटिंग सिस्टम में बहुत बड़ी वर्चुअल मेमोरी एड्रेस स्पेस है। ऊपरी सीमा पेजिंग फ़ाइल के अधिकतम आकार द्वारा निर्धारित की जाती है। एक 32-बिट प्रोग्राम WOW इम्यूलेशन परत में चलाया जाएगा, यदि आप Editbin.exe के साथ LARGEADDRESSAWARE विकल्प बिट सेट करते हैं तो इसमें 4 जीबी पता स्थान हो सकता है।

आप यह देखने के लिए SysInteral की VMMap उपयोगिता का उपयोग कर सकते हैं कि आपकी प्रक्रिया का पता स्थान कैसा बना हुआ है।

+1

"अगर यह वर्चुअल मेमोरी एड्रेस स्पेस में अनुरोधित स्मृति आवंटन को फिट करने के लिए कोई छेद नहीं मिल पाता है तो यह हेपअलोक() कॉल में विफल रहता है और सीएलआर ओओएम उत्पन्न करता है।" - लेकिन क्यों हैक यह पेजिंग से नहीं है? कम से कम यह होना चाहिए, अगर वर्चुअल स्पेस अभी तक पूरी तरह से उपयोग नहीं किया गया है, लेकिन कोई अन्य रैम नहीं मिल सका? – user492238

+1

दो * बहुत * अलग-अलग चीजें। पेजिंग तब होती है जब * भौतिक * मेमोरी स्पेस की आवश्यकता होती है। राम। मेमोरी आवंटन * वर्चुअल * मेमोरी में होता है। 32-बिट प्रक्रिया में 2 गिगाबाइट हैं, इससे कोई फर्क नहीं पड़ता कि रैम कितना स्थापित है। सभी प्रक्रियाओं द्वारा आवंटित सभी वर्चुअल मेमोरी का योग केवल पेजिंग फ़ाइल द्वारा सीमित है, रैम नहीं। –

+1

तो 2 जीबी (64 बिट पर कुछ टीबी) केवल सैद्धांतिक सीमाएं हैं?मेमोरी मैनेजर पृष्ठफाइल * भाग * के आकार तक स्वैप करता है जो प्रक्रिया के लिए आरक्षित है? और यदि वह भाग भी राम में फिट बैठता है, तो यह बिल्कुल भी स्वैप नहीं करता है? यह – user492238

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