Tag: 抢占

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

与此问题类似,我想在C中限制函数的执行时间 – 最好是微秒精度。我想C ++exception可用于实现类似于此 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 > […]

可以在Linux上的用户空间中实现本机代码的抢占式多任务处理吗?

我想知道是否有可能在Linux上的用户空间中的单个进程内实现本机代码的抢占式多任务处理。 (也就是说,从外部暂停一些正在运行的本机代码,保存上下文,在不同的上下文中交换,以及恢复执行,所有这些都由用户空间协调,但使用可能进入内核的调用。)我以为这可以使用信号来完成SIGALRM处理程序和*context()系列但事实certificate整个*context()系列是异步信号不安全的,因此无法保证方法有效。 我确实找到了实现这个想法的要点 ,所以显然它确实在Linux上运行,至少有时候,即使POSIX也不需要工作。 gist将其安装为SIGALRM上的信号处理程序,它会进行多次*context()调用: void timer_interrupt(int j, siginfo_t *si, void *old_context) { /* Create new scheduler context */ getcontext(&signal_context); signal_context.uc_stack.ss_sp = signal_stack; signal_context.uc_stack.ss_size = STACKSIZE; signal_context.uc_stack.ss_flags = 0; sigemptyset(&signal_context.uc_sigmask); makecontext(&signal_context, scheduler, 1); /* save running thread, jump to scheduler */ swapcontext(cur_context,&signal_context); } Linux是否提供任何使此方法正确的保证? 有没有办法让这个正确? 是否有完全不同的方法正确地做到这一点? (通过“在用户空间中实现”我并不是说我们永远不会进入内核。我的意思是与内核实现的抢先式多任务进行对比。)