如何限制C / POSIX中函数的执行时间?

时间:2010-09-14 03:37:50

标签: c posix real-time portability preemption

与此question类似,我想在C中限制函数的执行时间 - 最好是微秒精度 - 我想C ++异常可用于实现类似于{的结果{3}} Python解决方案。虽然它并不理想,但这种方法在普通C中完全不可用。

我想知道,如何在Posix系统上的C中经过一定时间间隔后中断函数的执行?对于相对简单的情况,this可以正常工作,但这会增加与问题解决方案正交的大量代码。假设我有这样的函数:

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

我想在鸡蛋上运行煮沸*,每50μs中断一次,检查是否有这样的事情:

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可以用来做到这一点,但我更有兴趣避免使用它们。我可以在SIGALRM处理程序中的ucontext_t之间切换,但是POSIX标准指出不能在信号处理程序中使用setcontext / swapcontext,事实上,我注意到Linux和Solaris之间的行为不同这样做的系统。

这种效果可能实现吗?如果是这样,以便携方式?

3 个答案:

答案 0 :(得分:1)

您既可以使用线程,也可以让函数轮询一个计时器(或由SIGALRM处理程序设置的全局变量),然后保存其状态并在分配的时间到期后退出。不推荐使用ucontext_t,根本不应该在新代码中使用,更不用说信号处理程序了。

答案 1 :(得分:0)

我想要的解决方案突然发生在我身上:转到!我将在我希望限制的函数之后设置一个跳转点,设置一个定时器,并在处理SIG * ALRM的信号处理程序中简单地跳转到函数后面的指令。

答案 2 :(得分:0)

请注意,您在此处寻找的常规功能称为成本执行。例如,请参阅WellingsLeung, et. al.'s great book中的这篇文章。上面的答案侧重于在用户空间中实现它;一些RTOS或语言支持它(不是linux)作为一般机制。

提供此功能的一个示例操作系统是AUTOSAR OS (spec linked)。请注意,此操作系统提供执行时间实施,这与最后期限执行略有不同。执行时间强制执行越来越难,因为它依赖于某些能力来衡量实际花费的成本(通常与硬件合作)。由于当今处理器的复杂性,测量它的难度和成本很高 - 更不用说测量的含义(由于非线性执行和各种其他很酷的东西)很难解释 - 因此很难计算(代码执行时间的特定部分的最坏或普通情况估计。

稍微偏离主题,但Ada在语言级别提供了一套更严格的功能,这对您没有帮助,但您可以弄清楚这些Ada要求是如何在Linux中实现的。 Ada语言规范在提供基本原理文档时是独一无二的,请参阅real-time preemptive abort部分作为出发点。