मेरे सिस्टम: शारीरिक स्मृति: 3 GB
Windows XP सर्विस पैक 3 (32 बिट) स्वैप फ़ाइल का आकार: 30GB
सबसे बड़ा मेमोरी मानचित्र आवंटन आकार?
लक्ष्य: सबसे बड़ा संभव स्मृति नक्शे का आकार मैं अपने मशीन पर आवंटित कर सकते हैं खोजने के लिए।
जब मैं 2 जीबी मेमोरी मैप फ़ाइल आवंटित करने के लिए निम्न कोड चलाता हूं, तो कॉल विफल हो जाती है।
हैंडल = CreateFileMapping (INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE | SEC_COMMIT, 0, INT_MAX, NULL);
मैं इस से बहुत परेशान हूं, क्योंकि मैं एक समय में 100 एमबी के साथ CreateFileMapping को लगातार कॉल करके 30 जीबी के सिस्टम स्वैप फ़ाइल आकार को मेमोरी मैप फ़ाइल आवंटित कर सकता हूं।
मशीन को पुनरारंभ करने के बाद, और उस अनुप्रयोग को दोबारा चलाने के लिए जो 2 जीबी मेमोरी मैप किए गए फ़ाइल को CreateFileMapping बनाने के लिए अनुरोध करता है यह काम करता है और यह एक मान्य हैंडल देता है। तो यह मुझे थोड़ा उलझन में ले जाता है कि खिड़कियों के साथ हुड के नीचे क्या चल रहा है?
तो स्थिति यह है कि, मैं सभी सिस्टम पेज फ़ाइल (30 जीबी) का उपयोग करके कई छोटी मेमोरी मैप की गई फाइलें बना सकता हूं, लेकिन 2 जीबी के एकल आवंटन के लिए पूछने पर कॉल विफल हो जाती है। मशीन को पुनरारंभ करते समय और उसी एप्लिकेशन को चलाने पर कॉल सफल होता है!
कुछ नोट्स:
1) स्मृति मैप की गई फ़ाइल को प्रोसेस वर्चुअल एड्रेस स्पेस में लोड नहीं किया जा रहा है, फ़ाइल में अभी तक कोई दृश्य नहीं है।
2) ओएस सिस्टम 100 पेज के 30 जीबी तक छोटी 100 एमबी मेमोरी मैप की गई फाइलों को आवंटित कर सकता है!
अभी केवल निष्कर्ष मैं करने के लिए आ सकता है, कि Windows XP SP3 (32 बिट) आभासी स्मृति प्रबंधक सफलतापूर्वक प्रणाली पृष्ठ फ़ाइल में अनुरोध 2GB आरक्षित नहीं कर सकते है, और उसके बाद सिस्टम स्मृति विखंडन के कारण विफल हो जाता है (यह ऐसा लगता है कि इसे स्मृति की निरंतर आवंटन आरक्षित करने की आवश्यकता है, भले ही पृष्ठ फ़ाइल प्रत्येक 4kb है)। पुनरारंभ करने के बाद मुझे लगता है कि सिस्टम मेमोरी विखंडन कम है, इस प्रकार एक ही कॉल को सफल होने की अनुमति देता है और आकार में 2 जीबी की मेमोरी मैप की गई फाइल आवंटित करता है।
मैंने कुछ प्रयोग चलाए हैं, एक दिन के लिए मशीन चलाने के बाद मैंने एक छोटा एप्लीकेशन शुरू किया जो 300 एमबी की मेमोरी मैप की गई फाइल आवंटित करेगा और फिर इसे रिलीज़ करेगा। इसके बाद आकार 1 एमबी तक बढ़ जाएगा और फिर कोशिश करें। अंत में यह 700 एमबी और रिपोर्ट (अपर्याप्त सिस्टम संसाधन) पर बंद हो जाता है। मैं फिर प्रत्येक एप्लिकेशन को बंद कर दूंगा और इससे बदले में त्रुटि संदेश बंद हो जाएंगे और अंत में यह 3.5 जीबी आकार की मेमोरी मैप की गई फाइल आवंटित करेगा!
तो मेरा सवाल यह है कि यहां क्या हो रहा है? वर्चुअल मेमोरी मैनेजर के साथ आंतरिक रूप से होने वाली कुछ प्रकार की मेमोरी विखंडन होनी चाहिए, क्योंकि 100 एमबीएस मेमोरी मैप की गई फाइलों को आवंटित करने से सिस्टम पेज फ़ाइल (प्रतिबद्धता सीमा) के 30 जीबी तक का उपभोग होगा।
अद्यतन
निष्कर्ष है आप एक बड़े स्मृति मैप किए गए INVALID_HANDLE_VALUE साथ प्रणाली पृष्ठ फ़ाइल द्वारा समर्थित फ़ाइल बनाने के लिए जा रहे हैं, तो सिस्टम पृष्ठ फ़ाइल (स्वैप फ़ाइल) आवश्यक आकार के लिए आकार बदलने की जरूरत है और बड़े आवंटन> 2 जीबी के लिए एक गैर खंडित राज्य में रहें! हालांकि भारी आईओ लोड के तहत यह अभी भी असफल हो सकता है। इन सभी समस्याओं को हल करने के लिए आप अपनी फ़ाइल को आवश्यक आकार (मैंने 1tb किया था) और मेमोरी मैप के बजाय उस फ़ाइल में बना सकते हैं।
अंतिम अद्यतन
मैं एक विंडोज 7 बॉक्स पर एक ही परीक्षण भाग गया, और मेरे आश्चर्य करने के लिए इसे हर बार (सिस्टम पेज फ़ाइल आकार तक) कुछ भी छू बिना काम करता है। तो मुझे लगता है कि यह सिर्फ एक बग है, कि बड़ी मेमोरी आवंटन विंडोज 7 की तुलना में विंडोज एक्सपी पर अधिक असफल हो सकती है।
एकमात्र निष्कर्ष मैं आ सकता हूं, 2 जीबी पेज फ़ाइलों के 2 जीबी को पकड़ने की तालिका सिस्टम मेमोरी को संभालने के लिए बहुत बड़ी है, इसलिए यह विफल हो जाती है। – Chad
यह एक रहस्य है। कोई फर्क नहीं पड़ता कि आपकी वर्चुअल और भौतिक मेमोरी कितनी बड़ी है, इससे कोई फर्क नहीं पड़ता कि आप कितनी प्रक्रियाएं चल रहे हैं, आप 32-बिट विंडोज़ पर ~ 300 एमबी से बड़ी मेम मैप की गई फाइल नहीं बना सकते हैं। –