كيف يمكنك التأكد من تشغيل التعليمات البرمجية الخاصة بك دون أي تغيير في وقت التنفيذ بسبب ذاكرة التخزين المؤقت؟

StackOverflow https://stackoverflow.com/questions/69049

سؤال

في تطبيق مضمن (مكتوب بلغة C، على معالج 32 بت) مع قيود صارمة في الوقت الفعلي، يجب أن يكون وقت تنفيذ التعليمات البرمجية المهمة (خاصة المقاطعات) ثابتًا.

كيف يمكنك التأكد من عدم إدخال تقلب الوقت في التنفيذ من التعليمات البرمجية، على وجه التحديد بسبب ذاكرة التخزين المؤقت للمعالج (سواء كان L1 أو L2 أو L3)؟

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

هل كانت مفيدة؟

المحلول

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

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

أخيرًا، إذا كانت السرعة مهمة - صمم البرامج والبيانات بعناية كما لو كان ذلك في اليوم القديم للبرمجة لوحدة المعالجة المركزية القديمة 8 بت - فاحتفظ بها صغيرة بما يكفي لتناسبها جميعًا في ذاكرة التخزين المؤقت L1.أنا دائمًا مندهش من أن ذاكرة التخزين المؤقت الموجودة على اللوحة هذه الأيام أكبر من ذاكرة الوصول العشوائي (RAM) الموجودة على كمبيوتر صغير في (عقد غامض).لكن هذا سيكون عملاً شاقاً ويتطلب ذكاءً.حظ سعيد!

نصائح أخرى

احتمالان:

قم بتعطيل ذاكرة التخزين المؤقت بالكامل.سيتم تشغيل التطبيق بشكل أبطأ، ولكن دون أي تغيير.

قم بتحميل الرمز مسبقًا في ذاكرة التخزين المؤقت و"قفله".توفر معظم المعالجات آلية للقيام بذلك.

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

قد تبدو هذه الإجابة وضيعة، ولكنها تهدف إلى جعلك تفكر:

قم بتشغيل الكود مرة واحدة فقط.

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

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

وأيضا ما هو مقدار التباين المقبول بالنسبة لك؟من الممكن أن تكون على ما يرام مع 40 مللي ثانية، أو أنك على ما يرام مع 10 نانو ثانية.

اعتمادًا على مجال التطبيق، يمكنك أيضًا إخفاء التباين أو إخفاءه.لقد ظل موظفو رسومات الكمبيوتر يعرضون المخازن المؤقتة خارج الشاشة لسنوات لإخفاء التباين في وقت عرض كل إطار.

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

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

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

يمكنك أيضًا إلقاء نظرة على كود التجميع الذي تم إنشاؤه لمعرفة ما إذا كان هناك الكثير من الفروع وتعليمات الذاكرة التي يمكنها تغيير كود التشغيل الخاص بك.

إذا حدثت مقاطعة أثناء تنفيذ التعليمات البرمجية الخاصة بك، فسوف يستغرق الأمر وقتًا أطول.هل تم تمكين المقاطعات/الاستثناءات؟

قم بتخصيص الذاكرة مسبقًا، وتأكد من أن المقاطعات لا تؤثر على ذاكرة التخزين المؤقت (مستحيل، صحيح).

/ آلان

افهم وقت التشغيل الأسوأ للعمليات المعقدة واستخدم المؤقتات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top