قائمة انتظار الإدخال المسبق

يُعرف جلب رموز العمليات من ذاكرة البرنامج مسبقًا باسم الجلب المسبق ، ويتم ذلك باستخدام قائمة انتظار إدخال الجلب المسبق (PIQ). تُخزَّن التعليمات التي تم جلبها مسبقًا في قائمة انتظار . يُحسِّن جلب رموز العمليات مسبقًا، قبل الحاجة إلى تنفيذها، الكفاءة العامة للمعالج، مما يزيد من سرعته. لم يعد المعالج مضطرًا لانتظار اكتمال عمليات الوصول إلى الذاكرة لتنفيذ رمز العملية التالي. وقد استُخدمت هذه البنية على نطاق واسع في معالج Intel 8086 .

مقدمة

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

ينطبق هذا السلوك فقط على حواسيب فون نيومان (أي ليس حواسيب معمارية هارفارد ) التي يمكنها تشغيل التعليمات البرمجية ذاتية التعديل ولديها نوع من أنواع تسلسل التعليمات . وتلبي جميع الحواسيب الحديثة عالية الأداء تقريبًا هذه المتطلبات الثلاثة. [ 1 ]

عادةً، يكون سلوك الجلب المسبق لـ PIQ غير مرئي لنموذج برمجة وحدة المعالجة المركزية. ومع ذلك، توجد بعض الحالات التي يكون فيها سلوك PIQ مرئيًا، ويجب على المبرمج أخذه في الاعتبار.

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

عند تنفيذ التعليمات البرمجية ذاتية التعديل ، قد لا يؤدي تغيير في كود المعالج الموجود مباشرةً قبل موقع التنفيذ الحالي إلى تغيير طريقة تفسير المعالج للكود، لأنه مُحمّل بالفعل في ذاكرة الوصول العشوائي (PIQ). ببساطة، يقوم المعالج بتنفيذ النسخة القديمة المُحمّلة مسبقًا في ذاكرة الوصول العشوائي (PIQ) بدلاً من النسخة الجديدة والمُعدّلة من الكود الموجودة في ذاكرة الوصول العشوائي (RAM) و/أو ذاكرة التخزين المؤقت ( Cache) .

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

تقييم الأداء بناءً على نظرية الطوابير

كان أ. ك. إرلانغ (1878-1929) أول من ابتكر فكرة الطابور كحلٍّ لازدحام حركة الاتصالات الهاتفية. وقد طُرحت نماذج طوابير مختلفة لمحاكاة أنظمة الطوابير في الوقت الفعلي تقريبًا، بحيث يمكن تحليلها رياضيًا وفقًا لمواصفات أداء مختلفة.

يمكن تمثيل نماذج الانتظار باستخدام ترميز كيندال :

A1/A2/A3/A4

أين:

  • A1 هو توزيع الوقت بين وصولين
  • A2 هو توزيع وقت الخدمة
  • A3 هو العدد الإجمالي للخوادم
  • A4 هي سعة النظام
  1. نموذج M/M/1 (طابور واحد، خادم واحد/ ماركوفي ): في هذا النموذج، تُخدَم عناصر الطابور وفقًا لأسبقية الوصول. وبالنظر إلى متوسط ​​معدلات الوصول والخدمة، فإن المعدلات الفعلية تتفاوت عشوائيًا حول هذه القيم المتوسطة، وبالتالي يجب تحديدها باستخدام دالة توزيع احتمالي تراكمي . [ 2 ]
  2. نموذج M/M/r : يُعد هذا النموذج تعميمًا لنموذج M/M/1 الأساسي، حيث تعمل عدة خوادم بالتوازي. كما يُمكن لهذا النموذج محاكاة سيناريوهات المستخدمين غير الصبورين الذين يغادرون قائمة الانتظار فورًا في حال عدم تلقيهم الخدمة. ويمكن أيضًا نمذجة ذلك باستخدام عملية برنولي ذات حالتين فقط: النجاح والفشل. وأفضل مثال على هذا النموذج هو أنظمة الهاتف الأرضي التقليدية. [ 3 ]
  3. نموذج M/G/1 (نموذج تاكاكس للمدخلات المحدودة)  : يُستخدم هذا النموذج لتحليل الحالات المتقدمة. في هذه الحالة، لا يتبع توزيع وقت الخدمة عملية ماركوف . يأخذ هذا النموذج في الاعتبار حالة إصلاح أكثر من جهاز معطل بواسطة فني واحد. في هذه الحالة، سيزداد وقت الخدمة لأي مستخدم. [ 4 ]

في تطبيقات مثل طابور الإدخال المسبق، يُستخدم نموذج M/M/1 بشكل شائع نظرًا لمحدودية استخدام ميزات الطابور. في هذا النموذج، ووفقًا للمعالجات الدقيقة، يتولى المستخدم دور وحدة التنفيذ، بينما يمثل الخادم وحدة واجهة ناقل البيانات.

قائمة انتظار التعليمات

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

باستخدام خط أنابيب من أربع مراحل ، يمكن أن يصل معدل تنفيذ التعليمات إلى أربعة أضعاف معدل التنفيذ التسلسلي. [ 5 ]

يحتوي المعالج عادةً على وحدتين منفصلتين لجلب التعليمات وتنفيذها. [ 6 ] [ 7 ]

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

تُعدّ هذه العملية أسرع بكثير من إرسال عنوان، وقراءة رمز العملية، ثم فك تشفيره وتنفيذه. ويُطلق على جلب التعليمات التالية أثناء فك تشفير التعليمات الحالية أو تنفيذها اسم "التنفيذ المتسلسل". [ 8 ]

يحتوي معالج 8086 على مسار تعليمات مُسبق الجلب بستة بايتات، بينما يحتوي معالج 8088 على مسار تعليمات مُسبق الجلب بأربعة بايتات. أثناء تنفيذ وحدة التنفيذ للتعليمات الحالية، تقرأ وحدة واجهة الناقل ما يصل إلى ستة (أو أربعة) بايتات من رموز العمليات مُسبقًا من الذاكرة. تم اختيار أطوال قائمة الانتظار بناءً على دراسات المحاكاة. [ 9 ]

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

العيوب

تُعتبر المعالجات التي تُطبّق خوارزمية جلب التعليمات المسبق متطورة تقنيًا. ويُعدّ مستوى تعقيد تصميم وحدة المعالجة المركزية لهذه المعالجات أعلى بكثير من المعالجات العادية. ويعود ذلك أساسًا إلى الحاجة إلى تنفيذ وحدتين منفصلتين، هما وحدة واجهة الناقل ( BIU) ووحدة التنفيذ (EU) ، تعملان بشكل مستقل.

مع ازدياد تعقيد هذه الرقاقات، ترتفع تكلفتها أيضاً. وتُعدّ هذه المعالجات أغلى نسبياً من نظيراتها التي لا تحتوي على قائمة انتظار الإدخال المسبق.

مع ذلك، تُعوَّض هذه العيوب إلى حد كبير بتحسن وقت تنفيذ المعالج. فبعد إدخال قائمة انتظار التعليمات المسبقة في معالج 8086، أُضيفت هذه الميزة إلى جميع المعالجات اللاحقة.

مثال على كود x86

code_starts_here: mov bx , ahead mov word ptr cs :[ bx ], 9090h ahead: jmp near to_the_end ; Some other code to_the_end:

سيقوم هذا البرنامج ذاتي التعديل باستبدال أمر القفز إلى النهاية (jmp to_the_end) بأمرين لا يقومان بأي شيء (NOP) (مُشفّرين بالرمز 0x9090 ). يتم تجميع أمر القفز (jmp) القريب من النهاية (to_the_end) في بايتين من لغة الآلة، لذا فإن هذين الأمرين سيستبدلان هذا القفز فقط دون أي شيء آخر. (أي أن القفز يُستبدل برمز لا يقوم بأي شيء).

لأن رمز الآلة الخاص بالقفزة قد تمت قراءته بالفعل في PIQ، وربما تم تنفيذه بالفعل بواسطة المعالج ( تقوم المعالجات فائقة القياس بتنفيذ عدة تعليمات في وقت واحد، لكنها "تتظاهر" بأنها لا تفعل ذلك بسبب الحاجة إلى التوافق مع الإصدارات السابقة )، فإن تغيير الكود لن يكون له أي تغيير في تدفق التنفيذ.

