# ذاكرة وحدة المعالجة المركزية

ذاكرة وحدة المعالجة المركزية هي ذاكرة محبئية مؤقتة تستخدمها وحدة المعالجة المركزية للكمبيوتر لتقليل متوسط التكلفة (الوقت أو الطاقة) للوصول إلى البيانات من الذاكرة الرئيسية. ذاكرة التخزين المؤقت هي ذاكرة أصغر وأسرع، تقع بالقرب من نواة المعالج، والتي تخزن نسخًا من البيانات من مواقع الذاكرة الرئيسية المستخدمة بشكل متكرر. تحتوي معظم وحدات المعالجة المركزية على تسلسل هرمي لمستويات ذاكرة التخزين المؤقت المتعددة (L1 ،L2، غالبًا L3، ونادرًا حتى L4)، مع ذاكرة تخزين مؤقت منفصلة خاصة بالتعليمات ومحددة للبيانات في المستوى 1.
توجد أنواع أخرى من ذاكرات التخزين المؤقت (التي لا يتم احتسابها ضمن «حجم ذاكرة التخزين المؤقت» لأهم ذاكرات التخزين المؤقت المذكورة أعلاه)، مثل مخزن الترجمة المؤقت (TLB) والذي يعد جزءًا من وحدة إدارة الذاكرة (MMU) التي تمتلكها معظم وحدات المعالجة المركزية.

## نظرة عامة

عند محاولة القراءة من موقع في الذاكرة الرئيسية أو الكتابة إليه، يتحقق المعالج مما إذا كانت البيانات من هذا الموقع موجودة بالفعل في ذاكرة التخزين المؤقت. إذا كان الأمر كذلك، فسيقوم المعالج بالقراءة من ذاكرة التخزين المؤقت أو الكتابة إليها بدلاً من الذاكرة الرئيسية الأبطأ بكثير.
تحتوي معظم وحدات المعالجة المركزية الحديثة للحاسوب المكتبي والخادم على ثلاث ذاكرات تخزين مؤقت مستقلة على الأقل: ذاكرة تخزين مؤقت للتعليمات؛ لتسريع عملية جلب التعليمات القابلة للتنفيذ، وذاكرة تخزين مؤقت للبيانات؛ لتسريع عملية جلب البيانات وتخزينها، ومخزن مؤقت للترجمة (TLB)؛ يُستخدم لتسريع ترجمة العنوان الظاهرية إلى الفعلية لكل من التعليمات والبيانات القابلة للتنفيذ. يمكن توفير TLB واحد للوصول إلى كلا من التعليمات والبيانات، أو يمكن توفير تعليمات TLB منفصلة (ITLB) وData TLB (DTLB). عادةً ما يتم تنظيم ذاكرة التخزين المؤقت للبيانات كتسلسل هرمي لمزيد من مستويات ذاكرة التخزين المؤقت (L1 ،L2، إلخ). ومع ذلك، فإن ذاكرة التخزين المؤقت TLB هي جزء من وحدة إدارة الذاكرة (MMU) ولا ترتبط مباشرة بذاكرة التخزين المؤقت لوحدة المعالجة المركزية.

## الفرق بين الذاكرة والذاكرة المخبأة

كلاهما ذاكرة، أي مكان لتخزين البيانات، ثم استعادتها في وقت لاحق.
لكن ما يميز الذاكرة المخبأة عن الذاكرة العادية، أنها تستخدم في استخدامات مؤقتة، وليست دائمة، مثل أن يتم فيها تخزين البيانات القادمة (التي يتوقع أن يتم طلبها) فيها، أو البيانات التي تستخدم بكثرة، أو البيانات التي أصبحت جاهزة حاليا.
تخدم هذه الوظائف غرض تقليل زمن التأخير، فعندما يطلب المعالج البيانات من الذاكرة العادية، فانه لا يحصل عليها في الحال، ولكن بعد فترة من الزمن، حيث عادة ما تكون سرعة الذاكرة العادية أبطأ كثيرا من سرعة المعالج نفسه، إضافة الي محدودية التعامل بين المعالج والذاكرة العادية بسبب ضعف القدرة التوصيلية بينهما (عدد الأسلاك)، أو بسبب السرعة كما ذكرنا.
هنا تظهر فائدة الذاكرة المخبأة، فهي عادة ما تتواجد بالقرب من المعالجات، وتعمل بسرعات مماثلة لها، كما تحتوي علي قدرة توصيلية أعلي، وهذا يقلل بشدة من أزمان التأخير، مما يعطي المعالج فرصة الوصول للبيانات التي يرغب فيها بسرعة، وبالتالي يزيد الأداء أثناء عملية المعالجة.
سمّيت الذاكرة المخبأة باسم Cache، من الفعل الفرنسي Cacher، ومعناه يخبأ أو يخفي، وسبب ذلك أن الوصول لهذه الذاكرة غير متاح للبرامج والتطبيقات بشكل مباشر (في المعتاد)، حيث يتولي المعالج وضع البيانات بنفسه في هذه الذاكرة.
تستخدم الذواكر المخبأة أيضا في الربط بين الذواكر ذات الأوساط المختلفة، مثل الربط بين القرص الصلب، والذاكرة العشوائية، فالقرص الصلب هنا بطيء جدا، والذاكرة العشوائية سريعة للغاية بالمقارنة، وعادة ما تنشأ نقاط اختناق عند نسخ البيانات من القرص الصلب إلى الذاكرة العشوائية بسبب فرق السرعة الشاسع بينهما، لذا توضع ذاكرة مخبأة عالية السرعة في كل قرص صلب، حيث تسجل فيها البيانات التي يتوقع أن يطلبها المستخدم، إضافة للبيانات التي يتكرر طلبها، وعندما تحتاج الذاكرة العشوائية هذه البيانات، فإنها تستخرجها من الذاكرة المخبأة مباشرة، ولا تنتظرها أبدا من القرص الصلب.

