मेमोरी-मैप्ड फ़ाइल

मेमोरी-मैप्ड फ़ाइल वर्चुअल मेमोरी का भाग है | जिसे फ़ाइल या फ़ाइल-जैसे संसाधन के कुछ भाग के साथ प्रत्यक्ष बाइट-फॉर-बाइट सहसंबंध प्रस्तुत किया गया है। यह संसाधन सामान्यतः फ़ाइल है जो डिस्क पर फिजिकल रूप से उपस्थित है, किंतु यह उपकरण, साझा मेमोरी ऑब्जेक्ट या अन्य संसाधन भी हो सकता है जिसे संचालन प्रणाली फाइल डिस्क्रिप्टर के माध्यम से संदर्भित कर सकता है। एक बार उपस्थित होने के बाद, फ़ाइल और मेमोरी स्पेस के बीच यह सहसंबंध अनुप्रयोगों को मैप किए गए भाग का उपचार करने की अनुमति देता है | जैसे कि प्राथमिक मेमोरी होती है।

टॉप्स-20 पीएमएपी
इसका प्रारंभिक (c. 1969) कार्यान्वयन निर्णय प्रणाली-20 के टॉप्स-20 संचालन प्रणाली पर पीएमएपी प्रणाली थी | सॉफ्टवेयर हाउस के प्रणाली 1022 (डेटाबेस) प्रणाली द्वारा उपयोग की जाने वाली सुविधा है।

सनोस 4 एमएमएपी
सनोस 4 ने यूनिक्स के एमएमएपी को प्रस्तुत किया, जिसने प्रोग्राम को "मेमोरी में फाइलों को मैप करने" की अनुमति दी।

विंडोज ग्रोएबल मेमोरी-मैप्ड फाइल्स (जीएमएमएफ)
टॉप्स-20 के पीएमएपी के रिलीज होने के दो दशक बाद, विंडोज एनटी को ग्रोएबल मेमोरी-मैप्ड फाइल्स (जीएमएमएफ) दी गई।

चूंकि क्रिएटफाइल मैपिंग कार्य को इसके पास जाने और बदलने के लिए आकार की आवश्यकता होती है | फ़ाइल का आकार आसानी से समायोजित नहीं होता है,| जीएमएमएफ एपीआई विकसित किया गया था। जीएमएमएफ के उपयोग की आवश्यकता है | फ़ाइल का आकार कितना बढ़ सकता है, इसकी घोषणा करना, किंतु कोई भी अप्रयुक्त स्थान व्यर्थ नहीं होता है।

लाभ
फ़ाइल मैपिंग का लाभ I/O प्रदर्शन को बढ़ा रहा है, खासकर जब बड़ी फ़ाइलों पर उपयोग किया जाता है। छोटी फाइलों के लिए, मेमोरी-मैप्ड फाइलों के परिणामस्वरूप स्लैक स्पेस व्यर्थ हो सकती है | चूंकि मेमोरी मानचित्र सदैव पृष्ठ आकार के अनुरूप होते हैं, जो अधिकतर 4 KiB होता है। इसलिए, 5 KiB फ़ाइल 8 KiB आवंटित करेगी और इस प्रकार 3 KiB व्यर्थ हो जाएगी। दो कारणों से सीधे पढ़ने और लिखने के संचालन की तुलना में मेमोरी मैप की गई फ़ाइलों तक पहुँचना तेज़ है। सबसे पहले, प्रणाली कॉल प्रोग्राम की स्थानीय मेमोरी में साधारण परिवर्तन की तुलना में धीमी परिमाण का आदेश है। दूसरे, अधिकांश संचालन प्रणाली में मैप किया गया मेमोरी रीजन वास्तव में कर्नेल का पेज कैश (फ़ाइल कैश) है, जिसका अर्थ है कि उपयोगकर्ता स्थान में कोई कॉपी बनाने की आवश्यकता नहीं है।

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

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

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

प्रकार
मेमोरी-मैप्ड फ़ाइलें दो प्रकार की होती हैं:

