2012-01-15 12 views
20

malloc का उपयोग करने से mmap (MAP_PRIVATE और MAP_ANONYMOUS के साथ) का उपयोग कर स्मृति आवंटित करने के नुकसान क्या हैं? समारोह दायरे में डेटा के लिए, मैं ढेर स्मृति वैसे भी और इसलिए का प्रयोग करेंगे नहीं malloc.क्या होगा यदि मैं malloc के बजाय mmap का उपयोग कर स्मृति आवंटित करता हूं?

एक नुकसान यह है कि मन में आता है इस तरह के पेड़ और जुड़ा हुआ सूची के रूप में गतिशील डेटा संरचनाओं, जहाँ आप अक्सर आवंटित और डेटा के छोटे-छोटे टुकड़ों पुनःआवंटन करने की आवश्यकता के लिए है । mmap का उपयोग करना दो कारणों से महंगा होगा, एक 4096 बाइट्स की ग्रैन्युलरिटी आवंटित करने के लिए और दूसरा सिस्टम कॉल करने की आवश्यकता के लिए।

लेकिन अन्य परिदृश्यों में, आपको लगता है कि mallocmmap से बेहतर है? दूसरा, क्या मैं गतिशील डेटा संरचनाओं के लिए mmap के नुकसान का अधिक महत्व दे रहा हूं?

mmapmalloc मैं के बारे में सोच सकते हैं के ऊपर का एक लाभ यह है कि स्मृति तुरंत, ओएस के लिए वापस आ जाता है जब आप munmap करते हैं, जबकि malloc/free के साथ, मैं डेटा खंड को तोड़ने बिंदु है कभी नहीं लौटे uptil स्मृति लगता है, लेकिन reusage के लिए रखा है ।

+9

malloc आपके लिए mmap कॉल करेगा, यदि आवश्यक हो ... बस मॉलोक से चिपके रहें। – Macmade

+2

एक और नुकसान यह है कि यदि आप अपने कोड को 'mmap' पर कॉल के साथ कूड़े हैं, तो यह कम पोर्टेबल बन जाता है। –

+3

और जीवन को और जटिल होने की आवश्यकता क्यों है? –

उत्तर

26

हां, mallocmmap से बेहतर है। इसका उपयोग करना बहुत आसान है, अधिक सुगंधित और अधिक पोर्टेबल। अंत में, यह वैसे भी mmap पर कॉल करेगा।

यदि आप mmap के साथ रोजमर्रा की मेमोरी प्रबंधन करना शुरू करते हैं, तो आप पेजों की तुलना में छोटे हिस्सों में इसे पार्सल करने का कुछ तरीका लागू करना चाहते हैं और आप शायद उपरोक्त तरीके से malloc को फिर से कार्यान्वित कर देंगे।

+1

ग्रेट गहन उत्तर के बाद से यह उल्लेख करता है कि 'मॉलोक' कॉल 'mmap'। –

17

सबसे पहले, mmap() एक मंच विशिष्ट निर्माण है, इसलिए यदि आप पोर्टेबल सी लिखने की योजना बना रहे हैं, तो यह पहले से ही बाहर है।

दूसरा, malloc() अनिवार्य रूप से mmap() के मामले में लागू किया जाता है, लेकिन यह सिस्टम कॉल के आसपास बुद्धिमान पुस्तकालय आवरण का एक प्रकार है: जब जरूरत यह प्रणाली से नई स्मृति का अनुरोध करेंगे, लेकिन तब तक उस में स्मृति का एक टुकड़ा ले जाएगा एक ऐसा क्षेत्र जो पहले से ही प्रक्रिया के लिए प्रतिबद्ध है।

इसलिए, यदि आप सामान्य गतिशील स्मृति आवंटन करना चाहते हैं, तो malloc() का उपयोग करें, कहानी का अंत। स्मृति आवंटन के लिए mmap() का उपयोग विशेष परिस्थितियों के लिए आरक्षित होना चाहिए (उदाहरण के लिए यदि आप वास्तव में पृष्ठ सीमा पर गठबंधन करते हैं, तो पृष्ठ के सीमा पर गठबंधन करते हैं), और हमेशा लाइब्रेरी कोड के एक टुकड़े में सारणित होते हैं ताकि अन्य आसानी से समझ सकें कि आप ' कर रहा हूँ

+1

भले ही आप अपने लिए एक संपूर्ण पृष्ठ चाहते हैं, तो शायद 'posix_memalign' का उपयोग करना बेहतर होगा, यह आवंटित करने के लिए तेज़ होगा, तेज़ी से मुक्त होगा और कर्नेल को किसी अन्य वीएमए को ट्रैक करने की परेशानी से मुक्त कर देगा। वास्तव में 'mmap' का उपयोग करने का एकमात्र कारण यह है कि यदि आप फ़ाइल डिस्क्रिप्टर को स्मृति (सबसे आम उपयोग) में मैप करना चाहते हैं या मेमोरी आवंटक को कार्यान्वित कर रहे हैं (और फिर भी' sbrk' को प्राथमिकता देने के अच्छे कारण हैं)। – jleahy

3

एक विशेषता mmap, कि malloc नहीं है, mmap आप विशाल पृष्ठों का उपयोग करके आवंटित करने के लिए (झंडा तर्क MAP_HUGETLB सेट है) की अनुमति देता है, जबकि malloc कि विकल्प नहीं है।

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