2011-01-14 10 views
7

मेरे सिस्टम: शारीरिक स्मृति: 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 की तुलना में विंडोज एक्सपी पर अधिक असफल हो सकती है।

+0

एकमात्र निष्कर्ष मैं आ सकता हूं, 2 जीबी पेज फ़ाइलों के 2 जीबी को पकड़ने की तालिका सिस्टम मेमोरी को संभालने के लिए बहुत बड़ी है, इसलिए यह विफल हो जाती है। – Chad

+0

यह एक रहस्य है। कोई फर्क नहीं पड़ता कि आपकी वर्चुअल और भौतिक मेमोरी कितनी बड़ी है, इससे कोई फर्क नहीं पड़ता कि आप कितनी प्रक्रियाएं चल रहे हैं, आप 32-बिट विंडोज़ पर ~ 300 एमबी से बड़ी मेम मैप की गई फाइल नहीं बना सकते हैं। –

उत्तर

5

समस्या एक कारक के भीतर फ़ाइल विखंडन है। भौतिक स्मृति (रैम) के पास कुछ भी करने के लिए कुछ भी नहीं है। वर्चुअल मेमोरी सिस्टम में, 'मेमोरी' फाइल सिस्टम से आवंटित की जाती है। भौतिक स्मृति स्मृति की पहुंच को गति देने के लिए सिर्फ एक अनुकूलन है।

जब आप लिखने के उपयोग के साथ मेमोरी-मैप की गई फ़ाइल का अनुरोध करते हैं, तो सिस्टम में नि: शुल्क पृष्ठों के साथ एक फ़ाइल होना चाहिए। सिस्टम स्वैप फ़ाइल अक्सर खंडित होती है। यदि आपकी डिस्क ड्राइव अच्छी तरह से डीफ्रैग्मेंटेड है, तो आपको अपनी पसंद की फ़ाइल (सिस्टम पेज फ़ाइल नहीं) का उपयोग करके बड़ी मेमोरी-मैप की गई फ़ाइल बनाने में सक्षम होना चाहिए।

तो यदि आपके पास वास्तव में 2 जीबी मेमोरी-मैप की गई फ़ाइल है, तो आपको इंस्टॉलेशन पर ड्राइव पर एक बनाना होगा। यह स्थापना के लिए एक संगत 2 जीबी फ़ाइल बनाने की समस्या को बदल देता है, लेकिन एक बार बनाया गया है, तो आपको ठीक होना चाहिए।

+0

सिस्टम पेज फ़ाइल को डिफ्रैगिंग करने से आपको पता चलता है कि यह – Chad

+0

सफलतापूर्वक मैपिंग कैसे बनाया गया: 22,743mb – Chad

+0

प्रश्न टर्गीवर। भारी आईओ लोड या ऑपरेटिंग सिस्टम के सामान्य उपयोग के तहत मेरे आवंटन 20 जीबी से नीचे केवल 6 जीबी तक और कभी-कभी 300 एमबी तक नीचे जा सकते हैं। मेरी धारणा है कि विंडोज वर्चुअल मेमोरी मैनेजर ने पृष्ठों को सिस्टम पेज फ़ाइल में रखा है, जो लगातार जारी पृष्ठों को खोजने के लिए क्षमता को तोड़ देता है। हालांकि भारी आईओ प्रोग्राम चलाने के 30 मिनट बाद इंतजार कर रहे हैं, फिर भी मैं 20 जीबी को फिर से आवंटित कर सकता हूं। कोई विचार क्या हो रहा है? मुझे लगता है कि विंडोज़ उन पृष्ठों को उतारने में समय लगता है। – Chad

0

चलिए विंडोज डेवलपर स्थिति लेते हैं। मान लें कि कुछ उपयोगकर्ता निम्नलिखित चरणों का पालन करते हैं:

  1. मेमोरी मैपिंग बनाएं।
  2. फ़ाइल
  3. से संवेदनशील डेटा
  4. unmap साथ कुछ स्मृति आबाद स्मृति का उपयोग
  5. विंडोज महत्वपूर्ण कार्यों के लिए इन पृष्ठों अनलोड करने के लिए की जरूरत है जारी रखें।

संकल्प - मैप किए गए मेमोरी को स्वैपिंग के लिए काम करना चाहिए। लेकिन इसका मतलब यह नहीं है कि मैप किया जाएगा।

3

तो मेरा सवाल यह है कि यहां क्या हो रहा है? वर्चुअल मेमोरी मैनेजर के साथ आंतरिक रूप से होने वाली कुछ प्रकार की मेमोरी फ्रेजेशनेशन होनी चाहिए, क्योंकि 100 एमबीएस मेमोरी मैप की गई फाइलों को आवंटित करने से सिस्टम पेज फ़ाइल (प्रतिबद्धता सीमा) के 30 जीबी तक का उपभोग होगा।

सही के बारे में लगता है। यदि आपको स्मृति के बड़े संगत भाग की आवश्यकता नहीं है, तो उनसे पूछें कि क्या आप छोटे टुकड़ों में समान मात्रा में स्मृति प्राप्त कर सकते हैं।

सबसे बड़ा संभव स्मृति मानचित्र आकार खोजने के लिए मैं अपनी मशीन पर आवंटित कर सकता हूं।

  • आकार एक्स के साथ यह प्रयास करें
  • अगर यह काम नहीं, एक्स/2 आकार और दोहराने के साथ प्रयास करें।

यह आपको कार्यावधि में एक हिस्सा है, शायद नहीं सटीक सबसे बड़ा संभव हिस्सा हो जाता है, लेकिन 2.

+0

मेरा पहला विचार वर्चुअल एड्रेस स्पेस विखंडन था। हालांकि इसे यहां कोई भूमिका नहीं निभानी चाहिए, क्योंकि अभी तक कोई वर्चुअल एड्रेस शामिल नहीं है - केवल एक बार जब आप दृश्य को मानचित्रित करते हैं तो उन्हें असाइन किया जाता है। यह अन्य विखंडन क्या हो सकता है? – Suma

+0

हां यह करने का एक वैध तरीका है, लेकिन मैं अधिक उत्सुक हूं कि यह क्यों देख रहा है कि यह सिस्टम पेज फ़ाइल में आरक्षित होगा जिससे कॉल विफल हो रहा है? यह सिस्टम मेमोरी सद्भावना के कारण है। एकमात्र निष्कर्ष मैं आ सकता हूं, 4 जीबी पेज फ़ाइलों के 2 जीबी को पकड़ने की तालिका सिस्टम मेमोरी को संभालने के लिए बहुत बड़ी है, इसलिए यह विफल हो जाती है। – Chad

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