我想知道是否可以在 Linux 用户空间的单个进程中实现本机代码的抢先式多任务处理。(也就是说,在外部暂停一些正在运行的本机代码,保存上下文,在不同的上下文中交换,然后恢复执行,所有这些都由用户空间编排,但使用可能进入内核的调用。)我认为这可以使用信号来完成SIGALRM
和家庭的处理程序,*context()
但事实证明整个*context()
家庭都是异步信号不安全的,因此不能保证这种方法有效。我确实找到了一个实现这个想法的要点,所以显然它确实可以在 Linux 上工作,至少有时,即使 POSIX 不需要它工作。要点将此作为信号处理程序安装在 上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 是否提供任何保证使这种方法正确?有没有办法让这个正确?有完全不同的方法可以正确地做到这一点吗?
(通过“在用户空间实现”我并不是说我们永远不会进入内核。我的意思是与内核实现的抢占式多任务对比。)