ذاكرة مخبئية
إن تنظيم الذواكر في بنية هرمية يسمح لنا بالاستفادة من ميزتي السرعة العالية للذواكر الصغيرة والسعة الضخمة للذواكر الكبيرة البطيئة. من الممكن التغلب على بطء الولوج إلى الذاكرة الثانوية بخطة منهجية لنقل الصفحات بين مستويات الذاكرة المختلفة، ومع ذلك يبقى تفاوت عمل بين سرعة عمل وحدة الحساب وسرعة الحصول على المعلومات من الذاكرة الرئيسية. يمكن ملاحظة سبب هذا التفاوت بسهولة فالعناصر المستخدمة في بناء وحدة التخزين الرئيسية أصغر حجماً بكثير واقل كلفة من تلك المستخدمة في بناء وحدة الحساب.
من المنطقي أن نتساءل:هل يمكن استخدام ذاكرة أخرى اقل سعة وأسرع من الذاكرة الرئيسية, لكنها تعمل بسرعة تقارب سرعة وحدة الحساب والمنطق, لتشكل بذلك مرحلة إضافية بين المعالج والذاكرة الرئيسية؟ ,طبعاً نعم، تؤمن الذاكرة المخبئية كل هذه المتطلبات. والذاكرة المخبئية هي ذاكرة صغيرة جداً وسريعة جداً تتوضع بين المعالج والذاكرة الرئيسية ،تتألف الذاكرة المخبئية من عدد من المسجلات ،وتتضمن هذه المسجلات المعلومات التي يستخدمها المعالج حالياً. بذلك ينخفض عدد مرات الولوج إلى الذاكرة الرئيسية بشكل كبير ،كما ينخفض أيضا معدل زمن الولوج بالنسبة للكلمة الواحدة, ونتيجة لذلك تقترب السرعة الفعلية للذاكرة من سرعة الذاكرة المخبئية.
يتم نقل المعلومات بين الذاكرة المخبئية والذاكرة الرئيسية كلمة تلو الأخرى.إلا أن بعض الأنظمة تلجأ إلى نقل مجموعات من الكلمات في كل عملية نقل. تدعى هذه المجموعات "أسطر" أو "كتل" (blocks) ،وهي تكافئ الصفحات في الذاكرة الظاهرية.
كلاهما ذاكرة، أي مكان لتخزين البيانات، ثم استعادتها في وقت لاحق.
لكن ما يميز الذاكرة المخبأة (Cache Memory) عن الذاكرة العادية، أنها تستخدم في استخدامات مؤقتة، وليست دائمة، مثل أن يتم فيها تخزين البيانات القادمة (التي يتوقع أن يتم طلبها) فيها، أو البيانات التي تستخدم بكثرة، أو البيانات التي أصبحت جاهزة حاليا.
تخدم هذه الوظائف غرض تقليل زمن التأخير، فعندما يطلب المعالج البيانات من الذاكرة العادية، فانه لا يحصل عليها في الحال، ولكن بعد فترة من الزمن ،حيث عادة ما تكون سرعة الذاكرة العادية أبطأ كثيرا من سرعة المعالج نفسه، إضافة الي محدودية التعامل بين المعالج والذاكرة العادية بسبب ضعف القدرة التوصيلية بينهما (عدد الأسلاك)، أو بسبب السرعة كما ذكرنا.
هنا تظهر فائدة الذاكرة المخبأة، فهي عادة ما تتواجد بالقرب من المعالجات، وتعمل بسرعات مماثلة لها، كما تحتوي علي قدرة توصيلية أعلي، وهذا يقلل بشدة من أزمان التأخير، مما يعطي المعالج فرصة الوصول للبيانات التي يرغب فيها بسرعة، وبالتالي يزيد الأداء أثناء عملية المعالجة.
سمّيت الذاكرة المخبأة باسم Cache، من الفعل الفرنسي Cacher، ومعناه يخبأ أو يخفي، وسبب ذلك أن الوصول لهذه الذاكرة غير متاح للبرامج والتطبيقات بشكل مباشر (في المعتاد)، حيث يتولي المعالج وضع البيانات بنفسه في هذه الذاكرة.
تستخدم الذواكر المخبأة أيضا في الربط بين الذواكر ذات الأوساط المختلفة، مثل الربط بين القرص الصلب Hard Disk، والذاكرة العشوائية RAM، فالقرص الصلب هنا بطئ جدا، والذاكرة العشوائية سريعة للغاية بالمقارنة ،وعادة ما تنشأ نقاط اختناق عند نسخ البيانات من القرص الصلب الي الذاكرة العشوائية بسبب فرق السرعة الشاسع بينهما، لذا توضع ذاكرة مخبأة عالية السرعة Cache في كل قرص صلب، حيث تسجل فيها البيانات التي يتوقع أن يطلبها المستخدم، إضافة للبيانات التي يتكرر طلبها، وعندما تحتاج الذاكرة العشوائية هذه البيانات، فانها تستخرجها من الذاكرة المخبأة مباشرة، ولا تنتظرها أبدا من القرص الصلب.
عندما يحاول المعالج القيام بمهمة ما , تختبر الذاكرة المخبئية أولا, فإذا كانت محتويات هذه المهمة موجودة في الذاكرة المخبئية تقرأ منها دون الرجوع إلى الذاكرة الرئيسية, أما إذا لم تكن المعلومات موجودة في الذاكرة المخبئية فتولد إشارة خطأ تستدعي الرجوع إلى الذاكرة الرئيسية.يتعلق أداء الذاكرة المخبئية باحتمال وجود المعلومات المطلوبة فيها, وبالإستراتيجية المتبعة لتنظيم المعلومات التي تحتويها في أي لحظة.
أما بالنسبة لتعليمة الكتابة, فتكتب في الذاكرة الرئيسية, ويبين الشكلان التالين طريقة عمل هذه الذاكرة. هناك تشابه ملحوظ بين مفهومي الذاكرة المخبئية والذاكرة الظاهرية. لكن هناك فروقاً هامة في كيفية إدارة كل منهما, إن نسبة زمن ولوج الذاكرة الثانوية إلى زمن ولوج الذاكرة الرئيسية في جوار الـ10000، أما نسبة زمن ولوج الذاكرة الرئيسية إلى زمن ولوج الذاكرة المخبئية فهي حوالي الـ 10. بالنتيجة فإنه خطأ الصفحة في الذواكر الظاهرية مكلف جداً أما خطأ الذاكرة المخبئية فهو أقل كلفة بكثير.
يعتبر استخدام المكونات الإلكترونية المعقدة والكلفة نسبياً عند تنفيذ الذاكرة الظاهرية وذلك للسعة الكبيرة التي توفها هذه الذاكرة, أما الذاكرة المخبئية فهي محدودة السعة ويجب أن تعمل بسرعة عالية جداً لذاكرة توضع قيود عديدة على كلفة وتعقيد أنظمة الذاكرة المخبئية.
من ناحية أخرى, تتواجد الصفحة في أنظمة الذاكرة الظاهرية إما في الذاكرة الرئيسية وإما في الذاكرة الثانوية وليس في كليهما، وبالتالي تصبح سعة الذاكرة المتاحة تساوي إلى مجموع سعتي الذاكرة الرئيسية والذاكرة الثانوية أما الذاكرة المخبئية فتحتوي على "صورة"بعض المواقع (تلك المستخدمة بكثرة من قبل المعالج), وبالتالي لا تزيد من سعة ذاكرة النظام.
يتم نقل المعلومات بين الذاكرة الرئيسية والذاكرة المخبئية على شكل كلمات منفصلة (أو كتل صغيرة تحتوي عدة كلمات), أما في أنظمة الذاكرة الظاهرية فتنقل المعلومات على شكل صفحات, ومن الشائع أن تتضمن الصفحة 1000 كلمة.
ومن المقبول استخدام البرمجيات لإدارة عملية نقل المعلومات بين المستويات المختلفة في الذاكرة الظاهرية, إذ لا تشكل أزمة تنفيذ مثل هذه البرمجيات عائقاً في وجه أداء الذاكرة الظاهرية, أما بالنسبة للذاكرة المخبئية فتحقق كل إجرائيات إدارة عمليات نقل المعلومات على شكل دارات إلكترونية (HARDWARE) أو باعتماد التحكم بواسطة برامج صغريه (’Micro-programmed control).
لا يقتصر استخدام الذواكر المخبئية على تخزين المعطيات فقط, بل تستخدم أيضا لتخزين التعليمات التي ينفذها المعالج حالياً. فعند تنفيذ المعالج لحلقة تعليمات (loop) يمكن وضع هذه التعليمات في الذاكرة المخبئية والاستغناء عن الرجوع إلى الذاكرة الرئيسية طيلة فترة تنفيذ الحلقة.
كيف تخزن الذاكرة المخبئية العناوين عندما تستخدم مع نظام الذاكرة الظاهرية؟ هل تخزن العنوان الحقيقي أم العنوان الافتراضي؟
إن تخزين العنوان الحقيقي يبطئ سرعة عمل الذاكرة, إذ يجب عندئذ أن تتم عملية ترجمة العنوان الافتراضي إلى عنوان حقيقي كجزء من حلقة الذاكرة قبل مقارنة العناوين، أما عند تخزين العنوان الافتراضي فيمكن مقارنة العناوين مباشرة, لكن هذا الخيار مشاكله أيضا.
فإذا أدت عملية إدخال إلى الكتابة فوق موقع في الذاكرة, يجب حذف أو تحديث صورة هذا الموقع في الذاكرة المخبئية, إذ وجدت هذه الصورة, ويستلزم هذا عملية ترجمة معاكسة من العنوان الحقيقي إلى العنوان الافتراضي وهي عملية صعبة. من ناحية أخرى, يمكن أن يتم الوصول إلى نفس الموقع في الذاكرة الرئيسية من قبل عدة برامج تستخدم عناوين افتراضية مختلفة, وسيؤدي ذلك لظهور عدة مداخل في الذاكرة المخبئية مرتبطة بنفس الموقع.
بناء على ما تقدم يفضل الخيار الأول: أي تخزين العناوين الحقيقية فقط. ويمكن التغلب على لخسارة الزمنية الناتجة عن ترجمة العناوين باستخدام تقنيات أنابيب التجزئة(pipelining). نذكر هنا أن ما يتغير أثناء الانتقال من العنوان الافتراضي إلى العنوان الحقيقي هو عنوان الصفحة فقط, أما عنوان السطر فيبقى كما هو. وتستخدم الطريقة التالية:
في الخطوة الأولى يرسل عنوان الصفحة الافتراضي.ليترجم إلى العنوان الحقيقي, وفي نفس الوقت يرسل عنوان السطر إلى الذاكرة المخبئية (لأنه لا يحتاج إلى ترجمة), يقارن هذا العنوان مع المقاطع (Segment) المناسبة في جدول مداخل الذاكرة المخبئية, وتعطي الذاكرة عناوين الكتل التي حدث فيها التطابق.
في الخطوة الثانية, يقارن العنوان الحقيقي الذي حصلنا عليه مع العدد القليل من عناوين الكتل التي حصلنا عليها من الذاكرة المخبئية, فإذا حدث تطابق يزود المعالج بالمدخل المناسب, كل هذه العملية تتم خلال حلقة واحدة.
تضم بعض الأنظمة عدداً من المعالجات لكل منها ذاكرة مخبئية خاصة به, في مثل هذه الحالة قد يتواجد عنصر المعطيات في أكثر من وحدة ذاكرة مخبئية, وبالتالي فعندما تعدل قيمة عنصر المعطيات هذا في إحدى الذواكر يجب إجراء التعديل على كل الذواكر المخبئية التي تحتوي على نفس العنصر, ويمكن تحقيق ذلك بطريقتين:
1- إذا صادف المعالج أثناء محاولة قراءة عنصر معطيات, حالة فقدان في ذاكرته الخاصة، عليه أن يستجوب كل الذواكر المخبئية الأخرى (للتحقق إذا كانت واحدة منها تحتوي على أحدث قيمة لعنصر المعطيات), فإذا كانت اثنتان أو أكثر من هذه الذواكر تحوي عنصر المعطيات, يجب أن تعيد كلها القيمة نفسها (بفرض أن الانسجام موجود).
2- عند كتابة أي عنصر معطيات في الذاكرة الرئيسية (سواء وجد أم لم يوجد في الذاكرة المخبئية المحلية) يجب تحديث كل الذواكر الأخرى التي تحتوي على هذا العنصر, طبعاً يمكن إما أن يتم تحديث قيمة العنصر أو حذفه ببساطة كونه لم يعد صحيحاً.
إذا كان عنصر المعطيات موجوداً في ذاكرة واحدة فقط, لن يكون ضرورياً تعميم عملية الكتابة لتشمل بقية الذواكر المخبئية. يمكن إذا تعديل البروتوكول السابق ليصبح أكثر فعالية بالطريقة التالية:
1- عندما يجلب المعالج عنصر معطيات إلى الذاكرة المخبئية يربط به علامة حصر الاستخدام (Exclusive tag).
2- عندما يقوم معالج آخر بالتعامل مع العنصر نفسه, تلغى إشارة حصر الاستخدام.
3- عند الكتابة ينفذ أحد إجراءين:
من الواضح أن الخيار (ب) أكثر تعقيداً.
توجد طرق أخرى عديدة لضمان انسجام الذواكر وتحديد أيها الأفضل يعتمد على شروط عمل النظام.
شكرا للمتابعة
المبادئ النظرية لبرمجيات نظم التشغيل
ترجمة وإعداد المهندس فادي حجار, شعاع للنشر والعلوم
- تنظيم الذاكرة المخبئية
- تنظيم الكاش في المعالجات التفرعية
- Cache Memory
- How Caching Works