yyzybb537 / libgo

Go-style concurrency in C++11
MIT License
3.22k stars 758 forks source link

stack size doubt #115

Closed demiaowu closed 6 years ago

demiaowu commented 6 years ago
  1. 在 #55 中提到,<=1MB 的栈大小,切换速度都是一样的;那是不是言外之意大于 1MB 会变慢吗 ?如果会变慢,原因是什么,因为从当前来看协程切换只是修改相关寄存器,切换速度貌似跟栈大小没关系;如果不会,那么考虑到虚拟内存机制,是不是可以分配更大的 stack 空间,反正 64 位机器的虚拟地址空间足够大 ?
  2. 当前 libgo 当前会在 stack 后面跟一个 protect page,有一定作用,但是如果栈溢出远超过这个 page,而且访问内存是跳跃的访问到溢出部分,感觉还是不能检测出来 ?不知道理解对不对 ?
yyzybb537 commented 6 years ago

1.理论上切换速度是不受影响的,但是更大的栈在内存管理上耗时会很多 2.栈空间的使用,基本上不会遇到跳跃式的访问;当然,特殊的场景下是有可能检测不到的

demiaowu commented 6 years ago

函数的在栈空间申请的时候,会首先给开的局部数组空间做预留,然后才是将入参传进来,这样一旦局部数据空间溢出了,那么入参一进来,就被推到了溢出空间,这样 protect page 就检查不到了,这是目前遇到的场景。

但是对这种情况感觉无能为力,在 C++ 也没办法去对任何一个地址空间访问的时候做栈空间溢出检查,处理开辟较大 stack 空间,并且在代码编写和 review 这一层保证尽可能避免大的局部空间申请,不知道还有没有什么方法能够去避免这种溢出的情况 ?

yyzybb537 commented 6 years ago

"避免过大的局部空间申请"可与说是C系的编码常识了,毕竟linux默认的线程栈也不过8MB,不能任意挥霍。 stackoverflow是程序员一直要关注的点,C/C++没什么办法可以让程序员无视这个点。 能做的仅仅是尽量保护一下

demiaowu commented 6 years ago

确实是如此,谢谢解答~