الوحدة 7: إدارة الذاكرة
Memory Management
📚 استنادًا إلى الفصل السابع من كتاب: Operating Systems: Internals and Design Principles – William Stallings – الإصدار التاسع
أهداف الوحدة
- فهم متطلبات إدارة الذاكرة الرئيسية.
- استيعاب تقنيات تقسيم الذاكرة (Fixed and Dynamic Partitioning).
- التعرف على مفهوم الترحيل عبر الصفحات (Paging) ومكوناته.
- فهم التقسيم المنطقي (Segmentation) ومقارنته بـ Paging.
- التعرف على مشكلات التهام الذاكرة (Fragmentation) والمبادلة (Swapping).
1️⃣ متطلبات إدارة الذاكرة
تُعد إدارة الذاكرة (Memory Management) إحدى أهم وظائف نظام التشغيل، حيث تتولى مسؤولية تخصيص واستخدام موارد الذاكرة الرئيسية (RAM) بكفاءة بين العمليات المختلفة. الهدف الأساسي هو ضمان عمل البرامج بسلاسة وأمان، مع تحقيق أقصى استفادة من الذاكرة المتاحة.
✅ أهداف رئيسية لإدارة الذاكرة:
- تخصيص الذاكرة بكفاءة: يجب على نظام التشغيل تلبية طلبات العمليات للذاكرة بشكل فعال، وتوفير المساحة اللازمة لكل برنامج وخيط دون هدر غير ضروري.
- حماية الذاكرة (Memory Protection): منع العمليات من التداخل في ذاكرة بعضها البعض. هذا يعني أن عملية معينة لا يمكنها قراءة أو كتابة بيانات في مساحة ذاكرة مخصصة لعملية أخرى، مما يضمن استقرار النظام وأمان البيانات.
- الاستفادة القصوى من الذاكرة المتاحة: استخدام تقنيات تمنع أو تقلل من مشكلة "التهام الذاكرة" (Fragmentation)، وهي المساحات الصغيرة غير المستغلة التي تتكون بين الكتل المخصصة.
- دعم التعددية (Multiprogramming): تمكين تشغيل عدة برامج في نفس الوقت على نظام واحد، مما يزيد من إنتاجية الحاسوب.
- إعادة التموقع (Relocation): القدرة على تحميل البرنامج في أي مكان متاح في الذاكرة الرئيسية، أو حتى نقله من مكان إلى آخر أثناء التنفيذ. هذا يسمح لنظام التشغيل بتحسين استخدام الذاكرة وتجنب الجمود.
- المشاركة (Sharing): إتاحة إمكانية مشاركة مناطق معينة من الذاكرة بين أكثر من عملية عند الحاجة، مثل مشاركة مكتبات الأكواد المشتركة (Shared Libraries) أو البيانات المشتركة بين العمليات المتعاونة، مما يوفر الذاكرة ويقلل من الحمل.
🧩 مفهوم العزل (Isolation): هو جانب أساسي من حماية الذاكرة، حيث يضمن أن كل عملية تعمل في مساحة ذاكرة معزولة خاصة بها، مما يمنعها من التأثير سلبًا على العمليات الأخرى أو على نظام التشغيل نفسه.
2️⃣ تقسيم الذاكرة (Memory Partitioning)
تُعد تقنيات تقسيم الذاكرة من الأساليب المبكرة لإدارة الذاكرة، حيث يتم تقسيم الذاكرة الرئيسية إلى أجزاء (Partitions) وتخصيصها للعمليات.
📌 أنواع التقسيم:
-
التقسيم الثابت (Fixed Partitioning):
- الوصف: يتم تقسيم الذاكرة الرئيسية مسبقًا (عند بدء تشغيل النظام) إلى كتل ذات حجم ثابت وغير قابل للتغيير. كل كتلة يمكنها استيعاب عملية واحدة.
- المزايا: بسيط وسهل التنفيذ.
- العيوب:
- التهام الداخلي (Internal Fragmentation): إذا كانت العملية أصغر من حجم الكتلة المخصصة لها، فإن المساحة المتبقية داخل تلك الكتلة تُهدر ولا يمكن استخدامها بواسطة أي عملية أخرى. على سبيل المثال، إذا كانت الكتلة 10 ميجابايت وعملية تحتاج 7 ميجابايت، فإن 3 ميجابايت تُهدر.
- عدد العمليات التي يمكن تشغيلها محدود بعدد الكتل الثابتة.
-
التقسيم المتغير (Dynamic Partitioning):
- الوصف: يتم تخصيص مساحة للبرنامج في الذاكرة بناءً على حاجته الفعلية (الحجم المطلوب). عندما تنتهي العملية، يتم تحرير المساحة.
- المزايا: لا يوجد تهام داخلي (أو يكون ضئيلًا جدًا)، ويتم استخدام الذاكرة بكفاءة أكبر.
- العيوب:
- التهام الخارجي (External Fragmentation): مع مرور الوقت، تتكون فراغات صغيرة وغير متجاورة من الذاكرة الحرة بين الكتل المخصصة. هذه الفراغات قد تكون كافية لاستيعاب عملية جديدة إذا تم دمجها، ولكنها غير مجدية بشكل منفصل.
- أكثر تعقيدًا في الإدارة من التقسيم الثابت.
🧠 حلول للهدر الخارجي (External Fragmentation):
- دمج الفجوات (Compaction): هي عملية نقل العمليات المخصصة في الذاكرة لدمج جميع الفراغات الحرة المتفرقة في كتلة واحدة كبيرة ومتجاورة. هذه العملية مكلفة من حيث وقت المعالج.
- تقنيات التخصيص (Placement Algorithms):
- First-Fit (الملاءمة الأولى): يخصص أول فراغ حر كبير بما يكفي لاستيعاب العملية. سريع ولكنه قد يترك فراغات صغيرة في البداية.
- Best-Fit (الملاءمة الأفضل): يخصص أصغر فراغ حر كبير بما يكفي لاستيعاب العملية. يميل إلى ترك فراغات صغيرة جدًا، مما يزيد من التهام الخارجي على المدى الطويل.
- Worst-Fit (الملاءمة الأسوأ): يخصص أكبر فراغ حر متاح. يهدف إلى ترك فراغ كبير متبقي يمكن استخدامه لاحقًا، لكنه غالبًا ما يؤدي إلى تشتت الفراغات.
3️⃣ الترحيل عبر الصفحات (Paging)
ما هو الترحيل (Paging)؟
الترحيل عبر الصفحات هو تقنية متقدمة لإدارة الذاكرة تُستخدم على نطاق واسع في أنظمة التشغيل الحديثة. تهدف هذه التقنية إلى حل مشكلة التهام الخارجي بشكل كامل، وتوفير مرونة عالية في تخصيص الذاكرة.
يعمل Paging عن طريق تقسيم الذاكرة المنطقية للبرنامج (العنوان الذي يراه البرنامج) إلى وحدات ذات حجم ثابت تُسمى **صفحات (Pages)**. في المقابل، يتم تقسيم الذاكرة الفيزيائية (RAM) إلى وحدات ذات نفس الحجم تُسمى **أُطر (Frames)**. يقوم نظام التشغيل بعد ذلك بتعيين الصفحات إلى الأُطر في الذاكرة الفيزيائية دون الحاجة إلى أن تكون الأُطر متتالية.
الفوائد الرئيسية للترحيل (Paging):
- يلغي التهام الخارجي (Eliminates External Fragmentation): بما أن الصفحات يمكن أن تُخزن في أي إطار متاح في الذاكرة، فإنه لا توجد مشكلة في وجود فراغات صغيرة متفرقة لا يمكن استخدامها.
- يسهل إدارة الذاكرة ويزيد الكفاءة: يمكن لنظام التشغيل تخصيص الذاكرة بسهولة أكبر، حيث يبحث فقط عن أي إطار حر بدلاً من البحث عن كتلة متجاورة بحجم معين.
- يدعم الذاكرة الافتراضية (Virtual Memory): وهو ما سنتناوله في الوحدة التالية، حيث يسمح للبرامج باستخدام مساحة ذاكرة أكبر من الذاكرة الفعلية.
مكونات أساسية في نظام Paging:
- جدول الصفحات (Page Table): هو بنية بيانات رئيسية يحتفظ بها نظام التشغيل لكل عملية. يحتوي جدول الصفحات على خريطة تربط كل صفحة منطقية (من مساحة عنوان العملية) بإطار فيزيائي معين في الذاكرة الرئيسية.
- وحدة إدارة الذاكرة (Memory Management Unit - MMU): هي مكون عتادي يقوم بتحويل العناوين المنطقية (التي يولدها المعالج) إلى عناوين فيزيائية (التي تستخدمها الذاكرة الفعلية) باستخدام جدول الصفحات.
- ذاكرة التخزين المؤقت للترجمة (Translation Lookaside Buffer – TLB): هي ذاكرة مخبأة (Cache) صغيرة وسريعة جدًا، تُستخدم لتسريع عملية تحويل العناوين. تخزن TLB أحدث الإدخالات المستخدمة من جدول الصفحات، مما يقلل الحاجة للوصول إلى الذاكرة الرئيسية في كل مرة يتم فيها تحويل عنوان.
📌 مثال: تخيل برنامجًا بحجم 8 صفحات (كل صفحة 4 كيلوبايت). يمكن تحميل هذه الصفحات في أطر متفرقة في الذاكرة الفعلية (RAM) دون أي مشكلة. الصفحة 0 قد تكون في الإطار 5، والصفحة 1 في الإطار 12، وهكذا. جدول الصفحات هو الذي يحتفظ بهذه العلاقة، ووحدة MMU هي التي تقوم بالتحويل الفعلي للعناوين.
4️⃣ التقسيم المنطقي (Segmentation)
التقسيم المنطقي (Segmentation) هو أسلوب آخر لإدارة الذاكرة، يختلف عن Paging في نهجه. بدلاً من تقسيم الذاكرة إلى كتل ذات حجم ثابت (صفحات)، يقوم Segmentation بتقسيم الذاكرة المنطقية للبرنامج إلى أقسام (Segments) ذات معنى برمجي.
كل قسم يمثل وحدة منطقية من البرنامج، مثل:
- قسم الكود (Code Segment): يحتوي على تعليمات البرنامج.
- قسم البيانات (Data Segment): يحتوي على المتغيرات العامة والثوابت.
- قسم المكدس (Stack Segment): يستخدم لتخزين المتغيرات المحلية واستدعاءات الدوال.
- أو أقسام أخرى مثل مكتبات برمجية (Libraries) أو وحدات فرعية (Subroutines).
الفرق الرئيسي بين Paging وSegmentation:
| الخاصية |
Paging (الترحيل عبر الصفحات) |
Segmentation (التقسيم المنطقي) |
| نوع التقسيم |
تقسيم فيزيائي (ثابت الحجم) |
تقسيم منطقي (متغير الحجم) |
| وحدة التقسيم |
صفحات (Pages) |
مقاطع (Segments) |
| الهدف الأساسي |
إدارة الذاكرة الفيزيائية بكفاءة وحل مشكلة التهام الخارجي. |
تنظيم البرمجة المنطقية للبرنامج وتسهيل حمايته ومشاركته. |
| مشكلة الهدر |
لا يوجد تهام خارجي (يوجد تهام داخلي ضئيل). |
يوجد تهام خارجي (مثل التقسيم الديناميكي). |
| جدول التعيين |
جدول الصفحات (Page Table) |
جدول القطاعات (Segment Table) |
الفوائد الرئيسية للتقسيم المنطقي (Segmentation):
- يعكس بنية البرنامج: يسمح للمبرمجين بالتعامل مع الذاكرة بطريقة أقرب إلى الهيكل المنطقي لبرامجهم.
- تسهيل المشاركة والأمان: يمكن تطبيق سياسات أمان مختلفة على كل قسم. على سبيل المثال، يمكن جعل قسم الكود للقراءة فقط ومشاركته بين عدة عمليات، بينما قسم البيانات يكون للقراءة والكتابة.
المشكلات في التقسيم المنطقي:
- يسبب تهام خارجي: بما أن الأقسام ذات أحجام متغيرة، فإن تحرير الأقسام يؤدي إلى تكون فراغات متفرقة في الذاكرة، مما يعيد مشكلة التهام الخارجي التي رأيناها في التقسيم الديناميكي.
- يحتاج إلى جدول القطاعات (Segment Table): كل عملية تحتاج إلى جدول قطاعات خاص بها لتخزين معلومات كل قسم (مثل عنوان البداية في الذاكرة الفيزيائية وحجم القسم).
5️⃣ مفاهيم إضافية في إدارة الذاكرة
Fragmentation (التهام الذاكرة):
التهام الذاكرة هو مشكلة شائعة في إدارة الذاكرة حيث تتكون مساحات صغيرة غير مستغلة من الذاكرة الحرة، مما يقلل من كفاءة استخدام الذاكرة الكلية.
- التهام داخلي (Internal Fragmentation): يحدث عندما يتم تخصيص كتلة ذاكرة أكبر من المساحة المطلوبة فعليًا للعملية، وتُهدر المساحة الزائدة داخل الكتلة المخصصة. هذا شائع في التقسيم الثابت ونظام Paging (حيث قد لا تملأ الصفحة الأخيرة بالكامل).
- التهام خارجي (External Fragmentation): يحدث عندما تتكون مساحات حرة صغيرة ومتفرقة في الذاكرة، والتي تكون مجتمعة كافية لاستيعاب عملية جديدة، ولكنها غير متجاورة (ليست كتلة واحدة كبيرة) وبالتالي لا يمكن تخصيصها لعملية تحتاج كتلة متجاورة. هذا شائع في التقسيم المتغير ونظام Segmentation.
Swapping (المبادلة):
المبادلة هي تقنية لإدارة الذاكرة تُستخدم عندما لا تكون هناك ذاكرة رئيسية كافية لاستيعاب جميع العمليات النشطة. يقوم نظام التشغيل بنقل عملية كاملة (أو جزء منها) من الذاكرة الرئيسية إلى مساحة تخزين مؤقتة على القرص الصلب (تُسمى "مساحة المبادلة" أو "Swap Space"). عندما يحتاج المعالج إلى هذه العملية مرة أخرى، يتم إعادتها إلى الذاكرة الرئيسية.
- الهدف: زيادة درجة تعدد المهام (Multiprogramming Degree) عن طريق السماح بتشغيل برامج أكبر أو عدد أكبر من البرامج مما تسمح به الذاكرة الفعلية.
- العيوب: عملية بطيئة جدًا مقارنة بالوصول إلى الذاكرة الرئيسية، حيث تتضمن الوصول إلى القرص الصلب، مما يؤثر سلبًا على الأداء.
Memory Compaction (دمج الذاكرة):
هي عملية تُستخدم لمكافحة التهام الخارجي. تتضمن نقل جميع الكتل المخصصة للعمليات في الذاكرة بحيث تصبح متجاورة، مما يؤدي إلى دمج جميع الفراغات الحرة المتفرقة في كتلة واحدة كبيرة ومتجاورة في نهاية الذاكرة.
- الهدف: استعادة المساحات الحرة المتفرقة وجعلها قابلة للاستخدام لعمليات أكبر.
- العيوب: عملية مكلفة جدًا من حيث وقت المعالج، حيث تتطلب إيقاف العمليات ونقل كميات كبيرة من البيانات في الذاكرة، مما يؤدي إلى "تجميد" النظام مؤقتًا.
💡 نشاط تطبيقي:
لتثبيت فهمك لهذه المفاهيم، حاول أن تمثل 3 عمليات بأحجام مختلفة (مثلاً: 5MB, 10MB, 7MB) وتوزيعها على ذاكرة رئيسية بحجم معين (مثلاً: 30MB) باستخدام:
- Fixed Partitioning: (مع كتل ثابتة مثلاً 8MB لكل كتلة).
- Paging: (مع حجم صفحة ثابت مثلاً 4KB).
- Segmentation: (مع تقسيم منطقي للأقسام).
قارن بين الفعالية، ومقدار التهام الداخلي والخارجي، ومدى تعقيد الإدارة في كل أسلوب.
ملخص الوحدة
إدارة الذاكرة في أنظمة التشغيل تُعد حجر الأساس في تحقيق التوازن بين الأداء والكفاءة، وتوفير بيئة آمنة ومستقرة لتشغيل البرامج. في هذه الوحدة، استكشفنا **متطلبات إدارة الذاكرة** الأساسية من تخصيص وحماية وعزل ومشاركة. ثم تعمقنا في **تقنيات تقسيم الذاكرة** المختلفة، بدءًا من التقسيم الثابت والمتغير، مرورًا بتقنية **الترحيل عبر الصفحات (Paging)** التي حلت مشكلة التهام الخارجي، وصولاً إلى **التقسيم المنطقي (Segmentation)** الذي يعكس البنية المنطقية للبرامج. كما ناقشنا مفاهيم هامة مثل **التهام الذاكرة (Fragmentation)** بأنواعه، و**المبادلة (Swapping)**، و**دمج الذاكرة (Memory Compaction)**. فهم هذه الاستراتيجيات ضروري لكل من يعمل في مجال أنظمة التشغيل أو تطوير البرمجيات، حيث تؤثر هذه المفاهيم بشكل مباشر على أداء التطبيقات واستقرار النظام.
روابط إثرائية وموارد إضافية: