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