स्थायी
स्थायी फ़ाइलें डिस्क पर स्रोत फ़ाइल से संबद्ध होती हैं। अंतिम प्रक्रिया समाप्त होने के बाद डेटा डिस्क पर स्रोत फ़ाइल में सहेजा जाता है। ये मेमोरी-मैप्ड फ़ाइलें अत्यधिक बड़ी स्रोत फ़ाइलों के साथ काम करने के लिए उपयुक्त हैं।

गैर-स्थायी
गैर-स्थायी फ़ाइलें डिस्क पर किसी फ़ाइल से संबद्ध नहीं होती हैं। जब अंतिम प्रक्रिया फ़ाइल के साथ काम करना समाप्त कर लेती है, तो डेटा खो जाता है। ये फ़ाइलें अंतर-प्रक्रिया संचार (आईपीसी) के लिए साझा मेमोरी बनाने के लिए उपयुक्त हैं।

कमियां
मेमोरी मैप की गई फ़ाइल I/O चुनने का प्रमुख कारण प्रदर्शन है। फिर भी, ट्रेडऑफ़ हो सकते हैं। प्रणाली कॉल ओवरहेड और मेमोरी कॉपी करने के कारण मानक I/O दृष्टिकोण महंगा है। मेमोरी-मैप्ड एप्रोच की पेज फॉल्ट माइनर्स में इसका निवेश होता है - जब पेज कैश में डेटा का ब्लॉक लोड होता है, किंतु अभी तक प्रक्रिया के वर्चुअल मेमोरी स्पेस में मैप नहीं किया जाता है। कुछ परिस्थितियों में, मेमोरी मैप की गई फ़ाइल I/O मानक फ़ाइल I/O की तुलना में अधिक धीमी हो सकती है।

मेमोरी-मैप्ड फ़ाइलों की एक और कमी किसी दिए गए आर्किटेक्चर के मेमोरी पता से संबंधित है: एड्रेसेबल स्पेस से बड़ी फाइल में समय में केवल मैप किए गए भाग हो सकते हैं, इसे पढ़ने में कठिनाई होती है। उदाहरण के लिए, 32-बिट आर्किटेक्चर जैसे इंटेल का IA-32 केवल सीधे 4 GiB या फाइलों के छोटे भाग को संबोधित कर सकता है। संचालन प्रणाली कर्नेल के आधार पर, विशेष रूप से 2 से 3 GiB की सीमा में अलग-अलग प्रोग्रामों के लिए पता योग्य स्थान की छोटी मात्रा उपलब्ध है। चूंकि यह दोष आधुनिक 64-बिट आर्किटेक्चर पर लगभग समाप्त हो गया है।

फ़ाइल I/O के मानक साधनों की तुलना में एमएमएपी भी कम स्केलेबल होता है, क्योंकि लिनक्स समेत कई ऑपरेटिंग प्रणालियों में पेज दोषों को संभालने वाले कोर की संख्या पर कैप है। अत्यधिक तेज़ उपकरण, जैसे आधुनिक एनवीएम एक्सप्रेस एसएसडी, ओवरहेड को वास्तविक चिंता का विषय बनाने में सक्षम हैं।

अंतर्निहित फ़ाइल पर I/O त्रुटियां (उदाहरण के लिए इसकी हटाने योग्य ड्राइव अनप्लग है या ऑप्टिकल मीडिया को बाहर निकाल दिया गया है, लिखते समय डिस्क पूर्ण है, आदि) इसकी मैप की गई मेमोरी तक पहुंचने के समय पॉज़िक्स पर सिगसेजीवी/सिगबस सिग्नल के रूप में अनुप्रयोग को सूचित किया जाता है, और विंडोज़ पर पृष्ठ त्रुटि में संरचित अपवाद निष्पादित करें । इन त्रुटियों को संभालने के लिए मैप की गई मेमोरी तक पहुँचने वाले सभी कोड तैयार होने चाहिए, जो सामान्यतः मेमोरी एक्सेस करते समय नहीं होते हैं।

