2012-08-23 13 views
17

का उपयोग कब करेंगे, इसलिए, मैं समझता हूं कि अगर आपको कुछ गतिशील आवंटित स्मृति की आवश्यकता है, तो आप malloc() का उपयोग कर सकते हैं। उदाहरण के लिए, आपका प्रोग्राम एक परिवर्तनीय लंबाई फ़ाइल को char [] में पढ़ता है। आप पहले से नहीं जानते कि आपकी सरणी कितनी बड़ी है, इसलिए आप रनटाइम में मेमोरी आवंटित करते हैं।आप mmap

मैं समझने की कोशिश कर रहा हूं कि आप mmap() का उपयोग कब करेंगे। मैंने मैन पेज पढ़ा है और ईमानदार होने के लिए, मुझे समझ में नहीं आता कि उपयोग का मामला क्या है।

क्या कोई साधारण शब्दों में मुझे उपयोग के मामले की व्याख्या कर सकता है? अग्रिम में धन्यवाद।

उत्तर

28

mmap कुछ चीजों के लिए उपयोग किया जा सकता है। सबसे पहले, एक फ़ाइल समर्थित बैपिंग। malloc के साथ मेमोरी आवंटित करने और फ़ाइल को पढ़ने के बजाय, आप इसे पूरी तरह से पढ़ने के बिना पूरी फ़ाइल को स्मृति में मैप करते हैं। अब जब आप उस स्मृति क्षेत्र से (या लिखते हैं) पढ़ते हैं, तो ऑपरेशन फ़ाइल पर पारदर्शी रूप से कार्य करता है। तुमने ऐसा क्यों करना चाहोगे? यह आपको ओएस-प्रदत्त पेजिंग तंत्र का उपयोग कर उपलब्ध स्मृति से बड़ी फ़ाइलों को आसानी से संसाधित करने देता है। छोटी फ़ाइलों के लिए भी, एमएमएपीपी मेमोरी प्रतियों की संख्या को कम कर देता है।

mmap भी अनाम मैपिंग के लिए उपयोग किया जा सकता है। यह मैपिंग किसी फ़ाइल द्वारा समर्थित नहीं है, और मूल रूप से स्मृति के एक हिस्से के लिए एक अनुरोध है। अगर यह malloc जैसा लगता है, तो आप सही हैं। वास्तव में, malloc का अधिकांश कार्यान्वयन आंतरिक स्मृति क्षेत्र प्रदान करने के लिए आंतरिक रूप से अज्ञात mmap का उपयोग करेगा।

एक और आम उपयोग केस है कि एकाधिक प्रक्रियाएं एक साझा मेमोरी क्षेत्र को साझा करने के लिए साझा मैपिंग के समान फ़ाइल को मैप करें। फ़ाइल को वास्तव में डिस्क पर लिखा जाना आवश्यक नहीं है। shm_open ऐसा करने का एक सुविधाजनक तरीका है।

+0

क्या आपके पास केवल एक छोटी सी मात्रा के साथ बड़ी फ़ाइल तक पहुंचने के तरीके के बारे में अधिक जानकारी के साथ एक लिंक है? यह बिंदु मुझे mmap() काम करता है जिस तरह से भ्रमित करता है ... – Ioan

+0

@Ioan बड़ी फ़ाइलों के लिए वास्तव में कोई विवरण नहीं है: आप बस उन्हें 'mmap''। फ़ाइल को निश्चित रूप से _virtual_ मेमोरी में फिट होना होगा, लेकिन पूरे वर्चुअल मेमोरी को किसी भी समय रैम में उपस्थित होने की आवश्यकता नहीं है। 'mmap' स्वैप स्पेस के समान तंत्र का उपयोग करता है। लेकिन एक विवेकपूर्ण स्मृति काम कैसे करता है इसका एक स्पष्टीकरण टिप्पणी के लिए थोड़ा लंबा होगा :) –

+0

आपकी टिप्पणी अधिक समझ में आता है। मैंने उपलब्ध स्मृति से बड़ी फ़ाइलों को संसाधित करने के बारे में क्या समझा था, उसे गलत समझा। – Ioan

5

जब भी आपको किसी निश्चित आकार के डेटा के ब्लॉक को पढ़ने/लिखने की आवश्यकता होती है तो यह एमएमएपी का उपयोग करके स्मृति पर डिस्क पर डेटा फ़ाइल को मैप करने के लिए बहुत आसान (और तेज़) है और स्मृति को आवंटित करने के बजाय इसे सीधे स्वीकार करता है, फ़ाइल को पढ़ता है, डेटा तक पहुंचें, डेटा को वापस डिस्क पर संभावित रूप से लिखें, और मेमोरी को मुक्त करें।

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