2010-05-06 16 views
27

विंडोज में वर्चुअलअलोक है, जो आपको पता स्थान के एक संगत क्षेत्र को आरक्षित करने की अनुमति देता है, लेकिन वास्तव में किसी भौतिक स्मृति का उपयोग नहीं करता है। बाद में जब आप इसका उपयोग करना चाहते हैं (या इसका हिस्सा) तो आप पहले आरक्षित पृष्ठों के क्षेत्र को प्रतिबद्ध करने के लिए वर्चुअलअलोक को फिर से कॉल करते हैं।रिजर्व करने के लिए कोई तरीका है लेकिन लिनक्स में स्मृति नहीं है?

यह वास्तव में वास्तव में उपयोगी है, लेकिन अंत में मैं अपने आवेदन को लिनक्स पर बंद करना चाहता हूं - इसलिए यदि मैं इसे बाद में बंद नहीं कर सकता तो मैं इसका उपयोग नहीं करना चाहता हूं। क्या लिनक्स के पास ऐसा करने का कोई तरीका है?

संपादित करें - प्रयोग करें प्रकरण

मैं या 4 जीबी आवंटन की सोच रहा हूँ वर्चुअल ऐड्रेस स्पेस में से कुछ इस तरह है, लेकिन केवल यह एक समय में 64K करने से। यह मुझे 4 जीबी तक सरणी बढ़ाने के लिए शून्य-प्रतिलिपि तरीका देगा। जो महत्वपूर्ण है, क्योंकि सामान्य डबल सरणी आकार और प्रतिलिपि बहुत बड़े सरणी के लिए प्रतीत होता है यादृच्छिक अस्वीकार्य विलंबता प्रस्तुत करता है।

+0

आपके लिए क्या उपयोग केस है? पूछने के बीच अंतर को अलग करना क्यों महत्वपूर्ण है कि आप आवंटित कर सकते हैं या नहीं अंतरिक्ष (इसे आरक्षित करना) और वास्तव में स्मृति में अंतरिक्ष का उपयोग करना? – dlamotte

+0

ऐसा लगता है कि नियमित आवंटन ठीक काम करना चाहिए। यदि स्मृति का उपयोग नहीं किया जाता है तो इसे बाहर कर दिया जाएगा, और, जब आप इसे उपयोग करना शुरू करेंगे, तो इसे वापस मेमोरी – Drakosha

+1

@xyld पर लाया जाएगा: एक वर्चुअल एड्रेस स्पेस से ब्लॉक को घटाता है, दूसरा वर्चुअल मेमोरी से इसे घटाता है (पृष्ठ की फाइल)। –

उत्तर

25

mmap एक विशेष फ़ाइल, /dev/zero की तरह है (या MAP_ANONYMOUS का उपयोग करें) PROT_NONE के रूप में, बाद में mprotect का उपयोग प्रतिबद्ध करने के लिए।

+0

हां।सी लाइब्रेरी/कर्नेल प्रभावी रूप से यह वैसे भी करता है जब आप सामान्य रूप से किसी भी आकार की स्मृति का एक हिस्सा आवंटित करते हैं। पेज आरक्षित हैं लेकिन वास्तव में मैप नहीं किए जाते हैं जब तक कि आप उन्हें स्पर्श न करें। मानचित्रण/देव/शून्य (एमएपी_PRIVATE के साथ) सिर्फ एक विशेष प्रकार का मॉलोक है। – MarkR

+1

@MarkR: यह vm overcommit sysctl की कुछ सेटिंग्स के लिए, लिनक्स के लिए सच है। '/ Dev/zero' दृष्टिकोण का mmap किसी भी POSIX ओएस पर काम करना चाहिए जिसमें लिनक्स सहित वीएम ओवरकॉमिट अक्षम है। वीएम ओवरकॉमिट प्रलेखन को पढ़ना, '/ dev/zero' का संयोजन और कोई लेखन पहुंच नहीं है जिससे ब्लॉक प्रतिबद्धता सीमा के खिलाफ गिनती नहीं कर पाता है। –

5

आप इस कार्यक्षमता को कर्नेल ओवरकमिट का उपयोग करके सिस्टम-व्यापी पर बदल सकते हैं। यह आमतौर पर कई वितरणों पर डिफ़ॉल्ट सेटिंग होती है।

यहाँ स्पष्टीकरण http://www.mjmwired.net/kernel/Documentation/vm/overcommit-accounting

+0

ओह यह अच्छा है ... इसे केवल एक ही प्रक्रिया के लिए चालू नहीं कर सकता है, हालांकि? – dlamotte

+0

@dlamotte: यह आमतौर पर डेस्कटॉप सिस्टम पर डिफ़ॉल्ट रूप से चालू होता है। रीयल-टाइम सिस्टम इस तरह के व्यवहार (और सामान्य रूप से मांग-पेजिंग) पर फहराएंगे, लेकिन यह डेस्कटॉप पर फायदेमंद है और मैं उस व्यक्ति में नहीं आया हूं जो पहले से चालू नहीं हुआ है। जब तक आप स्मृति को कभी भी लिखते हैं (लगभग किसी भी माध्यम से) कर्नेल केवल इसे आरक्षित करने जा रहा है। –

4

लिनक्स समकक्ष VirtualAlloc()mmap() है, जो समान व्यवहार प्रदान करता है। हालांकि एक टिप्पणीकर्ता के मुताबिक, संगत स्मृति का आरक्षण malloc() तक कॉल का व्यवहार है जब तक कि स्मृति प्रारंभ नहीं किया जाता है (जैसे calloc(), या उपयोगकर्ता कोड)।

+0

आप सही हैं, मुझे यह जानकर आश्चर्य हुआ कि यह आपके द्वारा लिंक किए गए मॉलोक के दस्तावेज़ों में निर्दिष्ट है। – Eloff

+2

वैसे, केवल मॉलोक के साथ मैं लगभग 500 एमबी ओवरहेड के साथ 4 जीबी भाग (2^15-3 या तो) में लिनक्स x64 मशीन पर 128TB वर्चुअल एड्रेस स्पेस के शर्मीली आवंटित करने में सक्षम था (वास्तव में बहुत कम प्रत्येक 4 केबी पेज के लिए एक पेज टेबल एंट्री भी है, लेकिन प्रत्येक 2 एमबी पेज के लिए 8 बाइट एंट्री के लिए सही है (कर्नेल में पारदर्शी विशाल पेज समर्थन?) – Eloff

1

"बहुत बड़े सरणियों

तुम भी mlock विचार कर सकते हैं() या mmap() + MAP_LOCKED पेजिंग के प्रभाव को कम करने के लिए के लिए मालूम होता है यादृच्छिक अस्वीकार्य विलंबता । कई CPUs विशाल (उर्फ बड़े) का समर्थन पेज, 4kb से बड़े पृष्ठ। ये बड़े पृष्ठ स्ट्रीमिंग/लिखने पर टीएलबी के प्रभाव को कम कर सकते हैं।

+1

समस्या अभी भी प्रतिलिपि है, यहां तक ​​कि पेजिंग के बिना भी धीमी है एक 4 जीबी एक बनाने के लिए 2 जीबी सरणी की प्रतिलिपि बनाने के लिए। यदि आप स्मृति को स्थानांतरित करने से बच सकते हैं तो आपके पास 2 अरबवां और 1 तत्व जोड़ने पर उस विलंबता को हिट नहीं किया जाएगा। – Eloff

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

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