मेमोरी प्रबंधन इकाई के साथ केवल हार्डवेयर आर्किटेक्चर ही मेमोरी-मैप की गई फ़ाइलों का समर्थन कर सकते हैं। एमएमयू के बिना आर्किटेक्चर पर, संचालन प्रणाली पूरी फाइल को मेमोरी में कॉपी कर सकता है | जब इसे मैप करने का अनुरोध किया जाता है, किंतु यह व्यर्थ और धीमा है | यदि केवल थोड़ी सी फाइल को एक्सेस किया जाएगा, और केवल फाइलों के लिए काम कर सकता है जो उपलब्ध मेमोरी में फिट होगा।

सामान्य उपयोग
मेमोरी-मैप्ड फ़ाइल के लिए संभवतः सबसे सामान्य उपयोग अधिकांश आधुनिक संचालन प्रणाली ( माइक्रोसॉफ़्ट विंडोज़ और यूनिक्स जैसी प्रणाली सहित) में लोडर (कंप्यूटिंग) है। जब कोई प्रक्रिया (कंप्यूटिंग) प्रारंभ की जाती है, तो संचालन प्रणाली मेमोरी मैप की गई फ़ाइल का उपयोग करता है निष्पादन के लिए मेमोरी में किसी भी लोड करने योग्य मॉड्यूल के साथ निष्पादन योग्य फ़ाइल लाने के लिए होती है। अधिकांश मेमोरी-मैपिंग प्रणाली डिमांड पेजिंग नामक विधि का उपयोग करते हैं, जहां फ़ाइल को सबसेट (प्रत्येक पेज) में फिजिकल मेमोरी में लोड किया जाता है | और केवल जब वह पेज वास्तव में संदर्भित होता है। निष्पादन योग्य फ़ाइलों के विशिष्ट स्थिति में, यह ओएस को प्रक्रिया छवि के केवल उन भागो को चुनिंदा रूप से लोड करने की अनुमति देता है जिन्हें वास्तव में निष्पादित करने की आवश्यकता होती है।

मेमोरी-मैप्ड फ़ाइलों के लिए एक अन्य सामान्य उपयोग कई प्रक्रियाओं के बीच मेमोरी साझा करना है। आधुनिक संरक्षित मोड संचालन प्रणाली में, प्रक्रियाओं को सामान्यतः मेमोरी स्थान तक पहुंचने की अनुमति नहीं होती है जो किसी अन्य प्रक्रिया द्वारा उपयोग के लिए आवंटित की जाती है। (ऐसा करने के लिए प्रोग्राम का प्रयास पृष्ठ दोष अमान्य या विभाजन उल्लंघन का कारण बनता है।) मेमोरी को सुरक्षित रूप से साझा करने के लिए कई विधिय उपलब्ध हैं, और मेमोरी-मैप्ड फ़ाइल I/O सबसे लोकप्रिय में से एक है। दो या दो से अधिक अनुप्रयोग एक साथ फिजिकल फ़ाइल को मेमोरी में मैप कर सकते हैं और इस मेमोरी तक पहुंच सकते हैं। उदाहरण के लिए, माइक्रोसॉफ्ट विंडोज संचालन प्रणाली अनुप्रयोगों के लिए प्रणाली के पेज फ़ाइल के साझा भाग को मेमोरी-मैप करने और इस भाग के माध्यम से डेटा साझा करने के लिए तंत्र प्रदान करता है।

प्लैटफ़ॉर्म समर्थन
अधिकांश आधुनिक संचालन प्रणाली या रनटाइम वातावरण किसी प्रकार की मेमोरी-मैप्ड फ़ाइल एक्सेस का समर्थन करते हैं। प्रोग्राम एमएमएपी, जो फ़ाइल डिस्क्रिप्टर दिए गए फ़ाइल का मैपिंग बनाता है | फ़ाइल में स्थान प्रारंभ करता है, और लंबाई, पॉज़िक्स विनिर्देश का भाग है | इसलिए यूनिक्स, लिनक्स, मैक ओएस एक्स जैसे पॉज़िक्स-अनुपालन प्रणालियों की विस्तृत विविधता होती है | या ओपनवीएमएस, मेमोरी मैपिंग फ़ाइलों के लिए सामान्य तंत्र का समर्थन करता है। माइक्रोसॉफ्ट विंडोज संचालन प्रणाली इस उद्देश्य के लिए एपीआई कार्य के समूह का भी समर्थन करता है | जैसे क्रिएटफाइल मैपिंग.

