Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

协程共享栈的问题 #8

Closed
messi824 opened this issue Nov 30, 2016 · 6 comments
Closed

协程共享栈的问题 #8

messi824 opened this issue Nov 30, 2016 · 6 comments

Comments

@messi824
Copy link

看了源码和这篇文章《揭秘:微信是如何用libco支撑8亿用户的》,对共享栈那里有点不能理解啊!
尤其这里“libco也提供了stackless的协程共享栈模式,可以设置若干个协程共享同一个运行栈。”,谁能结合代码讲一下?co_swap就行

@messi824
Copy link
Author

messi824 commented Dec 2, 2016

看代码终于明白了。以example_copustack.cpp为例,它在一个线程中分配了128个栈,则128n(n>=0)号协程都使用0号栈,128n+1使用1号栈,以此类推。
当协程运行时,运行到co_swap,如果0号协程是第一次使用pending_co->stack_mem->ocupy_co,则其为null,此时将pending_co赋值给它;如果第二次128号协程过来运行,判断出这个变量其实保存的是0号协程的内容,此时,需要执行copy操作,把0号协程的栈信息保存到malloc的空间。
感觉这样并不能节省多少空间啊。。。虽然运行栈的空间变小了,但是新赠了额外保存协程信息的内存,会不会得不偿失啊?

@willkozheng
Copy link

这个优化点,主要在于,栈的内存峰值不一定是栈切换时发生的。
例如,
栈a的内存峰值为8k,发生切换时只需使用4k,那使用共享的可以节约4k。

@messi824
Copy link
Author

messi824 commented Dec 2, 2016

这个感觉优化有限,因为并不能控制一定在4k的时候切换,如果切换的时候就是8k,那不是还浪费了8k的空间存储?

@willkozheng
Copy link

1.不会存在浪费
2.是否能节省,取决于切换时是否峰值。正常来说,一个协程不可能每次切换都处于峰值。
这个是针对场景性的优化,当然不能保证每份代码都起作用,但是越复杂的逻辑这个效果会越明显。

@messi824
Copy link
Author

messi824 commented Dec 2, 2016

学习了,非常感谢!

@wechatsunny
Copy link
Collaborator

close

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants