الرئيسيةبحث

تنظيم الذاكرة المخبئية

فهرس

مقدمة:

تاريخياً وحدة المعالجة المركزية دائما اسرع من الذواكر ، إن عملية تطوير الذواكر كانت تسير بشكل موازي مع عملية تطور CPUs و دائماً كان هناك فرق بالسرعة لصالح وحدة المعالجة المركزية، فبعد أن تطلب وحدة المعالجة المركزية المعلومات من الذاكرة الرئسية تبقي وحدة المعالجة المركزية منتظرة لإستجابة الذاكرة الرئسية ، و في أفضل الأحوال ( أي عندما لا تكون الذاكرة الرئسية مشغولة ) فإنة يجب على وحدة المعالجة المركزية الإنتظار 2 او حتى 3 دورات (دورة الناقل).

في الحقيقة ، المشكلة ليست مشكلة تقنية ، و إنما مشكلة إقتصادية . إن المتخصصين في هذا المجال يعرفون كيفية بناء ذواكر سريعة بحيث تكون سرعتها متوافقة مع سرعة وحدة المعالجة المركزية للتخلص من الوقت الضائع في دورة الناقل، لكن المشكلة في التكلفة المرتفعة لهذا النوع من الذواكر و سيكون من المكلف جداً تجهيز حاسوب مع هذا النوع من الذواكر.

وهكذا ، كان هناك خياران امام مهندسين التصميم ، الأول هو استخدام تلك الذواكر السريعة ذات الكلفة العالية ، و الثاني استخدام ذاكرة رخيصة الثمن وذات سرعة بطيئة. فكان الإختيار بأخذ خاصية السرعة من الجانب الأول و خاصية الكلفة المنخفضة من الجانب الآخر و دمجت هذه الخواص لإنتاج الذواكر سريعة ذات حجم صغير ( للتقليل من الكلفة ) و سميت بــ الذاكرة المخبئية Cache Memory.

تنظيم الذاكرة المخبئية

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