برنامج نموذجي لاكتشاف الحجم

هذا مثال على خوارزمية NASM - خوارزمية لغة التجميع ذاتية التعديل x86 - التي تحدد حجم PIQ:

يبدأ الكود هنا: xor bx , bx ; صفر السجل bx xor ax , ax ; صفر السجل axmov dx , cs mov [ code_segment ], dx ; "حساب" codeseg في القفزة البعيدة أدناه (edx هنا أيضًا)حول: cmp ax , 1 ; تحقق مما إذا تم تغيير ax je found_size ; 0x90 = رمز العملية "nop" (لا عملية) mov byte [ nop_field + bx ], 0x90 inc bxdb 0xEA ; 0xEA = رمز العملية "قفزة بعيدة" dw flush_queue ; يجب أن يتبعه الإزاحة (rm = "dw", pm = "dd") code_segment: dw 0 ; ثم مقطع الكود (المحسوب أعلاه) flush_queue: ; 0x40 = رمز العملية "زيادة ax" (INCrease ax) mov byte [ nop_field + bx ], 0x40 nop_field: مرات 256 nop jmp around found_size: ; ; يحتوي المسجل bx الآن على حجم PIQ ; هذا الكود مخصص للوضع الحقيقي ووضع الحماية 16 بت، ولكن يمكن تغييره بسهولة إلى ; يعمل أيضًا لوضع الحماية 32 بت. ما عليك سوى تغيير "dw" إلى ; الإزاحة إلى "dd". تحتاج أيضًا إلى تغيير dx إلى edx في الأعلى أيضًا ; (dw و dx = عنونة 16 بت، dd و edx = عنونة 32 بت) ؛

يقوم هذا الكود أساسًا بتغيير مسار التنفيذ، ويحدد حجم PIQ باستخدام طريقة التجربة والخطأ . "ما مدى بُعد الكود الذي أمامي حتى يؤثر عليّ؟" إذا كان قريبًا جدًا (أي موجودًا بالفعل في PIQ)، فلن يكون للتحديث أي تأثير. أما إذا كان بعيدًا بما يكفي، فسيؤثر تغيير الكود على البرنامج، وبذلك يكون البرنامج قد حدد حجم PIQ الخاص بالمعالج. إذا تم تنفيذ هذا الكود في نظام تشغيل متعدد المهام، فقد يؤدي تبديل السياق إلى قيمة خاطئة.

انظر أيضاً

مراجع

  1. "مركز معلومات ARM" . مقالات المعرفة للدعم الفني من ARM .
  2. هايز، جون (1998). هندسة الحاسوب وتنظيمه ( الطبعة الثانية). ماكجرو هيل. 
  3. فيلر، ويليام (1968). مقدمة في نظرية الاحتمالات وتطبيقاتها ( الطبعة الثانية). جون وايلي وأولاده. 
  4. بابوليس، أثاناسيوس؛ إس. أونيكريشنا بيلاي (2008). الاحتمالات، والمتغيرات العشوائية، والعمليات العشوائية ( الطبعة الرابعة). ماكجرو هيل. الصفحات من 784 إلى 800.  
  5. زكي، صفوت؛ ف. كارل هاماخر؛ زفونكو جي.فرانيسيتش (1996). منظمة الكمبيوتر (الطبعة الرابعة ). ماكجرو هيل. ص 310-329 . رقم ISBN   0-07-114309-2.
  6. "مخطط كتلي لوحدة المعالجة المركزية 8086" .
  7. هول، دوغلاس (2006). المعالجات الدقيقة والربط البيني . تاتا ماكجرو هيل. ص 2.12. ISBN  0-07-060167-4.
  8. هول، دوغلاس (2006). المعالجات الدقيقة والربط البيني . نيودلهي: تاتا ماكجرو هيل. الصفحات 2.13 – 2.14 . ISBN  0-07-060167-4.
  9. ماكفيت، جيمس؛ بايليس، جون (مارس 1979). "خيارات جديدة من الرقائق الكبيرة". مجلة IEEE Spectrum . 16 (3): 28-34 . doi : 10.1109/MSPEC.1979.6367944 . S2CID 25154920 .