مماب
في الحوسبة ، mmap(2)هي نداء نظام يونكس متوافق مع POSIX يقوم بربط الملفات أو الأجهزة بالذاكرة. إنها طريقة لإدخال /إخراج الملفات المرتبطة بالذاكرة . وهي تنفذ الترقيم حسب الطلب لأن محتويات الملف لا تتم قراءتها فورًا من القرص ولا تستخدم في البداية أي ذاكرة وصول عشوائي فعلية على الإطلاق. تتم عمليات القراءة الفعلية من القرص بعد الوصول إلى موقع معين، بطريقة كسولة . بعد عدم الحاجة إلى الربط، يجب إلغاء ربط المؤشرات باستخدام . يمكن إدارة معلومات الحماية - على سبيل المثال، وضع علامة على المناطق المحددة على أنها قابلة للتنفيذ - باستخدام ، ويمكن فرض معاملة خاصة باستخدام .
munmap(2)mprotect(2)madvise(2)
في Linux و macOS و BSDs ، mmapيمكن إنشاء عدة أنواع من التعيينات. قد تدعم أنظمة التشغيل الأخرى مجموعة فرعية فقط من هذه التعيينات؛ على سبيل المثال، قد لا تكون التعيينات المشتركة عملية في نظام تشغيل بدون نظام ملفات افتراضي عالمي أو ذاكرة تخزين مؤقتة للإدخال/الإخراج.
تاريخ
جاء التصميم الأصلي للملفات المخصصة للذاكرة من نظام التشغيل TOPS-20 . mmapوتم تصميم نداءات الأنظمة المرتبطة كجزء من إصدار Berkeley Software Distribution (BSD) من Unix. وقد تم وصف واجهة برمجة التطبيقات الخاصة بهم بالفعل في دليل نظام 4.2BSD، على الرغم من أنها لم يتم تنفيذها في هذا الإصدار، ولا في 4.3BSD. [1] ومع ذلك، فقد نفذت Sun Microsystems هذه الواجهة البرمجية ذاتها في نظام التشغيل SunOS الخاص بها . طلب مطورو BSD في جامعة كاليفورنيا، بيركلي من Sun التبرع بتنفيذها دون جدوى؛ تم شحن 4.3BSD-Reno بدلاً من ذلك مع تنفيذ يعتمد على نظام الذاكرة الافتراضية لـ Mach . [2]
مدعومة بملفات ومجهولة المصدر
تقوم عملية التعيين المدعومة بالملفات بتعيين مساحة من الذاكرة الافتراضية للعملية إلى ملفات؛ أي أن قراءة هذه المساحات من الذاكرة تؤدي إلى قراءة الملف. وهو نوع التعيين الافتراضي.
تقوم الخرائط المجهولة بتعيين مساحة من الذاكرة الافتراضية للعملية غير مدعومة بأي ملف. يتم تهيئة المحتويات إلى الصفر. [3] في هذا الصدد، تكون الخرائط المجهولة مشابهة لـ malloc ، وتُستخدم في بعض تطبيقات malloc لبعض التخصيصات، وخاصة الكبيرة منها. لا تعد التعيينات المجهولة جزءًا من معيار POSIX، ولكن يتم تنفيذها في جميع أنظمة التشغيل تقريبًا بواسطة العلامات MAP_ANONYMOUSو MAP_ANON.
رؤية الذاكرة
إذا كانت عملية التعيين مشتركة ( MAP_SHAREDتم تعيين العلم)، فسيتم الحفاظ عليها عند تقسيم عملية (باستخدام fork(2)نداء نظام). وبالتالي، فإن عمليات الكتابة إلى منطقة معينة في عملية واحدة تكون مرئية على الفور في جميع العمليات ذات الصلة (الأصل أو الطفل أو الشقيق). إذا كانت عملية التعيين مشتركة ومدعومة بملف (وليس MAP_ANONYMOUS) فإن وسيط الملف الأساسي مضمون فقط أن يتم كتابته بعد تمريره إلى msync(2)نداء النظام. وعلى النقيض من ذلك، إذا كانت عملية التعيين خاصة ( MAP_PRIVATEتم تعيين العلم)، فلن تتمكن العمليات الأخرى من رؤية التغييرات أو كتابتها في الملف.
لن ترى العملية التي تقرأ من الملف الأساسي أو تكتب فيه دائمًا نفس البيانات التي تراها عملية مختلفة قامت بتعيين الملف، حيث يتم نسخ أجزاء من الملف إلى ذاكرة الوصول العشوائي (RAM) ويتم مسحها على القرص بشكل دوري فقط. يمكن فرض المزامنة من خلال استدعاء msync(2).
يمكن أن يؤدي استخدام mmap على الملفات إلى تقليل تكلفة الذاكرة بشكل كبير للتطبيقات التي تصل إلى نفس الملف؛ حيث يمكنها مشاركة مساحة الذاكرة التي يشتمل عليها الملف، بدلاً من تحميل الملف لكل تطبيق يريد الوصول إليه. وهذا يعني أن mmap(2) يستخدم أحيانًا للاتصال بين العمليات (IPC). في أنظمة التشغيل الحديثة ، يفضل mmap(2) عادةً على مرفق الذاكرة المشتركة IPC في System V. [4]
الفرق الرئيسي بين الذاكرة المشتركة لنظام V (shmem) والذاكرة المخصصة لإدخال/إخراج البيانات (mmap) هو أن الذاكرة المشتركة لنظام V دائمة: ما لم تتم إزالتها صراحةً بواسطة عملية، يتم الاحتفاظ بها في الذاكرة وتظل متاحة حتى يتم إيقاف تشغيل النظام. الذاكرة المخصصة لإدخال/إخراج البيانات ليست دائمة بين عمليات تنفيذ التطبيق (ما لم تكن مدعومة بملف).
مثال على الاستخدام تحت لغة البرمجة C
#تضمين <sys/types.h>
#تضمين <sys/mman.h>
#تضمين <err.h>
#تضمين <fcntl.h>
#تضمين <stdio.h>
#تضمين <stdlib.h>
#تضمين <string.h>
#تضمين <unistd.h>
/* يوضح هذا المثال كيف أن mmap الخاص بـ /dev/zero يعادل
استخدام ذاكرة مجهولة (MAP_ANON) غير متصلة بأي ملف.
ملاحظة: يتم دعم MAP_ANONYMOUS أو MAP_ANON بواسطة معظم أنظمة UNIX
الإصدارات، وإزالة الغرض الأصلي من /dev/zero.
*/
/* لا يعمل على نظام التشغيل OS X أو macOS، حيث لا يمكنك إجراء mmap عبر /dev/zero */
int main ( void )
{
const char str1 [] = "سلسلة 1" ؛
const char str2 [] = "سلسلة 2" ؛
pid_t parpid = getpid ()، childpid ؛
int fd = -1 ؛
char * anon , * zero ;
إذا (( fd = open ( "/dev/zero" ، O_RDWR ، 0 )) == -1 )
خطأ ( 1 ، "فتح" )؛
anon = ( char * ) mmap ( NULL ، 4096 ، PROT_READ | PROT_WRITE ، MAP_ANON | MAP_SHARED ، -1 ، 0 )؛
صفر = ( char * ) mmap ( NULL ، 4096 ، PROT_READ | PROT_WRITE ، MAP_SHARED ، fd ، 0 )؛
إذا ( anon == MAP_FAILED || صفر == MAP_FAILED )
errx ( 1 ، "إما mmap" );
strcpy ( anon ، str1 )؛
strcpy ( صفر ، str1 )؛
printf ( "PID %d: \t مجهول %s، مدعوم بصفر %s \n " ، parpid ، anon ، zero );
التبديل (( childpid = fork ())) {
الحالة -1 :
خطأ ( 1 ، "شوكة" )؛
/*لم يتم الوصول إليه*/
الحالة 0 :
childpid = getpid ();
printf ( "PID %d: \t مجهول %s، مدعوم بصفر %s \n " ، childpid ، anon ، zero );
النوم ( 3 )؛
printf ( "PID %d: \t مجهول %s، مدعوم بصفر %s \n " ، childpid ، anon ، zero );
مونماب ( مجهول ، 4096 )؛
munmap ( صفر ، 4096 )؛
إغلاق ( fd );
العودة EXIT_SUCCESS ؛
}
النوم ( 2 )؛
strcpy ( anon ، str2 )؛
strcpy ( صفر ، str2 )؛
printf ( "PID %d: \t مجهول %s، مدعوم بصفر %s \n " ، parpid ، anon ، zero );
مونماب ( مجهول ، 4096 )؛
munmap ( صفر ، 4096 )؛
إغلاق ( fd );
العودة EXIT_SUCCESS ؛
}
عينة الإخراج:
PID 22475: سلسلة مجهولة 1، سلسلة مدعومة بصفر 1 PID 22476: سلسلة مجهولة 1، سلسلة مدعومة بصفر 1 PID 22475: سلسلة مجهولة 2، سلسلة مدعومة بصفر 2 PID 22476: سلسلة مجهولة 2، سلسلة مدعومة بصفر 2
الاستخدام في تنفيذات قواعد البيانات
تم استخدام نداء نظام mmap في تنفيذات قواعد البيانات المختلفة كبديل لتنفيذ مجموعة من المخازن المؤقتة، على الرغم من أن هذا أدى إلى إنشاء مجموعة مختلفة من المشكلات التي لا يمكن إصلاحها بشكل واقعي إلا باستخدام مجموعة من المخازن المؤقتة. [5]
انظر أيضا
- الذاكرة الافتراضية عندما تكون مساحة العنوان أكبر من الذاكرة الفعلية
- الترقيم الصفحي لتنفيذ الذاكرة الافتراضية
- ذاكرة التخزين المؤقت للصفحة لآلية التخزين المؤقت للقرص التي يستخدمها mmap
- طلب الترقيم لمخطط تم تنفيذه بواسطة mmap
مراجع
- ^ ويليام جوي ؛ إريك كوبر؛ روبرت فابري ؛ صامويل ليفلر ؛ كيرك ماكوسيك ؛ ديفيد موشر (1983). دليل نظام 4.2BSD (PDF) (تقرير). مجموعة أبحاث أنظمة الكمبيوتر ، جامعة كاليفورنيا، بيركلي .
- ^ McKusick, Marshall Kirk (1999). "عشرون عامًا من يونكس بيركلي: من ملكية AT&T إلى إعادة التوزيع مجانًا". المصادر المفتوحة: أصوات من ثورة المصادر المفتوحة . أوريلي.
- ^ "mmap(2) - صفحة دليل Linux".
- ^ Kerrisk, Michael (2010). واجهة برمجة لينكس: دليل برمجة نظامي لينكس ويونيكس . سان فرانسيسكو: مطبعة نو ستارش. ص. 1116. ISBN 978-1-59327-291-3. OCLC 728672600.
- ^ "هل أنت متأكد من أنك تريد استخدام MMAP في نظام إدارة قاعدة البيانات الخاص بك؟". db.cs.cmu.edu . تم الاسترجاع في 2023-07-04 .
قراءة إضافية
- الوصف من معيار POSIX
- الاختلافات:
- دراجون فلاي بي إس دي
- فري بي إس دي
- نت بي إس دي
- أوبن بي إس دي
- إلوموس
- نظام التشغيل ماك اكس
- سولاريس
- تجربة المستخدم HP
- كيو إن إكس
- نوافذ
- دالة MapViewOfFile win32 تعادل إلى حد ما وظيفة mmap.
- مزيد من أمثلة الكود المصدر:
- SharedHashFile، جدول تجزئة ذاكرة مشتركة مفتوح المصدر تم تنفيذه باستخدام mmap().
