मेमोरी-मैप्ड फ़ाइल: Difference between revisions

From Vigyanwiki
No edit summary
No edit summary
Line 1: Line 1:
{{Short description|Virtual memory region with bytes mapped to a file or file-like resource}}
{{Short description|Virtual memory region with bytes mapped to a file or file-like resource}}
{{distinguish| Memory-mapped I/O}}
{{distinguish|मेमोरी-मैप्ड I/O}}
मेमोरी-मैप्ड फ़ाइल [[ आभासी मेमोरी ]] का एक खंड है <ref name=":0" /> जिसे फ़ाइल या फ़ाइल-जैसे संसाधन के कुछ भाग के साथ प्रत्यक्ष बाइट-फॉर-बाइट सहसंबंध सौंपा गया है। यह संसाधन आमतौर पर एक फ़ाइल है जो डिस्क पर भौतिक रूप से मौजूद है, लेकिन यह एक उपकरण, साझा मेमोरी ऑब्जेक्ट या अन्य संसाधन भी हो सकता है जिसे [[ऑपरेटिंग सिस्टम]] [[फाइल डिस्क्रिप्टर]] के माध्यम से संदर्भित कर सकता है। एक बार मौजूद होने के बाद, फ़ाइल और मेमोरी स्पेस के बीच यह सहसंबंध अनुप्रयोगों को मैप किए गए हिस्से का इलाज करने की अनुमति देता है जैसे कि यह प्राथमिक मेमोरी हो।
मेमोरी-मैप्ड फ़ाइल [[ आभासी मेमोरी ]] का एक खंड है <ref name=":0">{{cite web
|url=https://utcc.utoronto.ca/~cks/space/blog/unix/SbrkVersusMmap
|title=The history of Unix's confusing set of low-level ways to allocate memory
|author=Chris Siebenmann |date=7 June 2018}}</ref> जिसे फ़ाइल या फ़ाइल-जैसे संसाधन के कुछ भाग के साथ प्रत्यक्ष बाइट-फॉर-बाइट सहसंबंध प्रस्तुत किया गया है। यह संसाधन सामान्यतः एक फ़ाइल है जो डिस्क पर भौतिक रूप से उपस्थित है, किंतु यह एक उपकरण, साझा मेमोरी ऑब्जेक्ट या अन्य संसाधन भी हो सकता है जिसे [[ऑपरेटिंग सिस्टम|संचालन प्रणाली]] [[फाइल डिस्क्रिप्टर]] के माध्यम से संदर्भित कर सकता है। एक बार उपस्थित होने के बाद, फ़ाइल और मेमोरी स्पेस के बीच यह सहसंबंध अनुप्रयोगों को मैप किए गए भाग का इलाज करने की अनुमति देता है | जैसे कि प्राथमिक मेमोरी होती है।


'''गैर-स्थायी फ़ाइलें डिस्क पर किसी फ़ाइल से संबद्ध नहीं होती हैं। जब अंतिम प्रक्रिया फ़ाइल के साथ काम करना समाप्त कर लेती है, तो डेटा खो जाता है। ये फ़ाइलें अंतर-प्रक्रिया संचार (आईपीसी) के लिए साझा स्मृति बनाने के लिए उपयुक्त हैं।<ref name="Memory-Mapped Files" />'''
'''गैर-स्थायी फ़ाइलें डिस्क पर किसी फ़ाइल से संबद्ध नहीं होती हैं। जब अंतिम प्रक्रिया फ़ाइल के साथ काम करना समाप्त कर लेती है, तो डेटा खो जाता है। ये फ़ाइलें अंतर-प्रक्रिया संचार (आईपीसी) के लिए साझा स्मृति बनाने के लिए उपयुक्त हैं।<ref name="Memory-Mapped Files" />'''
Line 8: Line 11:


===टॉप्स-20 पीएमएपी===
===टॉप्स-20 पीएमएपी===
जल्दी ({{circa|1969}})<ref>Development began 1969, shipped 1976</ref> इसका कार्यान्वयन [[DECSYSTEM-20]]|DEC-20 के [[TOPS-20]] ऑपरेटिंग सिस्टम पर PMAP सिस्टम कॉल था,<ref>{{cite web
इसका एक प्रारंभिक ({{circa|1969}}) <ref>Development began 1969, shipped 1976</ref> कार्यान्वयन [[DECSYSTEM-20|निर्णय प्रणाली-20]] के टॉप्स-20 संचालन प्रणाली पर पीएमएपी प्रणाली थी | <ref>{{cite web
|url=http://www.bitsavers.org/pdf/dec/pdp10/TOPS20/AA-4166E-TM_TOPS-20_Monitor_Calls_Reference_Ver_5_Dec82.pdf
|url=http://www.bitsavers.org/pdf/dec/pdp10/TOPS20/AA-4166E-TM_TOPS-20_Monitor_Calls_Reference_Ver_5_Dec82.pdf
|title=TOPS-20 Monitor Calls Reference Manual}}</ref> सॉफ्टवेयर हाउस के [[सिस्टम 1022 (डेटाबेस)]] | सिस्टम-1022 डेटाबेस सिस्टम द्वारा उपयोग की जाने वाली सुविधा।<ref>{{cite web
|title=TOPS-20 Monitor Calls Reference Manual}}</ref> सॉफ्टवेयर हाउस के [[सिस्टम 1022 (डेटाबेस)|प्रणाली 1022 (डेटाबेस)]] प्रणाली द्वारा उपयोग की जाने वाली सुविधा है। <ref>{{cite web
|quote=We had a PMAP cache for file I/O(like PA1050) in extended sections.
|quote=We had a PMAP cache for file I/O(like PA1050) in extended sections.
|title=System 1022 Database System
|title=System 1022 Database System
Line 17: Line 20:


=== सनोस 4 एमएमएपी ===
=== सनोस 4 एमएमएपी ===
सनोस 4<ref>Dec. 1988</ref> [[यूनिक्स]] की शुरुआत की <code>[[mmap]]</code>, जिसने प्रोग्राम को फाइलों को मेमोरी में मैप करने की अनुमति दी।<ref name=":0">{{cite web
सनोस 4<ref>Dec. 1988</ref> ने [[यूनिक्स]] के एमएमएपी को प्रस्तुत किया, जिसने प्रोग्राम को "मेमोरी में फाइलों को मैप करने" की अनुमति दी।<ref name=":0" />
|url=https://utcc.utoronto.ca/~cks/space/blog/unix/SbrkVersusMmap
|title=The history of Unix's confusing set of low-level ways to allocate memory
|author=Chris Siebenmann |date=7 June 2018}}</ref>




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


तब से{{code|CreateFileMapping}} फ़ंक्शन को इसके पास जाने और बदलने के लिए एक आकार की आवश्यकता होती है
चूंकि {{code|क्रिएटफाइल मैपिंग}} कार्य को इसके पास जाने और बदलने के लिए एक आकार की आवश्यकता होती है | एक फ़ाइल का आकार आसानी से समायोजित नहीं होता है,| एक जीएमएमएफ एपीआई विकसित किया गया था।<ref>{{cite magazine
एक फ़ाइल का आकार आसानी से समायोजित नहीं होता है, एक GMMF API विकसित किया गया था।<ref>{{cite magazine
|magazine=Microsoft Systems Journal  |date=October 1995
|magazine=Microsoft Systems Journal  |date=October 1995
|pages=17–28 |author=Jeffrey Richter
|pages=17–28 |author=Jeffrey Richter
|title=Add Growable Memory-Mapped Files to your App}}</ref> जीएमएमएफ के उपयोग की आवश्यकता है
|title=Add Growable Memory-Mapped Files to your App}}</ref> जीएमएमएफ के उपयोग की आवश्यकता है | फ़ाइल का आकार कितना बढ़ सकता है, इसकी घोषणा करना, किंतु कोई भी अप्रयुक्त स्थान व्यर्थ नहीं होता है।
फ़ाइल का आकार कितना बढ़ सकता है, इसकी घोषणा करना, लेकिन कोई भी अप्रयुक्त स्थान बर्बाद नहीं होता है।


== लाभ ==
== लाभ ==
फ़ाइल मैपिंग का लाभ I/O प्रदर्शन को बढ़ा रहा है, खासकर जब बड़ी फ़ाइलों पर उपयोग किया जाता है। छोटी फाइलों के लिए, मेमोरी-मैप्ड फाइलों के परिणामस्वरूप [[ सुस्त जगह ]] की बर्बादी हो सकती है<ref>{{Cite web |url=http://www.devshed.com/c/a/BrainDump/Using-mmap-for-Advanced-File-IO/ |title=Using mmap() for Advanced File I/O - BrainDump |access-date=21 May 2011 |archive-url=https://web.archive.org/web/20110807115939/http://www.devshed.com/c/a/BrainDump/Using-mmap-for-Advanced-File-IO/ |archive-date=7 August 2011 |url-status=dead }}</ref> चूंकि स्मृति मानचित्र हमेशा [[पृष्ठ आकार]] के अनुरूप होते हैं, जो अधिकतर 4 KiB होता है। इसलिए, एक 5 KiB फ़ाइल 8 KiB आवंटित करेगी और इस प्रकार 3 KiB बर्बाद हो जाएगी। दो कारणों से सीधे पढ़ने और लिखने के संचालन की तुलना में मेमोरी मैप की गई फ़ाइलों तक पहुँचना तेज़ है। सबसे पहले, एक सिस्टम कॉल प्रोग्राम की स्थानीय मेमोरी में एक साधारण परिवर्तन की तुलना में धीमी परिमाण का आदेश है। दूसरे, अधिकांश ऑपरेटिंग सिस्टम में मैप किया गया मेमोरी रीजन वास्तव में कर्नेल का [[पेज कैश]] (फ़ाइल कैश) है, जिसका अर्थ है कि उपयोगकर्ता स्थान में कोई कॉपी बनाने की आवश्यकता नहीं है।
फ़ाइल मैपिंग का लाभ I/O प्रदर्शन को बढ़ा रहा है, खासकर जब बड़ी फ़ाइलों पर उपयोग किया जाता है। छोटी फाइलों के लिए, मेमोरी-मैप्ड फाइलों के परिणामस्वरूप [[ सुस्त जगह | ढीला स्थान]] व्यर्थ हो सकती है |<ref>{{Cite web |url=http://www.devshed.com/c/a/BrainDump/Using-mmap-for-Advanced-File-IO/ |title=Using mmap() for Advanced File I/O - BrainDump |access-date=21 May 2011 |archive-url=https://web.archive.org/web/20110807115939/http://www.devshed.com/c/a/BrainDump/Using-mmap-for-Advanced-File-IO/ |archive-date=7 August 2011 |url-status=dead }}</ref> चूंकि स्मृति मानचित्र सदैव [[पृष्ठ आकार]] के अनुरूप होते हैं, जो अधिकतर 4 KiB होता है। इसलिए, एक 5 KiB फ़ाइल 8 KiB आवंटित करेगी और इस प्रकार 3 KiB व्यर्थ हो जाएगी। दो कारणों से सीधे पढ़ने और लिखने के संचालन की तुलना में मेमोरी मैप की गई फ़ाइलों तक पहुँचना तेज़ है। सबसे पहले, एक प्रणाली कॉल प्रोग्राम की स्थानीय मेमोरी में एक साधारण परिवर्तन की तुलना में धीमी परिमाण का आदेश है। दूसरे, अधिकांश संचालन प्रणाली में मैप किया गया मेमोरी रीजन वास्तव में कर्नेल का [[पेज कैश]] (फ़ाइल कैश) है, जिसका अर्थ है कि उपयोगकर्ता स्थान में कोई कॉपी बनाने की आवश्यकता नहीं है।


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


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


मेमोरी मैपिंग प्रक्रिया को वर्चुअल मेमोरी द्वारा नियंत्रित किया जाता है, जो [[ पेज फ़ाइल ]] से निपटने के लिए जिम्मेदार एक ही सबसिस्टम है। मेमोरी मैप की गई फ़ाइलें एक समय में एक संपूर्ण [[ स्मृति पृष्ठ ]] मेमोरी में लोड की जाती हैं। अधिकतम प्रदर्शन के लिए ऑपरेटिंग सिस्टम द्वारा पृष्ठ आकार का चयन किया जाता है। चूंकि पृष्ठ फ़ाइल प्रबंधन वर्चुअल मेमोरी सिस्टम के सबसे महत्वपूर्ण तत्वों में से एक है, फ़ाइल के पृष्ठ आकार के अनुभागों को भौतिक मेमोरी में लोड करना आमतौर पर एक बहुत ही उच्च अनुकूलित सिस्टम फ़ंक्शन है।<ref>[http://msdn.microsoft.com/en-us/library/ms810613.aspx , "What Do Memory-Mapped Files Have to Offer?".]</ref>
मेमोरी मैपिंग प्रक्रिया को वर्चुअल मेमोरी द्वारा नियंत्रित किया जाता है, जो [[ पेज फ़ाइल ]] से निपटने के लिए उत्तरदायी एक ही सबप्रणाली है। मेमोरी मैप की गई फ़ाइलें एक समय में एक संपूर्ण [[ स्मृति पृष्ठ ]] मेमोरी में लोड की जाती हैं। अधिकतम प्रदर्शन के लिए संचालन प्रणाली द्वारा पृष्ठ आकार का चयन किया जाता है। चूंकि पृष्ठ फ़ाइल प्रबंधन वर्चुअल मेमोरी प्रणाली के सबसे महत्वपूर्ण तत्वों में से एक है, फ़ाइल के पृष्ठ आकार के अनुभागों को भौतिक मेमोरी में लोड करना सामान्यतः एक अधिक ही उच्च अनुकूलित प्रणाली कार्य है।<ref>[http://msdn.microsoft.com/en-us/library/ms810613.aspx , "What Do Memory-Mapped Files Have to Offer?".]</ref>




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


=== बने रहे ===
=== स्थायी ===
स्थायी फ़ाइलें डिस्क पर स्रोत फ़ाइल से संबद्ध होती हैं। अंतिम प्रक्रिया समाप्त होने के बाद डेटा डिस्क पर स्रोत फ़ाइल में सहेजा जाता है। ये मेमोरी-मैप्ड फ़ाइलें अत्यधिक बड़ी स्रोत फ़ाइलों के साथ काम करने के लिए उपयुक्त हैं।<ref name="मेमोरी-मैप्ड फ़ाइलें">{{cite web|url=https://msdn.microsoft.com/en-us/library/dd997372.aspx|website=Microsoft Developer Network|title=मेमोरी-मैप्ड फ़ाइलें|access-date=4 January 2016}}</ref>
स्थायी फ़ाइलें डिस्क पर स्रोत फ़ाइल से संबद्ध होती हैं। अंतिम प्रक्रिया समाप्त होने के बाद डेटा डिस्क पर स्रोत फ़ाइल में सहेजा जाता है। ये मेमोरी-मैप्ड फ़ाइलें अत्यधिक बड़ी स्रोत फ़ाइलों के साथ काम करने के लिए उपयुक्त हैं।<ref name="मेमोरी-मैप्ड फ़ाइलें">{{cite web|url=https://msdn.microsoft.com/en-us/library/dd997372.aspx|website=Microsoft Developer Network|title=मेमोरी-मैप्ड फ़ाइलें|access-date=4 January 2016}}</ref>


Line 55: Line 53:


== कमियां ==
== कमियां ==
मेमोरी मैप की गई फ़ाइल I/O चुनने का प्रमुख कारण प्रदर्शन है। फिर भी, ट्रेडऑफ़ हो सकते हैं। सिस्टम कॉल ओवरहेड और मेमोरी कॉपी करने के कारण मानक I/O दृष्टिकोण महंगा है। मेमोरी-मैप्ड एप्रोच की पेज फॉल्ट # माइनर्स में इसकी लागत होती है - जब पेज कैश में डेटा का एक ब्लॉक लोड होता है, लेकिन अभी तक प्रक्रिया के वर्चुअल मेमोरी स्पेस में मैप नहीं किया जाता है। कुछ परिस्थितियों में, मेमोरी मैप की गई फ़ाइल I/O मानक फ़ाइल I/O की तुलना में काफी धीमी हो सकती है।<ref>http://lists.freebsd.org/pipermail/freebsd-questions/2004-June/050371.html, read vs. mmap (or io vs. page faults) by [[Matthew Dillon (computer scientist)|Matthew Dillon]]</ref>
मेमोरी मैप की गई फ़ाइल I/O चुनने का प्रमुख कारण प्रदर्शन है। फिर भी, ट्रेडऑफ़ हो सकते हैं। प्रणाली कॉल ओवरहेड और मेमोरी कॉपी करने के कारण मानक I/O दृष्टिकोण महंगा है। मेमोरी-मैप्ड एप्रोच की पेज फॉल्ट माइनर्स में इसका निवेश होता है - जब पेज कैश में डेटा का एक ब्लॉक लोड होता है, किंतु अभी तक प्रक्रिया के वर्चुअल मेमोरी स्पेस में मैप नहीं किया जाता है। कुछ परिस्थितियों में, मेमोरी मैप की गई फ़ाइल I/O मानक फ़ाइल I/O की तुलना में अधिक धीमी हो सकती है।<ref>http://lists.freebsd.org/pipermail/freebsd-questions/2004-June/050371.html, read vs. mmap (or io vs. page faults) by [[Matthew Dillon (computer scientist)|Matthew Dillon]]</ref>
मेमोरी-मैप्ड फ़ाइलों की एक और कमी किसी दिए गए आर्किटेक्चर के [[ स्मृति पता ]] से संबंधित है: एड्रेसेबल स्पेस से बड़ी फाइल में एक समय में केवल मैप किए गए हिस्से हो सकते हैं, इसे पढ़ने में कठिनाई होती है। उदाहरण के लिए, एक [[32-बिट]] आर्किटेक्चर जैसे इंटेल का [[IA-32]] केवल सीधे 4 [[GiB]] या फाइलों के छोटे हिस्से को संबोधित कर सकता है। ऑपरेटिंग सिस्टम कर्नेल के आधार पर, विशेष रूप से 2 से 3 GiB की सीमा में अलग-अलग कार्यक्रमों के लिए पता योग्य स्थान की एक छोटी मात्रा उपलब्ध है। हालांकि यह दोष आधुनिक [[64-बिट]] आर्किटेक्चर पर लगभग समाप्त हो गया है।
 
मेमोरी-मैप्ड फ़ाइलों की एक और कमी किसी दिए गए आर्किटेक्चर के [[ स्मृति पता | स्मृति पता]] से संबंधित है: एड्रेसेबल स्पेस से बड़ी फाइल में एक समय में केवल मैप किए गए भाग हो सकते हैं, इसे पढ़ने में कठिनाई होती है। उदाहरण के लिए, एक [[32-बिट]] आर्किटेक्चर जैसे इंटेल का [[IA-32]] केवल सीधे 4 [[GiB]] या फाइलों के छोटे भाग को संबोधित कर सकता है। संचालन प्रणाली कर्नेल के आधार पर, विशेष रूप से 2 से 3 GiB की सीमा में अलग-अलग कार्यक्रमों के लिए पता योग्य स्थान की एक छोटी मात्रा उपलब्ध है। चूंकि यह दोष आधुनिक [[64-बिट]] आर्किटेक्चर पर लगभग समाप्त हो गया है।
 
फ़ाइल I/O के मानक साधनों की तुलना में एमएमएपी भी कम स्केलेबल होता है, क्योंकि लिनक्स समेत कई ऑपरेटिंग प्रणालियों में पेज दोषों को संभालने वाले कोर की संख्या पर कैप है। अत्यधिक तेज़ उपकरण, जैसे आधुनिक एनवीएम एक्सप्रेस एसएसडी, ओवरहेड को एक वास्तविक चिंता का विषय बनाने में सक्षम हैं।<ref>{{cite conference |last1=Papagiannis |first1=Anastasios |last2=Xanthakis |first2=Giorgos |last3=Saloustros |first3=Giorgos |last4=Marazakis |first4=Manolis |last5=Bilas |first5=Angelos |title=Optimizing Memory-mapped I/O for Fast Storage Devices |url=https://www.usenix.org/conference/atc20/presentation/papagiannis|conference=USENIX ATC '20 |pages=813–827 |language=en |date=2020}}</ref>


फ़ाइल I/O के मानक साधनों की तुलना में एमएमएपी भी कम स्केलेबल होता है, क्योंकि लिनक्स समेत कई ऑपरेटिंग सिस्टमों में पेज दोषों को संभालने वाले कोर की संख्या पर कैप है। अत्यधिक तेज़ उपकरण, जैसे आधुनिक NVM एक्सप्रेस SSDs, ओवरहेड को एक वास्तविक चिंता का विषय बनाने में सक्षम हैं।<ref>{{cite conference |last1=Papagiannis |first1=Anastasios |last2=Xanthakis |first2=Giorgos |last3=Saloustros |first3=Giorgos |last4=Marazakis |first4=Manolis |last5=Bilas |first5=Angelos |title=Optimizing Memory-mapped I/O for Fast Storage Devices |url=https://www.usenix.org/conference/atc20/presentation/papagiannis|conference=USENIX ATC '20 |pages=813–827 |language=en |date=2020}}</ref>
अंतर्निहित फ़ाइल पर I/O त्रुटियां (उदाहरण के लिए इसकी हटाने योग्य ड्राइव अनप्लग है या ऑप्टिकल मीडिया को बाहर निकाल दिया गया है, लिखते समय डिस्क पूर्ण है, आदि) इसकी मैप की गई मेमोरी तक पहुंचने के समय पॉज़िक्स पर सिगसेजीवी/सिगबस सिग्नल के रूप में अनुप्रयोग को सूचित किया जाता है, और विंडोज़ पर पृष्ठ त्रुटि में संरचित अपवाद निष्पादित करें । इन त्रुटियों को संभालने के लिए मैप की गई मेमोरी तक पहुँचने वाले सभी कोड तैयार होने चाहिए, जो सामान्यतः मेमोरी एक्सेस करते समय नहीं होते हैं।
अंतर्निहित फ़ाइल पर I/O त्रुटियां (उदाहरण के लिए इसकी हटाने योग्य ड्राइव अनप्लग है या ऑप्टिकल मीडिया को बाहर निकाल दिया गया है, लिखते समय डिस्क पूर्ण है, आदि) इसकी मैप की गई मेमोरी तक पहुंचने के दौरान POSIX पर SIGSEGV/SIGBUS सिग्नल के रूप में एप्लिकेशन को रिपोर्ट किया जाता है, और विंडोज़ पर EXECUTE_IN_PAGE_ERROR संरचित अपवाद। इन त्रुटियों को संभालने के लिए मैप की गई मेमोरी तक पहुँचने वाले सभी कोड तैयार होने चाहिए, जो आमतौर पर मेमोरी एक्सेस करते समय नहीं होते हैं।


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


== सामान्य उपयोग ==
== सामान्य उपयोग ==
मेमोरी-मैप्ड फ़ाइल के लिए शायद सबसे आम उपयोग अधिकांश आधुनिक ऑपरेटिंग सिस्टम ([[ माइक्रोसॉफ़्ट विंडोज़ ]] और यूनिक्स जैसी सिस्टम सहित) में [[लोडर (कंप्यूटिंग)]] है। जब कोई [[प्रक्रिया (कंप्यूटिंग)]] शुरू की जाती है, तो ऑपरेटिंग सिस्टम मेमोरी मैप की गई फ़ाइल का उपयोग करता है निष्पादन के लिए मेमोरी में किसी भी लोड करने योग्य मॉड्यूल के साथ निष्पादन योग्य फ़ाइल लाने के लिए। अधिकांश मेमोरी-मैपिंग सिस्टम डिमांड पेजिंग नामक एक तकनीक का उपयोग करते हैं, जहां फ़ाइल को सबसेट (एक पेज प्रत्येक) में भौतिक मेमोरी में लोड किया जाता है, और केवल जब वह पेज वास्तव में संदर्भित होता है।<ref>[http://www.linux-tutorial.info/?page_id=453, "Demand Paging"]</ref> निष्पादन योग्य फ़ाइलों के विशिष्ट मामले में, यह OS को प्रक्रिया छवि के केवल उन हिस्सों को चुनिंदा रूप से लोड करने की अनुमति देता है जिन्हें वास्तव में निष्पादित करने की आवश्यकता होती है।
मेमोरी-मैप्ड फ़ाइल के लिए शायद सबसे आम उपयोग अधिकांश आधुनिक संचालन प्रणाली ([[ माइक्रोसॉफ़्ट विंडोज़ ]] और यूनिक्स जैसी प्रणाली सहित) में [[लोडर (कंप्यूटिंग)]] है। जब कोई [[प्रक्रिया (कंप्यूटिंग)]] शुरू की जाती है, तो संचालन प्रणाली मेमोरी मैप की गई फ़ाइल का उपयोग करता है निष्पादन के लिए मेमोरी में किसी भी लोड करने योग्य मॉड्यूल के साथ निष्पादन योग्य फ़ाइल लाने के लिए। अधिकांश मेमोरी-मैपिंग प्रणाली डिमांड पेजिंग नामक एक तकनीक का उपयोग करते हैं, जहां फ़ाइल को सबसेट (एक पेज प्रत्येक) में भौतिक मेमोरी में लोड किया जाता है, और केवल जब वह पेज वास्तव में संदर्भित होता है।<ref>[http://www.linux-tutorial.info/?page_id=453, "Demand Paging"]</ref> निष्पादन योग्य फ़ाइलों के विशिष्ट मामले में, यह OS को प्रक्रिया छवि के केवल उन हिस्सों को चुनिंदा रूप से लोड करने की अनुमति देता है जिन्हें वास्तव में निष्पादित करने की आवश्यकता होती है।


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


== मंच समर्थन ==
== मंच समर्थन ==
अधिकांश आधुनिक ऑपरेटिंग सिस्टम या रनटाइम वातावरण किसी प्रकार की मेमोरी-मैप्ड फ़ाइल एक्सेस का समर्थन करते हैं। कार्यक्रम {{mono|[[mmap]]()}},<ref>[http://www.ecst.csuchico.edu/~beej/guide/ipc/mmap.html Memory Mapped Files<!-- Bot generated title -->] {{webarchive |url=https://web.archive.org/web/20070209012757/http://www.ecst.csuchico.edu/~beej/guide/ipc/mmap.html |date=9 February 2007 }}</ref> जो फ़ाइल डिस्क्रिप्टर दिए गए फ़ाइल का मैपिंग बनाता है, फ़ाइल में स्थान शुरू करता है, और लंबाई, POSIX विनिर्देश का हिस्सा है, इसलिए यूनिक्स, [[लिनक्स]], [[ Mac OS X ]] जैसे [[पॉज़िक्स]]-अनुपालन प्रणालियों की विस्तृत विविधता<ref>[https://www.apple.com/macosx/technology/unix.html Apple – Mac OS X Leopard – Technology – UNIX<!-- Bot generated title -->] {{webarchive|url=https://web.archive.org/web/20090423231611/http://www.apple.com/macosx/technology/unix.html |date=23 April 2009 }}</ref> या [[OpenVMS]], मेमोरी मैपिंग फ़ाइलों के लिए एक सामान्य तंत्र का समर्थन करता है। Microsoft Windows ऑपरेटिंग सिस्टम इस उद्देश्य के लिए [[API]] फ़ंक्शंस के एक समूह का भी समर्थन करता है, जैसे {{mono|CreateFileMapping()}}.<ref>[http://msdn2.microsoft.com/en-us/library/aa366537.aspx CreateFileMapping Function (Windows)<!-- Bot generated title -->]</ref>
अधिकांश आधुनिक संचालन प्रणाली या रनटाइम वातावरण किसी प्रकार की मेमोरी-मैप्ड फ़ाइल एक्सेस का समर्थन करते हैं। कार्यक्रम {{mono|[[mmap]]()}},<ref>[http://www.ecst.csuchico.edu/~beej/guide/ipc/mmap.html Memory Mapped Files<!-- Bot generated title -->] {{webarchive |url=https://web.archive.org/web/20070209012757/http://www.ecst.csuchico.edu/~beej/guide/ipc/mmap.html |date=9 February 2007 }}</ref> जो फ़ाइल डिस्क्रिप्टर दिए गए फ़ाइल का मैपिंग बनाता है, फ़ाइल में स्थान शुरू करता है, और लंबाई, पॉज़िक्स विनिर्देश का हिस्सा है, इसलिए यूनिक्स, [[लिनक्स]], [[ Mac OS X ]] जैसे [[पॉज़िक्स]]-अनुपालन प्रणालियों की विस्तृत विविधता<ref>[https://www.apple.com/macosx/technology/unix.html Apple – Mac OS X Leopard – Technology – UNIX<!-- Bot generated title -->] {{webarchive|url=https://web.archive.org/web/20090423231611/http://www.apple.com/macosx/technology/unix.html |date=23 April 2009 }}</ref> या [[OpenVMS]], मेमोरी मैपिंग फ़ाइलों के लिए एक सामान्य तंत्र का समर्थन करता है। Microsoft Windows संचालन प्रणाली इस उद्देश्य के लिए [[API]] फ़ंक्शंस के एक समूह का भी समर्थन करता है, जैसे {{mono|CreateFileMapping()}}.<ref>[http://msdn2.microsoft.com/en-us/library/aa366537.aspx CreateFileMapping Function (Windows)<!-- Bot generated title -->]</ref>
Microsoft Windows और POSIX- संगत प्लेटफ़ॉर्म के लिए मेमोरी-मैप की गई फ़ाइलों के कुछ मुफ़्त पोर्टेबल कार्यान्वयन हैं:
Microsoft Windows और पॉज़िक्स- संगत प्लेटफ़ॉर्म के लिए मेमोरी-मैप की गई फ़ाइलों के कुछ मुफ़्त पोर्टेबल कार्यान्वयन हैं:
* बूस्ट.इंटरप्रोसेस,<ref>{{cite web|url=http://www.boost.org/doc/libs/release/doc/html/interprocess/sharedmemorybetweenprocesses.html#interprocess.sharedmemorybetweenprocesses.mapped_file |title=Sharing memory between processes: Memory Mapped Files |publisher=Boost.org}}</ref> बूस्ट सी ++ पुस्तकालयों में
* बूस्ट.इंटरप्रोसेस,<ref>{{cite web|url=http://www.boost.org/doc/libs/release/doc/html/interprocess/sharedmemorybetweenprocesses.html#interprocess.sharedmemorybetweenprocesses.mapped_file |title=Sharing memory between processes: Memory Mapped Files |publisher=Boost.org}}</ref> बूस्ट सी ++ पुस्तकालयों में
* बूस्ट.आईओस्ट्रीम,<ref>{{cite web|url=http://www.boost.org/doc/libs/release/libs/iostreams/doc/classes/mapped_file.html |title=मेमोरी-मैप्ड फ़ाइलें|publisher=Boost.org}}</ref> बूस्ट सी ++ लाइब्रेरी में भी
* बूस्ट.आईओस्ट्रीम,<ref>{{cite web|url=http://www.boost.org/doc/libs/release/libs/iostreams/doc/classes/mapped_file.html |title=मेमोरी-मैप्ड फ़ाइलें|publisher=Boost.org}}</ref> बूस्ट सी ++ लाइब्रेरी में भी
Line 83: Line 83:


[[पर्ल]] के लिए [[सीपीएएन]] पर मेमोरी मैपिंग फाइलों के लिए कई मॉड्यूल उपलब्ध हैं, जैसे {{mono|Sys::Mmap}}<ref name="sys-mmap-cpan-module">{{cite web|title=Sys::Mmap Perl Module|url=https://metacpan.org/module/Sys::Mmap}}</ref> और {{mono|File::Map}}.<ref name="file-map-cpan-module">{{cite web|title=File::Map Perl Module|url=https://metacpan.org/module/File::Map}}</ref>
[[पर्ल]] के लिए [[सीपीएएन]] पर मेमोरी मैपिंग फाइलों के लिए कई मॉड्यूल उपलब्ध हैं, जैसे {{mono|Sys::Mmap}}<ref name="sys-mmap-cpan-module">{{cite web|title=Sys::Mmap Perl Module|url=https://metacpan.org/module/Sys::Mmap}}</ref> और {{mono|File::Map}}.<ref name="file-map-cpan-module">{{cite web|title=File::Map Perl Module|url=https://metacpan.org/module/File::Map}}</ref>
Microsoft .NET रनटाइम में, [[Windows API]] के माध्यम से सीधे मेमोरी मैप की गई फ़ाइलों का उपयोग करने के लिए P/Invoke का उपयोग किया जा सकता है। मेमोरी मैप की गई फ़ाइलों के लिए प्रबंधित पहुँच (P/Invoke आवश्यक नहीं) को रनटाइम के संस्करण 4 में पेश किया गया था (देखें [http://msdn.microsoft.com/en-us/library/dd997372(v=VS.100).aspx मेमोरी-मैप्ड फ़ाइलें])। पिछले संस्करणों के लिए, तीसरे पक्ष के पुस्तकालय हैं जो प्रबंधित एपीआई प्रदान करते हैं।<ref>[http://winterdom.com/dev/net DotNet<!-- Bot generated title -->] {{webarchive|url=https://web.archive.org/web/20100419135457/http://winterdom.com/dev/net |date=19 April 2010 }}</ref>
Microsoft .NET रनटाइम में, [[Windows API]] के माध्यम से सीधे मेमोरी मैप की गई फ़ाइलों का उपयोग करने के लिए P/Invoke का उपयोग किया जा सकता है। मेमोरी मैप की गई फ़ाइलों के लिए प्रबंधित पहुँच (P/Invoke आवश्यक नहीं) को रनटाइम के संस्करण 4 में प्रस्तुत किया गया था (देखें [http://msdn.microsoft.com/en-us/library/dd997372(v=VS.100).aspx मेमोरी-मैप्ड फ़ाइलें])। पिछले संस्करणों के लिए, तीसरे पक्ष के पुस्तकालय हैं जो प्रबंधित एपीआई प्रदान करते हैं।<ref>[http://winterdom.com/dev/net DotNet<!-- Bot generated title -->] {{webarchive|url=https://web.archive.org/web/20100419135457/http://winterdom.com/dev/net |date=19 April 2010 }}</ref>
PHP ने फ़ाइल_get_contents() जैसे कई मूल फ़ाइल एक्सेस फ़ंक्शंस में मेमोरी-मैपिंग तकनीकों का समर्थन किया है, लेकिन इसे 5.3 में हटा दिया है (देखें [http://svn.php.net/viewvc?view=revision&revision=255970 संशोधन लॉग])।
PHP ने फ़ाइल_get_contents() जैसे कई मूल फ़ाइल एक्सेस फ़ंक्शंस में मेमोरी-मैपिंग तकनीकों का समर्थन किया है, किंतु इसे 5.3 में हटा दिया है (देखें [http://svn.php.net/viewvc?view=revision&revision=255970 संशोधन लॉग])।


[[आर प्रोग्रामिंग भाषा]] के लिए सीआरएएन पर एक पुस्तकालय मौजूद है जिसे [https://cran.r-project.org/web/packages/bigmemory/index.html bigmemory] कहा जाता है जो बूस्ट लाइब्रेरी का उपयोग करता है और मेमोरी-मैप्ड समर्थित सरणियाँ सीधे प्रदान करता है R. पैकेज [https://cran.r-project.org/web/packages/ff/index.html ff] मेमोरी-मैप्ड वैक्टर, मैट्रिसेस, एरेज़ और डेटा फ़्रेम प्रदान करता है।
[[आर प्रोग्रामिंग भाषा]] के लिए सीआरएएन पर एक पुस्तकालय उपस्थित है जिसे [https://cran.r-project.org/web/packages/bigmemory/index.html bigmemory] कहा जाता है जो बूस्ट लाइब्रेरी का उपयोग करता है और मेमोरी-मैप्ड समर्थित सरणियाँ सीधे प्रदान करता है R. पैकेज [https://cran.r-project.org/web/packages/ff/index.html ff] मेमोरी-मैप्ड वैक्टर, मैट्रिसेस, एरेज़ और डेटा फ़्रेम प्रदान करता है।


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

Revision as of 15:50, 28 April 2023

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

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

इतिहास

टॉप्स-20 पीएमएपी

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


सनोस 4 एमएमएपी

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


विंडोज ग्रोएबल मेमोरी-मैप्ड फाइल्स (जीएमएमएफ)

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

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

लाभ

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

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

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

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


प्रकार

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

स्थायी

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


गैर-स्थायी

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


कमियां

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

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

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

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

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

सामान्य उपयोग

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

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

मंच समर्थन

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

  • बूस्ट.इंटरप्रोसेस,[17] बूस्ट सी ++ पुस्तकालयों में
  • बूस्ट.आईओस्ट्रीम,[18] बूस्ट सी ++ लाइब्रेरी में भी
  • एफएमस्ट्रीम[19]
  • सीपीपी-एमएमएफ[20]

जावा (प्रोग्रामिंग भाषा) मेमोरी मैप की गई फ़ाइलों तक पहुँचने के लिए कक्षाएं और विधियाँ प्रदान करता है, जैसे FileChannel.

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

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

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

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

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

संदर्भ

  1. 1.0 1.1 Chris Siebenmann (7 June 2018). "The history of Unix's confusing set of low-level ways to allocate memory".
  2. 2.0 2.1 Cite error: Invalid <ref> tag; no text was provided for refs named Memory-Mapped Files
  3. Development began 1969, shipped 1976
  4. "TOPS-20 Monitor Calls Reference Manual" (PDF).
  5. "System 1022 Database System". We had a PMAP cache for file I/O(like PA1050) in extended sections.
  6. Dec. 1988
  7. Jeffrey Richter (October 1995). "Add Growable Memory-Mapped Files to your App". Microsoft Systems Journal. pp. 17–28.
  8. "Using mmap() for Advanced File I/O - BrainDump". Archived from the original on 7 August 2011. Retrieved 21 May 2011.
  9. , "What Do Memory-Mapped Files Have to Offer?".
  10. "मेमोरी-मैप्ड फ़ाइलें". Microsoft Developer Network. Retrieved 4 January 2016.
  11. http://lists.freebsd.org/pipermail/freebsd-questions/2004-June/050371.html, read vs. mmap (or io vs. page faults) by Matthew Dillon
  12. Papagiannis, Anastasios; Xanthakis, Giorgos; Saloustros, Giorgos; Marazakis, Manolis; Bilas, Angelos (2020). Optimizing Memory-mapped I/O for Fast Storage Devices. USENIX ATC '20 (in English). pp. 813–827.
  13. "Demand Paging"
  14. Memory Mapped Files Archived 9 February 2007 at the Wayback Machine
  15. Apple – Mac OS X Leopard – Technology – UNIX Archived 23 April 2009 at the Wayback Machine
  16. CreateFileMapping Function (Windows)
  17. "Sharing memory between processes: Memory Mapped Files". Boost.org.
  18. "मेमोरी-मैप्ड फ़ाइलें". Boost.org.
  19. "Windows और POSIX सिस्टम के लिए मेमोरी मैप की गई फ़ाइलें". SourceForge.
  20. "सीपीपी-एमएमएफ". GitHub.
  21. "std.mmfile - डी प्रोग्रामिंग लैंग्वेज". Digital Mars. Retrieved 4 December 2011.
  22. "New Modules in 1.6". Archived from the original on 30 December 2006. Retrieved 23 December 2008.
  23. "Sys::Mmap Perl Module".
  24. "File::Map Perl Module".
  25. DotNet Archived 19 April 2010 at the Wayback Machine