## عمل الذاكرة المخبئية

عندما يحاول المعالج القيام بمهمة ما، تختبر الذاكرة المخبئية أولا، فإذا كانت محتويات هذه المهمة موجودة في الذاكرة المخبئية تقرأ منها دون الرجوع إلى الذاكرة الرئيسية، أما إذا لم تكن المعلومات موجودة في الذاكرة المخبئية فتولد إشارة خطأ تستدعي الرجوع إلى الذاكرة الرئيسية.يتعلق أداء الذاكرة المخبئية باحتمال وجود المعلومات المطلوبة فيها، وبالإستراتيجية المتبعة لتنظيم المعلومات التي تحتويها في أي لحظة. أما بالنسبة لتعليمة الكتابة، فتكتب في الذاكرة الرئيسية. هناك تشابه ملحوظ بين مفهومي الذاكرة المخبئية والذاكرة الظاهرية. لكن هناك فروقاً هامة في كيفية إدارة كل منهما، إن نسبة زمن ولوج الذاكرة الثانوية إلى زمن ولوج الذاكرة الرئيسية في جوار الـ10000، أما نسبة زمن ولوج الذاكرة الرئيسية إلى زمن ولوج الذاكرة المخبئية فهي حوالي الـ 10. بالنتيجة فإنه خطأ الصفحة في الذواكر الظاهرية مكلف جداً أما خطأ الذاكرة المخبئية فهو أقل كلفة بكثير.
يعتبر استخدام المكونات الإلكترونية المعقدة والكلفة نسبياً عند تنفيذ الذاكرة الظاهرية وذلك للسعة الكبيرة التي توفها هذه الذاكرة، أما الذاكرة المخبئية فهي محدودة السعة ويجب أن تعمل بسرعة عالية جداً لذاكرة توضع قيود عديدة على كلفة وتعقيد أنظمة الذاكرة المخبئية.
من ناحية أخرى، تتواجد الصفحة في أنظمة الذاكرة الظاهرية إما في الذاكرة الرئيسية وإما في الذاكرة الثانوية وليس في كليهما، وبالتالي تصبح سعة الذاكرة المتاحة تساوي إلى مجموع سعتي الذاكرة الرئيسية والذاكرة الثانوية أما الذاكرة المخبئية فتحتوي على «صورة» بعض المواقع (تلك المستخدمة بكثرة من قبل المعالج)، وبالتالي لا تزيد من سعة ذاكرة النظام.
يتم نقل المعلومات بين الذاكرة الرئيسية والذاكرة المخبئية على شكل كلمات منفصلة (أو كتل صغيرة تحتوي عدة كلمات)، أما في أنظمة الذاكرة الظاهرية فتنقل المعلومات على شكل صفحات، ومن الشائع أن تتضمن الصفحة 1000 كلمة.
ومن المقبول استخدام البرمجيات لإدارة عملية نقل المعلومات بين المستويات المختلفة في الذاكرة الظاهرية، إذ لا تشكل أزمة تنفيذ مثل هذه البرمجيات عائقاً في وجه أداء الذاكرة الظاهرية، أما بالنسبة للذاكرة المخبئية فتحقق كل إجرائيات إدارة عمليات نقل المعلومات على شكل دارات إلكترونية (HARDWARE) أو باعتماد التحكم بواسطة برامج صغرية (Micro-programmed control).
لا يقتصر استخدام الذواكر المخبئية على تخزين المعطيات فقط، بل تستخدم أيضا لتخزين التعليمات التي ينفذها المعالج حالياً. فعند تنفيذ المعالج لحلقة تعليمات (loop) يمكن وضع هذه التعليمات في الذاكرة المخبئية والاستغناء عن الرجوع إلى الذاكرة الرئيسية طيلة فترة تنفيذ الحلقة.

### عملها في أنظمة تستخدم ذاكرة ظاهرية

