2015-05-26 10 views
8

मैं लिनक्स मशीन द्वारा उपयोग किए जाने वाले गले लगाने पर स्मृति आवंटित करना चाहता हूं। मैं देखता हूं कि mmap और madvise का उपयोग करके ऐसा करने के दो तरीके हैं।विशाल पृष्ठों के लिए mmap और madvise का उपयोग

कि mmap कॉल के साथ MAP_HUGETLB ध्वज का उपयोग कर, है - madvise कॉल के साथ

base_ptr_ = mmap(NULL, memory_size_, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB, -1, 0); 

और MADV_HUGEPAGE झंडा -

madvise(base_ptr_, memory_size_, MADV_HUGEPAGE); 

कोई दोनों के बीच अंतर समझा सकते हैं?

उत्तर

9

दोनों कार्यों विभिन्न कार्यों का प्रदर्शन है, जो या अपने संदर्भ में कोई फर्क नहीं हो सकता है हो सकता है:

  • madvise सभी स्मृति क्षेत्र इसे करने के लिए पारित कर दिया करने के लिए इसी मैपिंग के लिए एक ध्वज सेट, khugepaged गिरी धागा से कहा कि यह बड़े पृष्ठों पर पदोन्नति के लिए मैपिंग्स पर विचार कर सकते हैं। यह केवल तभी काम करेगा जब पारदर्शी ह्यूजेप समर्थन सक्षम है (पारदर्शी ह्यूजेपेज समर्थन की स्थिति /sys/kernel/mm/transparent_hugepage/enabled के तहत उपलब्ध है), जो अधिकांश distros में मामला होगा, लेकिन एम्बेडेड सिस्टम पर अक्षम किया जा सकता है।

  • mmap वास्तव में आगे जाना है और गिरी के आंतरिक hugetlbfs माउंट, जिसकी स्थिति /sys/kernel/mm/hugepages नीचे देखा जा सकता से पृष्ठों को आरक्षित होगा। प्रश्न में पृष्ठों को mmap के समय उपलब्ध होने की आवश्यकता है (HugePages_Free/proc/meminfo में देखें), या mmap विफल हो जाएगा।

दो तंत्र गिरी पेड़ में अपने स्वयं के दस्तावेज़ फ़ाइल है: hugetlbpage.txt और transhuge.txt

+0

तो दिया वहाँ उपलब्ध पर्याप्त पृष्ठों रहे हैं ... 'mmap' अधिक विश्वसनीय विकल्प है? क्या वो सही है? – subzero

+3

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

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