我在这个演示文稿中读到http://golang.org/doc/ExpressivenessOfGo.pdf http://golang.org/doc/ExpressivenessOfGo.pdf第 42 页:
Safe
- 没有堆栈溢出
这怎么可能?和/或 Go 如何避免这种情况?
这是一个称为“分段堆栈”的功能:每个 goroutine 都有自己的堆栈,分配在堆上 http://golang.org/doc/effective_go.html#goroutines.
在最简单的情况下,编程语言实现在每个进程/地址空间使用一个堆栈,通常使用称为push
and pop
(或类似的东西)并实现为从固定地址(通常是虚拟内存的顶部)开始的动态堆栈帧数组。
这(或曾经)很快,但并不是特别安全。当大量代码在同一地址空间(线程)中同时执行时,它会引起麻烦。现在每个人都需要自己的堆栈。但是,所有堆栈(也许除了一个堆栈)都必须是固定大小的,以免它们彼此重叠或与堆重叠。
然而,任何使用堆栈的编程语言都可以通过以不同的方式管理堆栈来实现:通过使用列表数据结构或类似的数据结构来保存堆栈帧,但实际上是在堆上分配的。在堆被填满之前不会发生堆栈溢出。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)