2009-04-15 15 views
23

मैं Linux सिस्टम में mmap कार्यान्वयन जो बहुत दस्तावेज होने लगते हैं नहीं है के बारे में कई प्रश्न हैं:लिनक्स mmap internals

जब स्मृति के लिए एक फ़ाइल मानचित्रण mmap का उपयोग कर, आप कैसे इस तरह के डेटा में प्रीफ़ेचिंग संभाल होगा फाइल?

आईई। जब आप mmaped क्षेत्र से डेटा पढ़ते हैं तो क्या होता है? क्या वह डेटा एल 1/एल 2 कैश में स्थानांतरित हो गया है? क्या यह सीधे डिस्क कैश से पढ़ा जाता है? prefetchnta और इसी तरह के एएसएम निर्देश mmap एड जोन्स पर काम करते हैं?

वास्तविक mmap कॉल का ओवरहेड क्या है? क्या यह मैप किए गए डेटा की मात्रा, या निरंतर है?

आशा है कि किसी के पास इसमें कुछ अंतर्दृष्टि है। अग्रिम में धन्यवाद।

उत्तर

29

mmap मूल रूप से वर्चुअल मेमोरी उप सिस्टम में प्रोग्रामेटिक पहुंच है।

जब आपके पास कहें, 1 जी फ़ाइल, और आप इसे एमएमएपी करते हैं, तो आपको "संपूर्ण" फ़ाइल के लिए एक सूचक मिलता है जैसे कि यह स्मृति में था।

हालांकि, इस चरण में वीएम में फ़ाइल के लिए पृष्ठों को आरक्षित करने के वास्तविक मैपिंग ऑपरेशन को बचाया गया है। (फ़ाइल जितनी बड़ी होगी, उतनी ही लंबी मैपिंग ऑपरेशन होगी।)

फ़ाइल से डेटा पढ़ने शुरू करने के लिए, आप बस उस पॉइंटर के माध्यम से एक्सेस करें जिसे आप एमएमएपी कॉल में वापस कर चुके थे।

यदि आप फ़ाइल के हिस्सों को "प्रीलोड" करना चाहते हैं, तो बस उस क्षेत्र पर जाएं जहां आप प्रीलोड करना चाहते हैं। सुनिश्चित करें कि आप उन सभी पृष्ठों पर जाएं जिन्हें आप लोड करना चाहते हैं, क्योंकि वीएम केवल आपके द्वारा उपयोग किए जाने वाले पृष्ठों को लोड करेगा। उदाहरण के लिए, अपनी 1 जी फ़ाइल के भीतर कहें, आपके पास 10 एमबी "इंडेक्स" क्षेत्र है जिसे आप मानचित्र बनाना चाहते हैं। सबसे आसान तरीका यह है कि "अपनी अनुक्रमणिका चलें" या आपके पास जो भी डेटा संरचना है, वीएम पेज को दे आवश्यकतानुसार डेटा में। या, यदि आप "जानते हैं" कि यह फ़ाइल का "पहला 10 एमबी" है, और यह कि आपके वीएम के लिए आपका पृष्ठ आकार, 4K कहता है, तो आप सिर्फ एमएमएपी पॉइंटर को चार सूचक में डाल सकते हैं, और बस इसके माध्यम से फिर से चल सकते हैं पृष्ठों की है।

void load_mmap(char *mmapPtr) { 
    // We'll load 10MB of data from mmap 
    int offset = 0; 
    for(int offset = 0; offset < 10 * 1024 * 1024; offset += 4 * 1024) { 
     char *p = mmapPtr + offset; 
     // deref pointer to force mmap load 
     char c = *p; 
    } 
} 

L1 और L2 कैश के रूप में, mmap उस के साथ कोई संबंध नहीं है, कि आप डेटा का उपयोग कैसे करें के बारे में है।

चूंकि आप अंतर्निहित वीएम सिस्टम का उपयोग कर रहे हैं, एमएमएपीएड ब्लॉक के भीतर डेटा को संबोधित करने वाला कोई भी काम (कभी भी असेंबली से) काम करेगा।

यदि आप किसी भी mmap'd डेटा को नहीं बदलते हैं, तो वीएम स्वचालित रूप से पुराने पृष्ठों को बाहर कर देगा क्योंकि नए पेजों की आवश्यकता है यदि आप वास्तव में उन्हें बदलते हैं, तो वीएम उन पृष्ठों को आपके लिए वापस लिख देगा।

+8

चार नहीं चाहेंगे "c = * पी" का उपयोग दूर अनुकूलित किया? सी को अस्थिर घोषित किया जाना चाहिए? –

+1

लिनक्स के हाल के संस्करणों में, आप map_POPULATE को झंडे तर्क में mmap() में सेट कर सकते हैं और कॉल रिटर्न से पहले पृष्ठों को खींच लिया जाएगा। यह उस समय के लिए कॉल को अवरुद्ध करेगा जो फ़ाइल आकार का कुछ फ़ंक्शन है, इसलिए अलग-अलग थ्रेड में example load_mmap() फ़ंक्शन को चलाने से प्रदर्शन में सुधार होगा यदि फ़ाइल सामग्री की आवश्यकता से पहले समानांतर में किया जा सकता है पढ़ने के लिए, खासकर जब अधिकांश काम कर्नेल पक्ष पर किया जाता है। –

+0

पृष्ठों को प्रीलोड नहीं करता है? –

3

सीपीयू कैश के साथ ऐसा कुछ नहीं है; यह इसे वर्चुअल एड्रेस स्पेस में मैप करता है, और यदि इसे बाद में एक्सेस किया जाता है, या mlock() से लॉक किया जाता है, तो यह इसे भौतिक रूप से स्मृति में लाता है। इसमें सीपीयू कैश क्या है या नहीं, यह वास्तव में कुछ भी नहीं है (कम से कम, mmap के माध्यम से नहीं)।

आम तौर पर पृष्ठों को छूने के लिए इसे मैप करने के लिए जरूरी है, लेकिन यदि आप एक नकली या मेलॉकल करते हैं, तो इसका असर होगा (इन्हें आमतौर पर विशेषाधिकार प्राप्त किया जाता है)।

जहां तक ​​ओवरहेड का संबंध है, मुझे वास्तव में पता नहीं है, आपको इसे मापना होगा। मेरा अनुमान है कि एक mmap() जो पृष्ठों को लोड नहीं करता है, निरंतर समय ऑपरेशन कम या कम होता है, लेकिन पृष्ठों को लाने में अधिक पृष्ठों के साथ अधिक समय लगेगा।

कई प्रक्रियाओं एक ही फाइल को मैप कर सकते हैं:

लिनक्स के हाल के संस्करण भी एक ध्वज MAP_POPULATE जो तुरंत में पृष्ठों को लोड करने mmap (संभवतः केवल यदि संभव हो तो)

2

श्री रवि Phulsundar के प्रश्न का उत्तर देना निर्देश देता है समर्थन जब तक अनुमतियां सही ढंग से सेट की जाती हैं। mmap आदमी पेज को देखते हुए सिर्फ MAP_SHARED ध्वज पारित (यदि आप के बजाय एक बहुत बड़ी फाइल उपयोग mmap2 मैप करने की आवश्यकता): सभी अन्य प्रक्रियाओं के साथ इस मानचित्रण

mmap

MAP_SHARED

शेयर कि इस वस्तु को मानचित्र करें। क्षेत्र में संग्रहीत फ़ाइल के लिए लिखने के बराबर है। फ़ाइल वास्तव में तब तक अपडेट नहीं की जा सकती जब तक msync (2) या munmap (2) को कॉल नहीं किया जाता है।

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