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