kut turken

  1. التقابل المباشر أو الثابت(Fixed or Direct mapping)
  1. التقابل الحر أو الترابطي(Free or associative mapping


تنظيم الذاكرة المخئية على شكل قطاعات (Sector Organized Caches )

تنظم الذاكرة الرئيسية, وكذالك أيضا الذاكرة المخبئية, على شكل قطاعات (Sectors), ويتألف كل قطاع من عدة كتل, والتقابل بين القطاعات قي الذاكرتين من النوع الحر. لكل قطاع في الذاكرة المخبئية علامة عنونة (Address tag ), أما عنوان الكتلة في الذاكرة المخبئية فهو مطابق لعنوانها في الذاكرة الرئيسية. تنقل المعلومات من الذاكرة الرئيسية إلى الذاكرة المخبئية على شكل كتلة في كل مرة ولا ينقل القطاع بأكمله, وبالتالي يمكن أن يحتوي القطاع في الذاكرة المخبئية عدة كتل فارغة, ويمكن ألا يتضمن القطاع إلا كتلة واحدة فقط. للتمييز بين الكتل الفارغة والكتل المشحونة نستخدم لكل كتل بت إضافية نسميها بت الصلاحية (Validity bit ), فإذا كانت هذه البت تحتوي القيمة 1 تكون الكتلة الموافقة موجودة وصالحة للاستخدام.


عند طلب الوصول إلى كتلة يتم أولاً التحقق من وجود عنوان القطاع الموافق في الذاكرة الترابطية, فإذا وجد هذا القطاع يجب اختبار قيمة بت الصلاحية للكتلة في القطاع, فإذا كانت هذه القيمة تساوي الواجد تكون الكتلة موجودة في الذاكرة المخبئية وصالحة للاستخدام وإلا يتولد "خطأ الكتلة" مما يستلزم نقل الكتلة المطلوبة من الذاكرة الرئيسية وتسند بعدها القيمة 1 لبت الصلاحية.


أما إذا لم يكن عنوان القطاع موجودا في الذاكرة الترابطية فيتولد "خطأ القطاع" مما يعني ضرورة الرجوع إلى الذاكرة الرئيسية لجلب القطاع, وقد يطلب الأمر استبعاد أحد القطاعات من الذاكرة المخبئية لإفساح المجال للقطاع الجديد وينتقى القطاع المستبعد بالاعتماد على المعيار المناسب.


لكن خطأ القطاع لن يؤدي لجلب القطاع بأكمله من الذاكرة الرئيسية, ولا تنقل إلا الكتلة المطلوبة منه. بعد نقل القطع تسند القيمة 1 لبت الصلاحية الموافق له, أما بتات صلاحية الكتل الأخرى في هذا القطاع فتضبط على القيمة 0 إشارة لعدم صلاحيتها, فهي من بتات القطاع المنقول سابقا والذي تم استبعاده .


تمتاز طريقة التنظيم هذه ببساطتها الناتجة عن تقليص عدد مداخل الذاكرة الترابطية, إذ تستخدم علامة عنونة وحيدة لكل قطاع بدلا من علامة لكل كتلة كما يتقلص أيضا عدد بتات كل مدخل لأن عناوين القطاعات اصغر من عناوين الكتل فالذاكرة تحوي عددا من القطاعات اقل من عدد الكتل, أما أهم مساوي هذه الطريقة فهي أن جزءاً هاماً من الذاكرة الترابطية قد يكون في أي لحظة مشغولاً بكتل غير صالحة للاستخدام.

مميزات الطرق المختلفة في تنظيم الذاكرة المخبئية

تلخص الصورة التالية أهم مميزات الأنماط السابقة, ويبين الشكل (13-11) مخطط التقابل المستخدم في كل طريقة من هذه الطرق ويوضح الشكل كيف أن بعض الطرق ليست إلا حالات خاصة محدودة من طرق أخرى.


استبدال الكتل أو الكلمات

عندما تولد الذاكرة المخبئية خطأ الكلمة (أو خطأ الكتلة أو خطأ القطاع ) يجب تفريغ كلمة (أو كتلة أو قطاع) لاستيعاب الجديدة. ولانتقاء الوحدة الواجبة استيعابها يمكن الاعتماد على عدة استراتيجيات, منها:


  1. الخيار العشوائي
  2. الرتل FIFO (من يدخل أولا يخرج أولا)
  3. الوحدة الأقل استخداماَ في الماضي Least recently used

والإستراتجية الأخيرة هي الأكثر شيوعا في التطبيق.


الكتابة في الذاكرة المخبئية

عندما تكون الكتلة المطلوبة الموجودة في الذاكرة المخبئية, تقرأ منها دون الرجوع إلى الذاكرة الرئيسية, إلا أنه عند تنفيذ عملية كتابة (write) يجب الولوج إلى الذاكرة الرئيسية حتى لو كانت موجودة في الذاكرة المخبئية. فإذا كان للموقع الذي نكتب فيه في الذاكرة الرئيسية صورة في الذاكرة المخبئية يجب اختيار أحد إجراءين:


  1. الكتابة الآنية (Write through): أي تكتب المعلومات في الذاكرة الرئيسية وفي الذاكرة المخبئية بنفس الوقت (وهي الطريقة التي وصفناها سابقا).
  2. الكتابة المتأخرة (Write back): لا ينعكس التغيير الذي طرأ على الموقع الموجود في الذاكرة المخبئية, على الموقع المقابل في الذاكرة الرئيسية إلا عند استبعاد الكلمة من الذاكرة المخبئية.2


الكتابة الآنية:

تكتب المعلومات في الذاكرتين الرئيسية والذاكرة المخبئية بنفس الوقت ، ومع أن هذه العملية تبدو معقدة إلا أن لها بعض المزايا الجيدة, فمن ناحية أولى نحافظ على سلامة المعلومات (Integrity), فالمعلومات الموجودة في الذاكرة المخبئية تطابق بشكل دائم تلك الموجودة في الذاكرة الرئيسية, ومن ناحية ثانية لن تحتاج لنقل أي كلمة أو كتلة من الذاكرة المخبئية إلى الذاكرة الرئيسية. فعند الحاجة لتحرير موقع في الذاكرة المخبئية يكفي أن نكتب مباشرة فيها, وبما أن الذاكرة الرئيسية تحتوي دوما المعطيات الصحيحة المحدثة(up dated) يمكن أن تستخدم نفس الكلمة كجزء من عملية إدخال وإخراج دون الخوف من الوقوع على معلومات متقادمة (out dated). ويعتبر خيار الكتابة الآنية هو الأفضل في الحالات التي تكتب فيها المعطيات في الموقع لمرة واحدة فقط, إذ يصبح من الأبسط و الأسرع أن تعدل كلا الذاكرتين بنفس الوقت.

الكتابة المتأخرة:

تبقى الكلمة الآنية الصلبة في الذاكرة الرئيسية على حالها ولا يجري التعديل إلا عندما نحتاج لاستبعاد الكتلة الموافقة من الذاكرة المخبئية. نلاحظ هنا أنه في حال بقيت الكتلة كما هي في الذاكرة المخبئية, أي لم تبدل محتوياتها, فإن الذاكرة الرئيسية تحتوي المعطيات الصحيحة ولا داعي لإعادة نقلها من الذاكرة المخبئية.


المخبئية والذاكرة الرئيسية على الترتيب, يصبح عندئذ زمن الولوج الفعلي:

نشير هنا أن Tap هو زمن ولوج الذاكرة الرئيسية محسوباً بعد الأخذ بعين لاعتبار تأثير عملية نقل الصفحات فيحال استخدام الذاكرة الظاهرية, ويعتمد هذا الزمن بالطبع على الإستراتيجية المستخدمة لاستبدال الصفحات

يقترب زمن الولوج الفعلي Teff من زمن ولوج الذاكرة المخبئية Tac كلما اقترب h من الواحد, أي كلما ارتفعت نسبة الإصابة(ويحدث ذالك مثلاً بأخذ ذاكرة مخبئية بحجم كبير جداً).

نلاحظ أن تناقص نسبة الإصابة بنسبة واحدة بالمائة يؤدي إلى زيادة الزمن الفعلي بعدد من المرات يساوي تقريباً النسبةk, ومنه نستنتج أن ثمن فقدان المعطيات المطلوبة من الذاكرة المخبئية عالٍ نوعاً ما من حيث تأثيره على زمن عمل الآلة.

من الوسائط الأخرى التي تؤثر على فعالية الذاكرة المخبئية حجم أو سعة الكتلة, وتأثير هذا الوسيط مشابه لتأثير حجم الصفحة على فعالية الذاكرة الظاهرية.

من الصعب جداً جمع معلومات عن تأثير هذه الوسائط في أوضاع التشغيل الحقيقية, ومن الصعب جداً استخدام دارات الكترونية لمراقبة أداء الذاكرة الافتراضية لان مثل هذه الدارات يجب أن تكون أسرع بكثير من الآلة نفسها.

غلا انه من المكن استخدام برامج لمحاكاة عمل الآلة عند تنفيذها لعمل نمط تقليدي, لكن تعترض هذا المنهج مشكلتان: ففي البداية تكون الذاكرة المخبئية فارغة, وتبدي نتيجة لذالك فعالية منخفضة جداً إذ سيظهر عدد كبير من حالات فقدان المعطيات. يطلق على هذا الوضع اسم"الحالة العابرة البدائية "(initialization transient).

وتعتمد مدة هذه الحالة العابرة على حجم الذاكرة المخبئية,فكلما ازداد هذا الحجم طالت مدة الحالة العابرة,إن عدد حالت فقدان المعطيات التي تحدث في بداية التشغيل هو تقريباً من نفس سعة مرتبة سعة الذاكرة المخبئية. لذا, وبهدف الحصول على نتائج موثوقة يجب مراقبة أداء الذاكرة لمدة كافية حتى يحدث على الأقل 100 * nحالة فقدان معطيات(حيث n سعة الذاكرة المخبئية) فإذا حصلنا على نسبة فقدان تساوي واحد بالمائة, يجب إنجاز حوال 10000 * n عملية رجوع للذاكرة.

المراجع :

المبادئ النظرية لبرمجيات نظم التشغيل

روابط خارجية وداخلية