إن تخزين العنوان الحقيقي يبطئ سرعة عمل الذاكرة، إذ يجب عندئذ أن تتم عملية ترجمة العنوان الافتراضي إلى عنوان حقيقي كجزء من حلقة الذاكرة قبل مقارنة العناوين، أما عند تخزين العنوان الافتراضي فيمكن مقارنة العناوين مباشرة، لكن هذا الخيار مشاكله أيضا. فإذا أدت عملية إدخال إلى الكتابة فوق موقع في الذاكرة، يجب حذف أو تحديث صورة هذا الموقع في الذاكرة المخبئية، إذ وجدت هذه الصورة، ويستلزم هذا عملية ترجمة معاكسة من العنوان الحقيقي إلى العنوان الافتراضي وهي عملية صعبة. من ناحية أخرى، يمكن أن يتم الوصول إلى نفس الموقع في الذاكرة الرئيسية من قبل عدة برامج تستخدم عناوين افتراضية مختلفة، وسيؤدي ذلك لظهور عدة مداخل في الذاكرة المخبئية مرتبطة بنفس الموقع.
بناء على ما تقدم يفضل الخيار الأول: أي تخزين العناوين الحقيقية فقط. ويمكن التغلب على لخسارة الزمنية الناتجة عن ترجمة العناوين باستخدام تقنيات أنابيب التجزئة (pipelining). نذكر هنا أن ما يتغير أثناء الانتقال من العنوان الافتراضي إلى العنوان الحقيقي هو عنوان الصفحة فقط، أما عنوان السطر فيبقى كما هو. وتستخدم الطريقة التالية: في الخطوة الأولى يرسل عنوان الصفحة الافتراضي.ليترجم إلى العنوان الحقيقي، وفي نفس الوقت يرسل عنوان السطر إلى الذاكرة المخبئية (لأنه لا يحتاج إلى ترجمة)، يقارن هذا العنوان مع المقاطع (Segment) المناسبة في جدول مداخل الذاكرة المخبئية، وتعطي الذاكرة عناوين الكتل التي حدث فيها التطابق.
في الخطوة الثانية، يقارن العنوان الحقيقي الذي حصلنا عليه مع العدد القليل من عناوين الكتل التي حصلنا عليها من الذاكرة المخبئية، فإذا حدث تطابق يزود المعالج بالمدخل المناسب، كل هذه العملية تتم خلال حلقة واحدة.

## انسجام الذواكر المخبئية

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

### بروتوكول الترابط

(بالإنجليزية: Coherence protocol)‏
* إذا صادف المعالج أثناء محاولة قراءة عنصر معطيات، حالة فقدان في ذاكرته الخاصة، عليه أن يستجوب كل الذواكر المخبئية الأخرى (للتحقق إذا كانت واحدة منها تحتوي على أحدث قيمة لعنصر المعطيات)، فإذا كانت اثنتان أو أكثر من هذه الذواكر تحوي عنصر المعطيات، يجب أن تعيد كلها القيمة نفسها (بفرض أن الانسجام موجود).
* عند كتابة أي عنصر معطيات في الذاكرة الرئيسية (سواء وجد أم لم يوجد في الذاكرة المخبئية المحلية) يجب تحديث كل الذواكر الأخرى التي تحتوي على هذا العنصر، طبعاً يمكن إما أن يتم تحديث قيمة العنصر أو حذفه ببساطة كونه لم يعد صحيحاً.

### البروتوكول المعدل

(بالإنجليزية: Modified protocol)‏ إذا كان عنصر المعطيات موجوداً في ذاكرة واحدة فقط، لن يكون ضرورياً تعميم عملية الكتابة لتشمل بقية الذواكر المخبئية. يمكن إذا تعديل البروتوكول السابق ليصبح أكثر فعالية بالطريقة التالية:
* عندما يجلب المعالج عنصر معطيات إلى الذاكرة المخبئية يربط به علامة حصر الاستخدام (Exclusive tag).
* عندما يقوم معالج آخر بالتعامل مع العنصر نفسه، تلغى إشارة حصر الاستخدام.
* عند الكتابة ينفذ أحد الإجرائين:
* يقوم المعالج الذي يباشر عملية الكتابة بإضافة علامة حصر استخدام العنصر بالذاكرة المخبئية الخاصة به، وتقوم الذواكر الأخرى بحذف قيمة العنصر القديمة (إذا كانت موجودة)، في هذه الحالة تقتصر العملية على إرسال عنوان الموقع دون إرسال القيمة الجديدة.
* عند تلقي الذواكر لإشارة الكتابة تقوم كل منها بتفحص محتوياتها، فإذا كانت تحتوي هذا العنصر تقوم بتحديثه وتلغي علامة حصر الاستخدام، وتعلم المعالج الذي بدأ الكتابة أن لديها نسخة من العنصر وبالتالي يقوم هذا المعالج بإلغاء علامة حصر استخدام العنصر، أما إذا لم يتلق المعالج أي إعلام فيضع علامة حصر استخدام العنصر.
توجد طرق أخرى عديدة لضمان انسجام الذواكر وتحديد أيها الأفضل يعتمد على شروط عمل النظام.

## انظر أيضا

* متنبئ فروع
* تنظيم الكاش في المعالجات التفرعية
* ذاكرة مخبأة
* Cache $^{[الإنجليزية]}$