加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

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

发布时间:2020-12-14 01:44:57 所属栏目:Linux 来源:网络整理
导读:我想知道是否有可能在 Linux上的用户空间中的单个进程中实现本机代码的抢占式多任务处理. (也就是说,从外部暂停一些正在运行的本机代码,保存上下文,在不同的上下文中交换,以及恢复执行,所有这些都由用户空间协调,但使用可能进入内核的调用.)我以为这可以使用
我想知道是否有可能在 Linux上的用户空间中的单个进程中实现本机代码的抢占式多任务处理. (也就是说,从外部暂停一些正在运行的本机代码,保存上下文,在不同的上下文中交换,以及恢复执行,所有这些都由用户空间协调,但使用可能进入内核的调用.)我以为这可以使用信号来完成SIGALRM的处理程序和* context()系列但事实证明整个* context()系列是 async-signal-unsafe,因此无法保证方法有效.我确实找到了一个实现这个想法的 gist,所以显然它确实在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是否提供使这种方法正确的保证?有没有办法使这个正确吗?是否有完全不同的方法正确地做到这一点?

(通过“在用户空间中实现”我并不是说我们永远不会进入内核.我的意思是与内核实现的抢先式多任务进行对比.)

解决方法

您无法可靠地更改信号处理程序内的上下文. (如果你是从某个信号处理程序那样做的,它通常会在实践中起作用,但并非总是如此,因此它是 undefined behavior).

您可以在信号处理程序中设置一些易失性sig_atomic_t标志(读取约sig_atomic_t)(请参阅signal(7),signal-safety(7),sigreturn(2) …)并在代码中定期检查该标志(例如,每隔几毫秒至少一次),例如在大多数呼叫之前,或者你的event loop里面,如果你有一个等等……所以它成为合作的用户土地调度.

如果您可以更改代码,则更容易做到,例如当你设计一些发出C代码的编译器(common practice),或者你破解你的C编译器发出这样的测试.然后你将改变你的代码生成器,有时在生成的代码中发出这样的测试.

您可能希望禁止阻止系统调用并将其替换为non-blocking变体或包装器.另见poll(2),fcntl(2),带有F_SETFL和O_NONBLOCK等…

您可能希望代码生成器避免使用大型调用堆栈,例如比如GCC的-fsplit-stack instrumentation option(在GCC中读到约splitstacks).

如果你生成(或写一些)汇编程序,你可以使用这些技巧. AFAIK Go编译器对其goroutines使用类似的东西.研究你的ABI,例如从here.

但是,内核启动的抢占式调度更可取(并且在Linux上仍然会在进程或内核任务之间发生,请参阅clone(2)).

PS.如果使用类似技巧的垃圾收集技术对您感兴趣,请查看MPS和Cheney on the MTA(例如,进入Chicken Scheme).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读