V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
sillyousu
V2EX  ›  程序员

Paper 分享:使用 setjmp longjmp signal stack 实现 c 协程

  •  
  •   sillyousu ·
    sillyousu · 2015-12-03 14:50:27 +08:00 · 2699 次点击
    这是一个创建于 3276 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近在 lug 看到有人发了这 paper http://xmailserver.org/rse-pmt.pdf


    大概原理是:
    1. 把 函数指针 放在全局变量
    2. 在 signal handler 里面用 setjmp 保存 context
    3. sigreturn 后 longjmp 回去
    4. 回到了 signal handler 的上下文,调用步骤 1 的 routine

    优点
    1. 可以移植性非常好
    缺点
    1. 创建上下为比较复杂,按照论文的说法,会比 makecontext 慢 15 倍
    2. signal handling 过程会在 signal stack 上保留一些信息,导致栈空间浪费
    3. 某些系统 longjmp 会误判 我们在跳转到一个已经退出的 stack 而触发错误(论文说法是控制流回交给一个 error handler )
    2 条回复    2015-12-04 08:46:39 +08:00
    leavic
        1
    leavic  
       2015-12-03 14:52:48 +08:00
    这和我 3 年前做的一个简易 rtos 原型一个原理,总的来说,这玩意可以玩玩,不能用。
    nareix
        2
    nareix  
       2015-12-04 08:46:39 +08:00
    makecontext 的移植性挺好的啊
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3596 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 00:53 · PVG 08:53 · LAX 16:53 · JFK 19:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.