मेमोरी मैप की फ़ाइलों के लिए इस्तेमाल किया जा सकता है या तो पढ़ने/लिखने का उपयोग, या समवर्ती साझा करने का समर्थन करने के बदलें। जब आप उन्हें एक तंत्र के लिए उपयोग करते हैं, तो आप दूसरे को भी प्राप्त करते हैं।
बल्कि lseeking और लेखन और एक फाइल में चारों ओर पढ़ने से, आप इसे स्मृति में नक्शा और बस बिट्स जहाँ आप उन्हें होने की उम्मीद एक्सेस करते हैं।
यह बहुत आसान हो सकता है, और आभासी स्मृति इंटरफ़ेस के आधार पर प्रदर्शन में सुधार कर सकते हैं। प्रदर्शन सुधार हो सकता है क्योंकि ऑपरेटिंग सिस्टम अब आपके सभी अन्य प्रोग्राममैटिक मेमोरी एक्सेस के साथ इस पूर्व "फ़ाइल I/O" को प्रबंधित करता है, और (सिद्धांत रूप में) पेजिंग एल्गोरिदम का लाभ उठा सकता है और आगे यह है कि यह पहले से ही समर्थन के लिए उपयोग कर रहा है आपके प्रोग्राम के आराम के लिए वर्चुअल मेमोरी। हालांकि, यह आपके अंतर्निहित वर्चुअल मेमोरी सिस्टम की गुणवत्ता पर निर्भर करता है। मैंने सुना है कि सोलारिस और * बीएसडी वर्चुअल मेमोरी सिस्टम लिनक्स की वीएम प्रणाली की तुलना में बेहतर प्रदर्शन सुधार दिखा सकते हैं - लेकिन मेरे पास इसका समर्थन करने के लिए कोई अनुभवजन्य डेटा नहीं है। YMMV। जब आप मैप किए गए स्मृति के माध्यम से एक ही "फाइल" का उपयोग कर कई प्रक्रियाओं की संभावना पर विचार
कन्करेंसी चित्र में आता है। पढ़ने/लिखने वाले मॉडल में, यदि फाइल के उसी क्षेत्र में दो प्रक्रियाएं लिखी गई हैं, तो आप बहुत अधिक आश्वस्त हो सकते हैं कि प्रक्रिया में से एक डेटा फ़ाइल में पहुंच जाएगा, अन्य प्रक्रिया 'डेटा को ओवरराइट कर देगा। आपको एक, या दूसरा मिल जाएगा - लेकिन कुछ अजीब इंटरमलिंग नहीं। मुझे यह मानना है कि मुझे यकीन नहीं है कि यह किसी भी मानक द्वारा अनिवार्य व्यवहार है, लेकिन यह ऐसा कुछ है जिसे आप बहुत भरोसा कर सकते हैं। (यह वास्तव में agood फॉलोअप सवाल है!)
मैप की दुनिया में, इसके विपरीत में, दो प्रक्रियाओं दोनों "लेखन" कल्पना। वे "मेमोरी स्टोर्स" कर ऐसा करते हैं, जिसके परिणामस्वरूप ओ/एस डेटा को डिस्क पर डेटा पेजिंग करता है - अंततः। लेकिन इस बीच, अतिव्यापी लेखन होने की उम्मीद की जा सकती है।
यहां एक उदाहरण है। मान लें कि मेरे पास ऑफ़सेट 1024 पर 8 बाइट्स लिखने दोनों की दो प्रक्रियाएं हैं। प्रक्रिया 1 '11111111' लिख रही है और प्रक्रिया 2 '22222222' लिख रही है। यदि वे फ़ाइल I/O का उपयोग करते हैं, तो आप कल्पना कर सकते हैं, ओ/एस में गहराई से, 1 बजे से भरा बफर है, और 2 बजे से भरा बफर, दोनों डिस्क पर एक ही स्थान पर जाते हैं। उनमें से एक पहले वहाँ जा रहा है, और दूसरा एक सेकंड। इस मामले में, दूसरा जीतता है। हालांकि, अगर मैं मेमोरी-मैप किए गए फ़ाइल दृष्टिकोण का उपयोग कर रहा हूं, तो प्रक्रिया 1 4 बाइट्स की मेमोरी स्टोर जा रही है, इसके बाद 4 बाइट्स की एक और मेमोरी स्टोर है (मान लीजिए कि अधिकतम मेमोरी स्टोर आकार नहीं है)।प्रक्रिया 2 वही काम करेगा। जब प्रक्रियाओं को चलाने के आधार पर, आप निम्न में से किसी को देखने की उम्मीद कर सकते हैं:
11111111
22222222
11112222
22221111
इस का हल स्पष्ट पारस्परिक अपवर्जन उपयोग करने के लिए है - जो शायद किसी भी घटना में एक अच्छा विचार है। आप ओ/एस पर पढ़ने/लिखने वाली फ़ाइल I/O मामले में "सही चीज़" करने के लिए भरोसा करते थे, वैसे भी।
वर्गीकरण पारस्परिक बहिष्कार आदिम म्यूटेक्स है। मेमोरी मैप की गई फ़ाइलों के लिए, मैं सुझाव दूंगा कि आप मेमोरी-मैप किए गए म्यूटेक्स को देखें, उदाहरण के लिए (उदा।) Pthread_mutex_init()।
एक गोचा के साथ संपादित करें: जब आप मैप की गई फ़ाइलों का उपयोग कर रहे हैं, फ़ाइल में डेटा में पॉइंटर्स को एम्बेड करने का एक प्रलोभन है, फ़ाइल में (मैप किए गए फ़ाइल में संग्रहीत लिंक की गई सूची)। आप ऐसा नहीं करना चाहते हैं, क्योंकि फाइल अलग-अलग समय पर अलग-अलग पूर्ण पते पर या विभिन्न प्रक्रियाओं में मैप की जा सकती है। इसके बजाय, मैप किए गए फ़ाइल के भीतर ऑफ़सेट का उपयोग करें।
अच्छा Windows पर कम से कम आप एक बड़ा mmap फ़ाइल के एकाधिक 32 बिट विचारों मैप कर सकते हैं - जो नियमित रूप से CRT समारोह –
@MarkR आप ने लिखा है "अपने अतिरिक्त नकल न केवल समय लगता है का उपयोग करते हुए बहुत बड़ी फ़ाइलों से निपटने के लिए कोशिश कर रहा से अधिक कुशल हो सकता है , लेकिन ** डेटा की इस अतिरिक्त प्रति को एक्सेस करके सीपीयू के कैश की प्रभावशीलता को कम करता है। ** "। (** जोर ** मेरा)। क्या आप कृपया बता सकते हैं कि कर्नेल में अतिरिक्त बफर प्रतिलिपि कैसे सीपीयू के कैश की प्रभावशीलता में बाधा डालती है? – Geek
@ गीक दो गुना अधिक स्मृति तक पहुंच = दो बार जितना कैश बर्बाद हो गया (बहुत लगभग)। – immibis