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

2015-12-03 14:50:27 +08:00
 sillyousu
最近在 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 )
2700 次点击
所在节点    程序员
2 条回复
leavic
2015-12-03 14:52:48 +08:00
这和我 3 年前做的一个简易 rtos 原型一个原理,总的来说,这玩意可以玩玩,不能用。
nareix
2015-12-04 08:46:39 +08:00
makecontext 的移植性挺好的啊

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/240863

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX