usama707

Memory-Mapped Files

5 ردود في هذا الموضوع

بسم الله الرحمن الرحيم

تعتبر الذاكرة الإفتراضية من أهم التقنيات المستخدمة في إدارة الذاكرة في أنظمة التشغيل المتعددة المهام (Multitasking Operating Systems) حيث تسمح

هذه التقنية بإستخدام ذاكرة غير متجاورة كأنها متجاورة و توفر قدر كبير من المرونة و غالبا ما تستخدم في الpaged-memory systems حيث يتم تقسيم الذاكرة

إلى مجموعة صفحات pages غالبا ما يكون حجم كل منها 4 Kb و تستخدم أيضا مع تقنيات Memory-Swapping عندما يتم نقل الذاكرة بين الPrimary Storage و

ال Secondary Storage كبين ال RAM و ال Hard Disk و نظام التشغيل هو الذي يقوم بالتحكم في نقل الذاكرة بين ال paging file و الذاكرة الفيزيائية

Memory-Mapped Files تسمح لك بربط الذاكرة الإفتراضية مباشرة بالملفات العادية بحيث يمكنك التعامل مع الملفات مباشرة كإنها في الذاكرة الحقيقة بدل من

إستخدام الدوال ك readfile و writefile و هذه هي التقنية المستخدمة في ال paging file

و هذا له بعض المميزات منها

* زيادة الأداء في بعض الحالات

* تستطيع ال processes مشاركة الذاكرة عن طريق ربط مدى الذاكرة الإفتراضي لنفس الملف أو للpaging file

* لا يوجد حاجة مساحة ال paging file

* يمكن تطبيق بعض الخوارزميات على الملف بكفاءة حتى لو كان حجمه أكبر من الذاكرة الفيزيائية

وويندوز يستخدم هذه التقنية لتحميل ملفات الEXE و ال DLL

و الأن نأتي لكيفية تطبيق هذه التقنية

أول خطوة هي إنشاء كائن ربط ملفات (File-Mapping Object) و يحتوي على Handle لملف مفتوح ثم يتم ربط إما جزء من هذا الملف أو الملف كامل و كائن ربط

الملفات يمكن أن يكون له إسم حتى يتم إستخدامه في مشاركة الذاكرة مع ال Processes الأخرى كما أنه يمكن أن يحتوي على Security Attributes

الدالة المستخدمة لإنشاء كائن من هذا النوع هي

HANDLE CreateFileMapping(
 HANDLE hFile,
 LPSECURITY_ATTRIBUTES lpAttributes,
 DWORD flProtect,
 DWORD dwMaximumSizeHigh,
 DWORD dwMaximumSizeLow,
 LPCTSTR lpName
);

hFile هو Handle للملف المفتوح و يمكن إستخدام القيمة INVALID_HANDLE_VALUE إذا أردنا إستخدام Paging File الخاص بنظام التشغيل دون الحاجة إلى إنشاء ملف إضافي لمشاركة الذاكرة

ملحوظة: لابد أن يكون الملف مفتوح بحقوق وصل (Access Rights) متوافقة مع flProtect الذي سيتم ذكرها لاحقا

lpAttributes يستخدم لتحديد خواص أمن معينة للكائن كمثلا إذا كان يمكن لل Child Processes وراثته أم لا و يمكن إستخدام NULL لإستخدام الخواص الإفتراضية

flProtect: تستخدم لتحديد حماية للملف و يمكن أن تأخذ أحد القيم الأتية

PAGE_READONLY: تعني أن البرنامج يستطيع أن يقرأ فقط من الملف ولا يستطيع أن يكتب عليه أو ينفذ تعليمات (execute)

PAGE_READWRITE: تمنح البرنامج صلاحيات قرائة و كتابة

PAGE_WRITECOPY: تعني أنه عند تغيير في محتويات الملف فإن نسخة من الملف خاصة بالProcess يتم إنشائها في ال Paging File و ليس في الملف الأساسي نفسه و يستفيد من هذه الخاصية ال Debuggers مثلا عند عمل Break Points على البرنامج وقت التنفيذ

