如何限制c/posix中函数的执行时间?
-
02-10-2019 - |
题
与此相似 问题, ,我想限制功能的执行时间 - 以微秒准确性最好 - 在C中,我想可以使用C ++异常来获得类似于 这 Python解决方案。尽管它不是理想的,但是这种方法在普通C中完全无法使用。
那么,我想知道,如何在POSIX系统上的C中的一定时间间隔后中断函数的执行?对于相对简单的情况 愚蠢的业务 工作正常,但这为问题解决方案添加了相当多的代码正交。假设我有这样的功能:
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系统之间的行为不同。
是这种效果 可能的 实现?如果是这样,以便携式方式?
解决方案
只是要注意,您在这里寻找的一般能力被称为 成本执行. 。例如,请参阅本文 井 或IN Leung等。 Al。的伟大书籍. 。上面的答案侧重于在用户空间中实现它。一些RTO或语言将其作为一般机制支持(不是Linux)。
提供此功能的一个示例OS Autosar OS(规格链接). 。请注意,此操作系统提供 执行时间执行, ,这与 执行截止日期。 执行时间执行不断越来越困难,因为它依赖于测量实际支出的实际成本(通常是使用硬件合作)的能力。由于当今处理器的复杂性,很难衡量这一点 - 更不用说测量的含义(由于非线性执行和所有其他酷炫的东西)很难解释 - 因此很难计算A(代码执行时间的特定部分的最坏情况或常见的案例估计。
略有主题,但ADA在这里的语言级别提供了更严格的功能,这对您无济于事,但是您可以弄清楚如何在Linux中实现这些ADA要求。 ADA语言规范在提供理由文档时是独一无二的,请参见有关 实时的先发制人中断 作为出发点。
其他提示
您可以使用线程,也可以将函数轮询一个计时器(或设置为全局变量 SIGALRM
处理程序),然后保存其状态并在分配的时间到期后退出。用于 ucontext_t
被弃用,绝不应在新代码中使用,而不是信号处理程序。
我想要的解决方案突然发生在我身上:Goto!我希望限制功能,设置一个计时器和信号处理程序后,我将设置一个跳跃点,该信号处理程序处理SIG*ALRM,只需在功能之后跳到指令即可。