- 主题:stackoverflow 有个比较 c++ stackful 和 stackless 协程的帖子
go不就是这么实现的吗?去挖一挖看看他在windows下调的啥api
【 在 hgoldfish (老鱼) 的大作中提到: 】
: 空间占用不严重。因为现在 linux/openbsd 等现代发行版都早就实现了自动增长的栈。一开始只给你 4KB,随着协程函数的运行才会继续增长。
:
: 所以你一次性创建 1m 协程,也只会占用 4GB 的内存空间。
:
--
FROM 223.104.5.*
我记得go好像就是这种动态增长栈,最开始还支持动态收缩,有性能问题好像现在取消了收缩。brpc里面也实现了这个,但好像栈不能动态增长。
【 在 hgoldfish (老鱼) 的大作中提到: 】
: go, python, java, c# 这几门语言的协程实现和 c++ stackful 是不一样的啊。只有 c++ 才能搞“保存寄存器”,“jmp 跳转”,“恢复寄存器”这种直接在机器指令级别干活的实现方案。其它语言要么有虚拟机,要么有 GC,不能这么搞的啊。
:
: 【 在 ensonmj 的大作中提到: 】
: : go不就是这么实现的吗?去挖一挖看看他在windows下调的啥api
--
FROM 223.104.5.*
stackless不用栈,变量在状态机里面,编译器计算需要分配多大空间
【 在 ylh0315 (ylh0315) 的大作中提到: 】
: 我就是不懂stackless怎么玩栈。
: 我是用stackfull,当然我也没处理1m协程,大概处理过1万多点,内存已经很可观了。
: 【 在 hgoldfish 的大作中提到: 】
: : 怎么能这么想呢。stackless 的协程都投入工作,也得占用那个内存啊。而且因为 stackless 做同一件事的内存开销更大,需要不断地在堆里面分配内存,最终占用的内存说不定还会多很多呢。
--
FROM 223.104.5.*
stackless每一次resume都要从top状态一层层遍历下来,不像stackfull直接记录ip,在嵌套比较深的情况下感觉效率有点低。
另外rust的async实现每次resume的时候好像还要copy这个状态机到执行线程站上,那就更慢了。不知道为啥要这么实现
【 在 hgoldfish (老鱼) 的大作中提到: 】
: 不应该啊。我跑过测试,一万个协程根本没用掉啥内存。可能是因为我每个协程的调用路径都非常短吧。
:
: c++20 stackless 协程就是把程序拿出来变换,把每个 async 函数变成一个这样的类型:
:
--
FROM 223.104.5.*
编译器生成状态机,runtime来帮你维护。本质上就是一层层的switch case
【 在 ylh0315 (ylh0315) 的大作中提到: 】
: 状态机得自己弄?自己在状态机里搞个栈,切换时自己弄?
: 协程每次激活,和挂起,都得自己处理这个栈?
: 【 在 ensonmj 的大作中提到: 】
: : stackless不用栈,变量在状态机里面,编译器计算需要分配多大空间
--
FROM 223.104.5.*
rust1.0之前是实现的stackful的,不知道为啥去掉了,后来才搞的这个async。现在越来越觉得async和非async简直是两个世界
【 在 hgoldfish (老鱼) 的大作中提到: 】
: 对哦。c++ 和 rust 都积重难返。为了兼容以前的代码,所以故意设计成 stackless 语法。不论是性能还是语法美观度都是渣渣。
:
: 而 go 从头开始设计,把协程作为语言的核心概念,是目前唯一一个这么干的主流语言,也是它能够流行的重要原因。
:
--
FROM 222.64.175.*
这个语法问题,用rust的语法应该解决:o1.await+o2.await
【 在 hgoldfish (老鱼) 的大作中提到: 】
: stackless 还有很多更蠢的地方。
:
: 比如 operator +(),考虑一下这个函数要怎么弄成 stackless 里面可以用的:
:
--
FROM 223.104.213.*
这个可能跟编译器优化能力有关,rust就有个类似的问题,会有多余的memcpy拖慢性能。
https://github.com/rust-lang/rust/issues/99504 【 在 hgoldfish (老鱼) 的大作中提到: 】
: stackful 协程一般是在创建协程的时候申请内存的啊。如果优化得好的话,前一个协程释放的内存可以给下一个协程使用,应该是反而减少了内存操作,而且因为协程里面运行的函数都可以方便地从栈里面申请内存,应该能够有效地提高内存数据的局部性。
:
: 我感觉应该是你们怎么用错了。
:
--
FROM 223.66.22.*
linux是因为免费吧。在异步方面windows的iocp比epoll还是nb一点的,io_uring 的生态还差得远
【 在 ylh0315 (ylh0315) 的大作中提到: 】
: 不懂那么多理论。实际上大规模交易系统基本都是UNIX/LINUX。比较稳定可靠。WINDOWS?经常不稳定,也可能是用的不好。
: 【 在 leadu 的大作中提到: 】
: : 不参与你们对协程的讨论,太蠢了
: : 如果一个系统可以上通用os,windows有rio,intel抄了个半成品是dpdk,linux不会表现的比windows更好。
--
FROM 223.66.22.*