dwMaximumSizeHigh و dwMaximumSizeLow يحددا حجم الكائن (Mapping Object) لو بصفر فيستم إستخدام الملف بأكمله

تأكد من تحديد الحجم عند إستخدام ال Paging File

إذا كان من المتوقع أن يزداد حجم الملف فيجب إختيار حجم يناسب الحجم المتوقع أن يزداد إليه

lpMapName: يمكنك إستخدام هذا لتحديد إسم معين للكائن حتى يمكنك مشاركته مع Processes أخرى. إستخدم NULL إذا لم تريد أن تشاركه

إذا نجحت الدالة فستعيد مقبض الكائن و إذا فشلت فستعيد NULL

و الأن إذا قمت بتحديد إسم للكائن و تريد إستخدامه في Process أخرى لمشاركة الذاكرة فيمكنك إستخدام هذه الدالة للحصول على مقبض (Handle) الخاص بالكائن

HANDLE OpenFileMapping(
 DWORD dwDesiredAccess,
 BOOL bInheritHandle,
 LPCTSTR lpName
);

dwDesiredAccess تستخدم نفس ال Flags الموجودة في flProtect و lpMapName هو الإسم الخاص بالكائن الذي تم تحديده في الدالة CreateFileMapping

bInheritHandle إذا تم تحديده ب True فإن ال Process الجديدة تقوم بوراثة الكائن يمكنك تحديده ب FALSE الأن

CloseHandle تستخدم كالعادة للقضاء على هذا ال Handle

الأن نأتي إلى الخطوة التالية و هي الحصول على ذاكرة إفتراضية للملف حتى يمكننا التعامل معاها كقرائتها و كتابتها و الدالة المستخدمة لهذا الغرض هي

LPVOID MapViewOfFile(
 HANDLE hFileMappingObject,
 DWORD dwDesiredAccess,
 DWORD dwFileOffsetHigh,
 DWORD dwFileOffsetLow,
 SIZE_T dwNumberOfBytesToMap
);

hFileMappingObject هو ال Handle الخاص بالكائن الذي يتم الحصول عليه إما ب CreateFileMapping أو ب OpenFileMapping

dwDesiredAccess تستخدم لتحديد مزايا الوصول للكائن من بين الأتي

FILE_MAP_WRITE

FILE_MAP_READ

FILE_MAP_ALL_ACCESS

dwFileOffsetHigh و dwOffsetLow تستخدما لتحديد البداية التي يجب عمل Mapping لها بالنسبة للملف و يجب أن تكون مضاعف ل64K يمكنك إستخدام 0 لعمل Mapping بداية من أول الملف

cbMap هو الحجم بالبايتات للبيانات التي سيتم عمل Mapping لها و يمكنك إستخدام 0 لعمل Mapping للملف كله

هذه الدالة تعود بNULL إذا فشلت و إذا نجحت تعود بمؤشر يمثل يمثل بداية البيانات التي تم عمل Mapping لها

لتحرير ال file view يتم إستخدام

BOOL UnmapViewOfFile(
 LPCVOID lpBaseAddress
);

Process Address Space Mapped to File

mapping0qe.gif

الذاكرة المشتركة

mapping21by.gif

و للحديث بقية ...

المراجع: Windows System Programming Third Edition

Microsoft Developers Network ==> MSDN

تم تعديل بواسطه usama707
1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

شرح رائع ,,, ولكن لا ننسى الداله CloseHandle بعد استخدام الدوال السابقه

ننتظر التكمله

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

جزاك الله خيراً أخي ولكن يبدو أن الموضوع متقدم حيث أني لم أفهم شئ

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

أعد قراءته, اقرأه ببطئ

استوعب المفاهيم, ثم انظر الى الشفرة

أخي العاقب

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .