سؤال

مشابهة لهذه سؤال, ، أرغب في الحد من وقت تنفيذ الوظيفة-بشكل دائم مع دقة microsecond-في C. أتصور أنه يمكن استخدام استثناءات C ++ لتحقيق نتيجة مماثلة ل هذه حل بيثون. على الرغم من أنه ليس مثاليًا ، إلا أن مثل هذا النهج غير متوفر تمامًا في Plain C.

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

void boil(egg *e) {
    while (true)
    do_boil(e);
}

أرغب في تشغيل الركض على بيضة*، وأقاطعها كل 5000 من الفحص للقيام بشيء مثل ذلك:

egg *e = init_egg();
while (true) {
    preempt_in(50, (void) (*boil), 1, e);
    /* Now boil(e) is executed for 50μs, 
       then control flow is returned to the
       statement prior to the call to preempt_in.
     */
    if (e->cooked_val > 100)
        break;
}

أدرك أنه يمكن استخدام Pthreads للقيام بذلك ، لكنني مهتم أكثر بتجنب استخدامها. أنا استطاع التبديل بين ucontext_t في معالج sigalrm ، ولكن يلاحظ المعيار Posix أن استخدام setContext/swapcontext لا ينبغي استخدامه في معالج الإشارة ، وفي الواقع ، أشير إلى سلوكيات مختلفة بين أنظمة Linux و Solaris عند القيام بذلك.

هل هذا التأثير المستطاع ليحقق؟ إذا كان الأمر كذلك ، بطريقة محمولة؟

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

المحلول

فقط للإشارة إلى أن القدرة العامة التي تبحث عنها هنا تسمى إنفاذ التكلفة. على سبيل المثال ، انظر هذا المقال بواسطة Wellings أو في ليونج ، وآخرون. كتاب آل العظيم. تركز الإجابات أعلاه على تحقيقها في مساحة المستخدمين ؛ بعض RTO أو اللغات تدعمها (وليس Linux) كآلية عامة.

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

خارج الموضوع قليلاً ، لكن ADA توفر مجموعة أكثر صرامة من القدرات على مستوى اللغة هنا ، والتي لا تساعدك ، ولكن يمكنك معرفة كيفية تنفيذ متطلبات ADA هذه في Linux. تعد مواصفات لغة ADA فريدة من نوعها في توفير مستند منطقي ، راجع القسم في الوقت الفعلي الإجهاض وقائي كنقطة انطلاق.

نصائح أخرى

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

الحل الذي أرغب في أن يحدث لي فجأة: غوتو! سأقوم بإعداد نقطة قفزة مباشرة بعد الوظيفة التي أرغب في الحد منها ، وضبط مؤقتًا وفي معالج الإشارة الذي يتعامل مع sig*alrm ، ما عليك سوى الانتقال إلى التعليمات بعد الوظيفة.

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