ملف مُرتبط بالذاكرة
الملف المُرتبط بالذاكرة هو جزء من الذاكرة الافتراضية [ 1 ] مُرتبط ارتباطًا مباشرًا بايتًا بجزء من ملف أو مورد شبيه بالملف. عادةً ما يكون هذا المورد ملفًا موجودًا فعليًا على القرص، ولكنه قد يكون أيضًا جهازًا أو كائن ذاكرة مشتركة أو موردًا آخر يمكن لنظام التشغيل الإشارة إليه من خلال مُعرِّف الملف . بمجرد وجوده، يسمح هذا الارتباط بين الملف ومساحة الذاكرة للتطبيقات بالتعامل مع الجزء المُرتبط كما لو كان ذاكرة أساسية.
تاريخ
أفضل 20 خريطة أداء
كان أحد التطبيقات المبكرة ( حوالي عام 1969 ) [ 2 ] لهذا هو استدعاء نظام PMAP في نظام التشغيل TOPS-20 الخاص بجهاز DEC-20 ، [ 3 ] وهي ميزة يستخدمها نظام قاعدة البيانات System-1022 التابع لشركة Software House . [ 4 ]
SunOS 4 mmap
قدم نظام التشغيل SunOS 4 [ 5 ] ميزة Unixmmap التي سمحت للبرامج "بربط الملفات بالذاكرة". [ 1 ]
ملفات الذاكرة القابلة للتوسيع في نظام التشغيل ويندوز (GMMF)
بعد عقدين من إصدار PMAP الخاص بـ TOPS-20، تم تزويد نظام التشغيل Windows NT بملفات الذاكرة القابلة للتوسيع (GMMF).
بما أن " CreateFileMappingالدالة تتطلب تمرير حجم لها" ولا يمكن تعديل حجم الملف بسهولة، فقد تم تطوير واجهة برمجة تطبيقات GMMF. [ 6 ] [ 7 ] يتطلب استخدام GMMF تحديد الحد الأقصى لحجم الملف، ولكن لا يتم إهدار أي مساحة غير مستخدمة.
فوائد
تتمثل فائدة ربط الملفات بالذاكرة في تحسين أداء الإدخال/الإخراج، خاصةً عند استخدامها مع الملفات الكبيرة. أما بالنسبة للملفات الصغيرة، فقد يؤدي ربط الملفات بالذاكرة إلى هدر مساحة غير مستخدمة [ 8 ] ، حيث تتم محاذاة خرائط الذاكرة دائمًا مع حجم الصفحة، والذي يبلغ غالبًا 4 كيلوبايت. وبالتالي، سيخصص ملف بحجم 5 كيلوبايت مساحة 8 كيلوبايت، مما يعني هدر 3 كيلوبايت. يُعد الوصول إلى الملفات المربوطة بالذاكرة أسرع من استخدام عمليات القراءة والكتابة المباشرة لسببين: أولًا، يُعد استدعاء النظام أبطأ بكثير من مجرد تغيير بسيط في الذاكرة المحلية للبرنامج. ثانيًا، في معظم أنظمة التشغيل، تكون منطقة الذاكرة المربوطة هي في الواقع ذاكرة التخزين المؤقت للصفحات (ذاكرة التخزين المؤقت للملفات) الخاصة بالنواة ، مما يعني عدم الحاجة إلى إنشاء نسخ في مساحة المستخدم.
تُحقق بعض عمليات الملفات المُخزّنة في الذاكرة على مستوى التطبيق أداءً أفضل من نظيراتها في الملفات الفعلية. إذ يُمكن للتطبيقات الوصول إلى البيانات وتحديثها في الملف مباشرةً وفي مكانها، بدلاً من البحث من بداية الملف أو إعادة كتابة المحتوى المُعدّل بالكامل إلى موقع مؤقت. ولأن الملف المُخزّن في الذاكرة يُعالج داخليًا على شكل صفحات، فإن الوصول الخطي إلى الملف (كما هو الحال في تخزين البيانات في الملفات المسطحة أو ملفات التكوين) لا يتطلب الوصول إلى القرص إلا عند عبور حدود صفحة جديدة، ويمكنه كتابة أجزاء أكبر من الملف إلى القرص في عملية واحدة.
من الفوائد المحتملة للملفات المُرتبطة بالذاكرة " التحميل الكسول "، مما يسمح باستخدام كميات قليلة من ذاكرة الوصول العشوائي (RAM) حتى مع الملفات الكبيرة جدًا. محاولة تحميل كامل محتوى ملف أكبر بكثير من حجم الذاكرة المتاحة قد تُسبب إجهادًا شديدًا للنظام، حيث يقرأ النظام من القرص إلى الذاكرة ويكتب في الوقت نفسه صفحات من الذاكرة إلى القرص. لا يقتصر دور ربط الذاكرة على تجاوز ملف الترحيل تمامًا، بل يسمح أيضًا بتحميل أجزاء أصغر بحجم الصفحة أثناء تحرير البيانات، على غرار الترحيل عند الطلب المستخدم في البرامج.
تتولى إدارة الذاكرة الافتراضية عملية ربط الملفات بالذاكرة ، وهي نفس النظام الفرعي المسؤول عن إدارة ملف الترحيل . تُحمّل الملفات المربوطة بالذاكرة صفحةً صفحةً . ويختار نظام التشغيل حجم الصفحة لتحقيق أقصى أداء. ونظرًا لأن إدارة ملف الترحيل تُعدّ من أهم عناصر نظام الذاكرة الافتراضية، فإن تحميل أجزاء من الملف بحجم صفحة إلى الذاكرة الفعلية يُعتبر عادةً وظيفة نظام مُحسّنة للغاية. [ 9 ]
الأنواع
يوجد نوعان من الملفات المُرتبطة بالذاكرة:
استمر
ترتبط الملفات المُخزَّنة بملف مصدر على القرص. تُحفظ البيانات في ملف المصدر على القرص بمجرد انتهاء آخر عملية. تُعدّ هذه الملفات المُخزَّنة في الذاكرة مناسبة للعمل مع ملفات مصدر كبيرة جدًا. [ 10 ]
غير مستمر
لا ترتبط الملفات غير المُخزَّنة بملف على القرص. عند انتهاء آخر عملية من التعامل مع الملف، تُفقد البيانات. تُعدّ هذه الملفات مناسبة لإنشاء ذاكرة مشتركة للاتصالات بين العمليات (IPC). [ 10 ]
العيوب
السبب الرئيسي لاختيار إدخال/إخراج الملفات المُرتبط بالذاكرة هو الأداء. مع ذلك، قد توجد بعض المفاضلات. فأسلوب الإدخال/الإخراج القياسي مُكلف بسبب تكلفة استدعاءات النظام ونسخ الذاكرة. أما أسلوب الإدخال/الإخراج المُرتبط بالذاكرة فيُعاني من أخطاء الصفحات البسيطة - عندما يتم تحميل كتلة من البيانات في ذاكرة التخزين المؤقت للصفحات ، ولكن لم يتم ربطها بعد بمساحة الذاكرة الافتراضية للعملية. في بعض الحالات، قد يكون إدخال/إخراج الملفات المُرتبط بالذاكرة أبطأ بكثير من إدخال/إخراج الملفات القياسي. [ 11 ]
من عيوب الملفات المُرتبطة بالذاكرة الأخرى محدودية مساحة العناوين المتاحة في بنية المعالج : فالملفات الأكبر من مساحة العناوين المتاحة لا يمكن الوصول إليها إلا جزئيًا في كل مرة، مما يُعقّد عملية قراءتها. على سبيل المثال، لا تستطيع بنية 32 بت ، مثل Intel IA-32، الوصول المباشر إلا إلى أجزاء من الملفات لا تتجاوز 4 جيجابايت . كما أن مساحة العناوين المتاحة للبرامج الفردية أقل من ذلك بكثير، وتتراوح عادةً بين 2 و3 جيجابايت، وذلك بحسب نواة نظام التشغيل. إلا أن هذا العيب يكاد يكون معدومًا في بنية 64 بت الحديثة .
كما أن تقنية mmap تميل إلى أن تكون أقل قابلية للتوسع من الوسائل القياسية لإدخال/إخراج الملفات، نظرًا لأن العديد من أنظمة التشغيل، بما في ذلك لينكس، تفرض حدًا أقصى على عدد النوى التي تعالج أخطاء الصفحات. ويمكن للأجهزة فائقة السرعة، مثل محركات أقراص الحالة الصلبة NVM Express الحديثة ، أن تجعل العبء الزائد مصدر قلق حقيقي. [ 12 ]
تُبلغ التطبيقات بأخطاء الإدخال/الإخراج التي تحدث في الملف الأساسي (مثل فصل محرك الأقراص القابل للإزالة أو إخراج الوسائط الضوئية، أو امتلاء القرص أثناء الكتابة، إلخ) أثناء الوصول إلى الذاكرة المخصصة له، وذلك عبر إشارات SIGSEGV/SIGBUS في نظام POSIX، والاستثناء المُهيكل EXECUTE_IN_PAGE_ERROR في نظام Windows. يجب أن يكون كل كود يصل إلى الذاكرة المخصصة مُهيأً للتعامل مع هذه الأخطاء، التي لا تحدث عادةً عند الوصول إلى الذاكرة.
لا تدعم الملفات المُرتبطة بالذاكرة إلا البنى البرمجية التي تحتوي على وحدة إدارة الذاكرة (MMU) . أما في البنى التي لا تحتوي على وحدة إدارة الذاكرة، فيمكن لنظام التشغيل نسخ الملف بأكمله إلى الذاكرة عند طلب ربطه بها، إلا أن هذه العملية مُهدرة للموارد وبطيئة للغاية إذا لم يتم الوصول إلا إلى جزء صغير من الملف، ولا تُجدي نفعًا إلا مع الملفات التي تتناسب مع الذاكرة المتاحة.
الاستخدامات الشائعة
لعلّ الاستخدام الأكثر شيوعًا للملفات المُرتبطة بالذاكرة هو مُحمِّل العمليات في معظم أنظمة التشغيل الحديثة (بما في ذلك أنظمة ويندوز والأنظمة الشبيهة بيونكس ). عند بدء تشغيل عملية ما ، يستخدم نظام التشغيل ملفًا مُرتبطًا بالذاكرة لجلب الملف التنفيذي، بالإضافة إلى أي وحدات قابلة للتحميل، إلى الذاكرة لتنفيذه. تستخدم معظم أنظمة ربط الذاكرة تقنية تُسمى الترحيل عند الطلب ، حيث يتم تحميل الملف إلى الذاكرة الفعلية على شكل أجزاء (صفحة واحدة لكل جزء)، وفقط عند الحاجة الفعلية إلى الوصول إلى تلك الصفحة. [ 13 ] في حالة الملفات التنفيذية تحديدًا، يسمح هذا لنظام التشغيل بتحميل أجزاء صورة العملية التي تحتاج إلى التنفيذ فقط.
من الاستخدامات الشائعة الأخرى للملفات المُرتبطة بالذاكرة مشاركة الذاكرة بين عدة عمليات. في أنظمة التشغيل الحديثة ذات الوضع المحمي ، لا يُسمح للعمليات عمومًا بالوصول إلى مساحة الذاكرة المُخصصة لعملية أخرى. (محاولة البرنامج القيام بذلك تُسبب أخطاء صفحات غير صالحة أو انتهاكات تجزئة ). تتوفر عدة تقنيات لمشاركة الذاكرة بأمان، وتُعد عمليات الإدخال/الإخراج للملفات المرتبطة بالذاكرة من أكثرها شيوعًا. يمكن لتطبيقين أو أكثر ربط ملف فعلي واحد بالذاكرة والوصول إليها في آنٍ واحد. على سبيل المثال، يوفر نظام التشغيل مايكروسوفت ويندوز آلية للتطبيقات لربط جزء مشترك من ملف صفحات النظام نفسه بالذاكرة ومشاركة البيانات عبر هذا الجزء.
دعم المنصة
تدعم معظم أنظمة التشغيل الحديثة أو بيئات التشغيل شكلاً من أشكال الوصول إلى الملفات المُرتبطة بالذاكرة. تُعدّ الدالة mmap () [ 14 ] ، التي تُنشئ ربطًا لملف بناءً على مُعرّف الملف وموقع البداية فيه وطوله، جزءًا من مواصفات POSIX ، لذا فإنّ مجموعة واسعة من الأنظمة المتوافقة مع POSIX، مثل UNIX و Linux و Mac OS X [ 15 ] و OpenVMS ، تدعم آلية مشتركة لربط الملفات بالذاكرة. كما تدعم أنظمة تشغيل Microsoft Windows مجموعة من دوال واجهة برمجة التطبيقات (API) لهذا الغرض، مثل CreateFileMapping() [ 16 ] .
بعض التطبيقات المحمولة المجانية للملفات المُرتبطة بالذاكرة لأنظمة التشغيل مايكروسوفت ويندوز والمنصات المتوافقة مع معيار POSIX هي:
- Boost.Interprocess، [ 17 ] في مكتبات Boost C++
- Boost.Iostreams، [ 18 ] موجودة أيضًا في مكتبات Boost C++
- Fmstream [ 19 ]
- Cpp-mmf [ 20 ]
توفر لغة برمجة جافا فئات وأساليب للوصول إلى الملفات المُرتبطة بالذاكرة، مثل FileChannel. علاوة على ذلك، تستخدم جافا أسلوب ربط الذاكرة لتحميل فئات محددة لتقليل وقت تحميل الفئات في آلة جافا الافتراضية (JVM) - مشاركة بيانات فئات جافا . [ 21 ]
تدعم لغة البرمجة D الملفات المُرتبطة بالذاكرة في مكتبتها القياسية (وحدة std.mmfile) . [ 22 ]
تحتوي لغة روبي على جوهرة (مكتبة) تسمى Mmap، والتي تنفذ كائنات الملفات المرتبطة بالذاكرة.
لا توفر لغة Rust أي وظائف mmap في المكتبة القياسية، ولكن توجد حزمة (مكتبة) تابعة لجهة خارجية تسمى memmap2. [ 23 ]
منذ الإصدار 1.6، أضافت لغة بايثون وحدة mmap إلى مكتبتها القياسية. [ 24 ] وتختلف تفاصيل الوحدة باختلاف ما إذا كانت منصة التشغيل ويندوز أو نظامًا شبيهًا بيونكس .
بالنسبة لـ Perl، هناك العديد من الوحدات النمطية المتاحة لتعيين ملفات الذاكرة على CPAN ، مثل Sys::Mmap [ 25 ] و File::Map . [ 26 ]
في بيئة تشغيل Microsoft .NET، يُمكن استخدام P/Invoke للوصول إلى الملفات المُخزّنة في الذاكرة مباشرةً عبر واجهة برمجة تطبيقات Windows . وقد أُضيفت إمكانية الوصول المُدار (دون الحاجة إلى P/Invoke) إلى هذه الملفات في الإصدار الرابع من بيئة التشغيل (انظر: الملفات المُخزّنة في الذاكرة ). أما بالنسبة للإصدارات السابقة، فتتوفر مكتبات خارجية تُقدّم واجهات برمجة تطبيقات مُدارة. [ 27 ] تحتوي بيئة .NET على MemoryMappedFileالفئة. [ 28 ] [ 29 ]
دعمت لغة PHP تقنيات تعيين الذاكرة في عدد من وظائف الوصول إلى الملفات الأصلية مثل ، file_get_contents()ولكنها أزالت هذا في الإصدار 5.3 (انظر سجل المراجعة ).
بالنسبة للغة البرمجة R، توجد مكتبة على CRAN تسمى bigmemory تستخدم مكتبة Boost وتوفر مصفوفات مدعومة بالذاكرة مباشرة في R. توفر الحزمة ff متجهات ومصفوفات ومصفوفات وإطارات بيانات مدعومة بالذاكرة.
تدعم لغة البرمجة J الملفات المُرتبطة بالذاكرة منذ عام 2005 على الأقل. وتشمل هذه الدعم بيانات المصفوفات المُغلّفة، وملفات البيانات أحادية النوع. ويمكن تحميل الدعم من 'data/jmf'. تستخدم محركات قواعد البيانات Jdb وJD في لغة J الملفات المُرتبطة بالذاكرة لتخزين الأعمدة .
تدعم لغة البرمجة جوليا عمليات الإدخال والإخراج للملفات الثنائية المُرتبطة بالذاكرة من خلال Mmapالوحدة النمطية الموجودة في المكتبة القياسية. [ 30 ]
مراجع
- 1 2 كريس سيبنمان (7 يونيو 2018). "تاريخ مجموعة طرق يونكس المربكة منخفضة المستوى لتخصيص الذاكرة" .
- ↑ بدأ التطوير عام 1969، وتم الشحن عام 1976
- ↑ "دليل مرجعي لمكالمات المراقبة TOPS-20" (ملف PDF) .
- ↑ "نظام قاعدة البيانات 1022" .
كان لدينا ذاكرة تخزين مؤقتة PMAP لعمليات إدخال/إخراج الملفات (مثل PA1050) في الأقسام الموسعة.
- ↑ ديسمبر 1988
- ↑ جيفري ريختر (أكتوبر 1995). "إضافة ملفات قابلة للتوسيع مُرتبطة بالذاكرة إلى تطبيقك". مجلة أنظمة مايكروسوفت . الصفحات 17-28 .
- ↑ إنشاء كتلة ذاكرة مشتركة قابلة للتوسع في الحجم
- ↑ "استخدام دالة mmap() لعمليات الإدخال والإخراج المتقدمة للملفات - BrainDump" . مؤرشف من الأصل بتاريخ 7 أغسطس 2011. تم الاطلاع عليه بتاريخ 21 مايو 2011 .
- ↑ ، "ما الذي تقدمه الملفات المُرتبطة بالذاكرة؟".
- 1 2 "الملفات المُرتبطة بالذاكرة" . شبكة مطوري مايكروسوفت . تم الاطلاع عليه بتاريخ 4 يناير 2016 .
- ↑ http://lists.freebsd.org/pipermail/freebsd-questions/2004-June/050371.html ، مقارنة بين القراءة و mmap (أو أخطاء الإدخال/الإخراج مقابل أخطاء الصفحات) بقلم ماثيو ديلون
- ^ باباجيانيس، أناستاسيوس. زانثاكيس، جيورجوس؛ سالوستروس، جيورجوس؛ مرازاكيس، مانوليس؛ بيلاس ، أنجيلوس (2020). تحسين الإدخال/الإخراج المعين للذاكرة لأجهزة التخزين السريعة . يوسينيكس ايه تي سي '20. ص 813 – 827.
- ↑ "التنبيه عند الطلب"
- ↑ ملفات الذاكرة المُرتبطة، مؤرشفة في 9 فبراير 2007 على موقع Wayback Machine
- ↑ أبل – ماك أو إس إكس ليوبارد – التكنولوجيا – يونكس. مؤرشف بتاريخ 23 أبريل 2009 في أرشيف الإنترنت (Wayback Machine).
- ↑ دالة إنشاء ربط الملفات (ويندوز)
- ↑ "مشاركة الذاكرة بين العمليات: ملفات الذاكرة المُرتبطة" . Boost.org.
- ↑ "ملفات مُرتبطة بالذاكرة" . Boost.org.
- ↑ "ملفات مُرتبطة بالذاكرة لأنظمة ويندوز و POSIX" . سورس فورج.
- ↑ "cpp-mmf" . GitHub.
- ↑ "مشاركة البيانات في فئة جافا" .
- ↑ "std.mmfile - لغة البرمجة D" . ديجيتال مارس . تم الاطلاع عليه بتاريخ 4 ديسمبر 2011 .
- ↑ "crates.io: سجل حزم Rust" . crates.io . تم الاطلاع عليه بتاريخ 18 ديسمبر 2024 .
- ↑ "وحدات جديدة في الإصدار 1.6" . مؤرشف من الأصل بتاريخ 30 ديسمبر 2006. تم الاطلاع عليه بتاريخ 23 ديسمبر 2008 .
- ↑ "Sys::Mmap Perl Module" .
- ↑ "File::Map Perl Module" .
- ↑ دوت نت مؤرشف في 19 أبريل 2010 على موقع Wayback Machine
- ↑ "فئة MemoryMappedFile (System.IO.MemoryMappedFiles)" . learn.microsoft.com . تم الاطلاع عليه بتاريخ 20 أكتوبر 2024 .
- ↑ "الملفات المُرتبطة بالذاكرة - .NET" . learn.microsoft.com . 14 ديسمبر 2022. تم الاطلاع عليه بتاريخ 20 أكتوبر 2024 .
- ↑ "الإدخال/الإخراج المُرتبط بالذاكرة · لغة جوليا" . docs.julialang.org . تم الاطلاع عليه في 3 سبتمبر 2023 .
- الذاكرة الافتراضية