माइक्रोसॉफ्ट विंडोज और पॉज़िक्स- संगत प्लेटफ़ॉर्म के लिए मेमोरी-मैप की गई फ़ाइलों के कुछ मुफ़्त पोर्टेबल कार्यान्वयन हैं: जावा (प्रोग्रामिंग भाषा) मेमोरी मैप की गई फ़ाइलों तक पहुँचने के लिए कक्षाएं और विधियाँ प्रदान करता है, जैसे .है |
 * बूस्ट.इंटरप्रोसेस, बूस्ट सी ++ पुस्तकालयों में होता है |
 * बूस्ट.आईओस्ट्रीम, बूस्ट सी ++ लाइब्रेरी में भी होता है |
 * एफएमस्ट्रीम
 * सीपीपी-एमएमएफ

D (प्रोग्रामिंग लैंग्वेज) अपने मानक पुस्तकालय (एसटीडी.एमएमफ़ाइल मॉड्यूल) में मेमोरी मैप की गई फ़ाइलों का समर्थन करता है।

रूबी (प्रोग्रामिंग भाषा) में एमएमएपी नामक रत्न (लाइब्रेरी) है, जो मेमोरी-मैप्ड फाइल ऑब्जेक्ट्स को प्रयुक्त करता है।

संस्करण 1.6 के बाद से, पायथन प्रोग्रामिंग भाषा में mmap सम्मिलित है | इसके मानक पुस्तकालय में मॉड्यूल का विवरण इस बात पर निर्भर करता है कि होस्ट प्लेटफॉर्म माइक्रोसॉफ्ट विंडोज है या यूनिक्स जैसा है।

पर्ल के लिए सीपीएएन पर मेमोरी मैपिंग फाइलों के लिए कई मॉड्यूल उपलब्ध हैं,| जैसे एसआईएस :: एमएमएपी और फ़ाइल :: मानचित्र. है |

माइक्रोसॉफ्ट .नेट रनटाइम में, विंडोज एपीआई के माध्यम से सीधे मेमोरी मैप की गई फ़ाइलों का उपयोग करने के लिए पी/इनवोक का उपयोग किया जा सकता है। मेमोरी मैप की गई फ़ाइलों के लिए प्रबंधित पहुँच (पी/इनवोक आवश्यक नहीं) को रनटाइम के संस्करण 4 में प्रस्तुत किया गया था (देखें मेमोरी-मैप्ड फ़ाइलें)। पिछले संस्करणों के लिए, तीसरे पक्ष के पुस्तकालय हैं जो प्रबंधित एपीआई प्रदान करते हैं।

पीएचपी ने फ़ाइल सामग्री प्राप्त करें जैसे कई मूल फ़ाइल एक्सेस कार्य में मेमोरी-मैपिंग विधियों का समर्थन किया है, किंतु इसे 5.3 में हटा दिया है (देखें संशोधन लॉग)।

आर प्रोग्रामिंग भाषा के लिए सीआरएएन पर पुस्तकालय उपस्थित है जिसे बिगमेमोरी कहा जाता है जो बूस्ट लाइब्रेरी का उपयोग करता है और मेमोरी-मैप्ड समर्थित सरणियाँ सीधे प्रदान करता है | ff मेमोरी-मैप्ड सदिश, मैट्रिसेस, एरेज़ और डेटा फ़्रेम प्रदान करता है।

जे प्रोग्रामिंग भाषा ने कम से कम 2005 से मेमोरी मैप की गई फ़ाइलों का समर्थन किया है। इसमें बॉक्सिंग एरे डेटा और सिंगल डेटाटाइप फ़ाइलों के लिए समर्थन सम्मिलित है। समर्थन 'डेटा/जेएमएफ' से लोड किया जा सकता है जे के जेडीबी और जेडी डेटाबेस इंजन कॉलम स्टोर्स के लिए मेमोरी मैप की गई फाइलों का उपयोग करते हैं।