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

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

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

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

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

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

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

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

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

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

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

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

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

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

फ़ाइल I/O के मानक साधनों की तुलना में एमएमएपी भी कम स्केलेबल होता है, क्योंकि लिनक्स समेत कई ऑपरेटिंग सिस्टमों में पेज दोषों को संभालने वाले कोर की संख्या पर कैप है। अत्यधिक तेज़ उपकरण, जैसे आधुनिक NVM एक्सप्रेस SSDs, ओवरहेड को एक वास्तविक चिंता का विषय बनाने में सक्षम हैं। अंतर्निहित फ़ाइल पर I/O त्रुटियां (उदाहरण के लिए इसकी हटाने योग्य ड्राइव अनप्लग है या ऑप्टिकल मीडिया को बाहर निकाल दिया गया है, लिखते समय डिस्क पूर्ण है, आदि) इसकी मैप की गई मेमोरी तक पहुंचने के दौरान POSIX पर SIGSEGV/SIGBUS सिग्नल के रूप में एप्लिकेशन को रिपोर्ट किया जाता है, और विंडोज़ पर EXECUTE_IN_PAGE_ERROR संरचित अपवाद। इन त्रुटियों को संभालने के लिए मैप की गई मेमोरी तक पहुँचने वाले सभी कोड तैयार होने चाहिए, जो आमतौर पर मेमोरी एक्सेस करते समय नहीं होते हैं।

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

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

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

मंच समर्थन
अधिकांश आधुनिक ऑपरेटिंग सिस्टम या रनटाइम वातावरण किसी प्रकार की मेमोरी-मैप्ड फ़ाइल एक्सेस का समर्थन करते हैं। कार्यक्रम mmap, जो फ़ाइल डिस्क्रिप्टर दिए गए फ़ाइल का मैपिंग बनाता है, फ़ाइल में स्थान शुरू करता है, और लंबाई, POSIX विनिर्देश का हिस्सा है, इसलिए यूनिक्स, लिनक्स, Mac OS X  जैसे पॉज़िक्स-अनुपालन प्रणालियों की विस्तृत विविधता या OpenVMS, मेमोरी मैपिंग फ़ाइलों के लिए एक सामान्य तंत्र का समर्थन करता है। Microsoft Windows ऑपरेटिंग सिस्टम इस उद्देश्य के लिए API फ़ंक्शंस के एक समूह का भी समर्थन करता है, जैसे CreateFileMapping. Microsoft Windows और POSIX- संगत प्लेटफ़ॉर्म के लिए मेमोरी-मैप की गई फ़ाइलों के कुछ मुफ़्त पोर्टेबल कार्यान्वयन हैं: जावा (प्रोग्रामिंग भाषा) मेमोरी मैप की गई फ़ाइलों तक पहुँचने के लिए कक्षाएं और विधियाँ प्रदान करता है, जैसे.
 * बूस्ट.इंटरप्रोसेस, बूस्ट सी ++ पुस्तकालयों में
 * बूस्ट.आईओस्ट्रीम, बूस्ट सी ++ लाइब्रेरी में भी
 * एफएमस्ट्रीम
 * सीपीपी-एमएमएफ

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

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

पर्ल के लिए सीपीएएन पर मेमोरी मैपिंग फाइलों के लिए कई मॉड्यूल उपलब्ध हैं, जैसे Sys::Mmap और File::Map. Microsoft .NET रनटाइम में, Windows API के माध्यम से सीधे मेमोरी मैप की गई फ़ाइलों का उपयोग करने के लिए P/Invoke का उपयोग किया जा सकता है। मेमोरी मैप की गई फ़ाइलों के लिए प्रबंधित पहुँच (P/Invoke आवश्यक नहीं) को रनटाइम के संस्करण 4 में पेश किया गया था (देखें मेमोरी-मैप्ड फ़ाइलें)। पिछले संस्करणों के लिए, तीसरे पक्ष के पुस्तकालय हैं जो प्रबंधित एपीआई प्रदान करते हैं। PHP ने फ़ाइल_get_contents जैसे कई मूल फ़ाइल एक्सेस फ़ंक्शंस में मेमोरी-मैपिंग तकनीकों का समर्थन किया है, लेकिन इसे 5.3 में हटा दिया है (देखें संशोधन लॉग)।

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

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