百科问答小站 logo
百科问答小站 font logo



腾讯开源的 libco 号称千万级协程支持,那个共享栈模式原理是什么? 第1页

  

user avatar   coldwings 网友的相关建议: 
      

其实关于共享栈是否真的节约了内存我还是认为存疑的。

无论malloc分配还是mmap分配协程栈,空间确实向内核要了,但内核并不会真正把物理内存映射上去,这意味着哪怕你一口气申请了100MB空间,也只有当实际使用时触发缺页中断,内核才会正儿八经把物理内存映射进去。作为栈使用的内存就是自底向上(地址由大到小)连续访问的,栈顶也就是最小使用到的位置了。我们自己的协程库实现里,默认一个协程拿8MB栈,起几万个协程的测试进程跑起来看RSS也不会真就吃掉百GB内存。

真要省内存,哪怕在调度过程中用madvise释放掉一些用不着的空间,也比限制着栈大小的共享栈来得更有效率。

更何况栈上空间也是可以取地址取引用的,基于复制的共享栈会影响跨协程的栈上引用的使用,这是正儿八经的副作用了。

顺带提一嘴,不少开源协程库的上下文交换时都会去保存一把SIMD相关的寄存器。这实在是有点奇怪:协程又不是抢占式调度,实在是没有机会在一个仍在跑SIMD指令且没有得到结果的情况下去切换上下文,这些状态的保存就缺乏意义。ucontext这一类的实现里界定词是上下文切换而非协程切换,存一存说得过去,专门一个协程库就实在没必要这么做了,只需要保存callee。这一点libco就是完全按照psABI实现的,比其他几个协程库明显更靠谱。


user avatar   Ivony 网友的相关建议: 
      

看了半天,原来就是栈空间共享,切换的时候用内存拷贝把栈内容给拷贝到共享的栈空间来??


我还以为会有栈底复用这样高端的技术呢……



我知道很多人会看得云里雾里,虽然我不保证我的理解一定正确,但如果我理解正确的话,这个事情非常简单。


你只要搞明白一件事情,不管是线程还是协程(有栈的),栈空间通常是预留了一个固定大小的。

在栈上面分配变量啊参数什么东西,就是把栈顶指针往后面推。这样做的好处是在栈上分配和释放速度巨快,因为直接把栈顶指针往前推往后推就完事了。

但最大的弊病就是我们得预留一大块内存来作为栈空间,这一块内存不能挪作他用。栈也很难动态扩容,因为这涉及到栈地址变化,栈指针都会挂掉。当在栈上分配内存导致栈顶指针超出了栈空间预留大小的时候,就是喜闻乐见的爆栈了(StackOverflow)。


而共享栈说白了就是栈空间是同一块内存地址,每次切换的时候都把栈空间备份和还原……好处是备份还原的时候不是整个栈空间,只是被用到的空间,所以可以省内存。




  

相关话题

  如何看待「抖音不服诉腾讯管辖权被转至深圳中院」?这起诉讼会给腾讯、抖音带来哪些影响? 
  字节跳动将把tiktok总部迁至伦敦,这意味着什么? 
  BAT不断扩大势力范围会最终形成类似韩国的财阀经济吗? 
  如何看待腾讯突然禁封wetool? 
  如何看待数据显示腾讯胜诉率深圳 95%、北京 54%,该统计是否科学?真的存在「南山必胜客」一说吗? 
  如何看待「抖音不服诉腾讯管辖权被转至深圳中院」?这起诉讼会给腾讯、抖音带来哪些影响? 
  如何评价腾讯公司假开源? 
  如何看待王者荣耀将雅典娜新皮肤冰冠公主放入积分夺宝? 
  如何评价开放世界新游《王者荣耀·世界》 10 月 30 号放出的首个游戏实录视频? 
  如何看待 品玩发布的【特斯拉中国乱象:为了产量不惜降低质量 问题零件直接上生产线】一文? 

前一个讨论
跟女朋友争论的一个问题我败了!!求广大知友告知?
下一个讨论
为什么长白山距离板块交界处这么远还能形成活火山?





© 2024-12-25 - tinynew.org. All Rights Reserved.
© 2024-12-25 - tinynew.org. 保留所有权利