Go怎么没有stackoverflows

我在这篇演讲中读到了http://golang.org/doc/ExpressivenessOfGo.pdf第42页:

安全

- 没有堆栈溢出

这怎么可能? 和/或Go如何避免这种情况?


这是一个称为“分段堆栈”的特性:每个goroutine都有自己的堆栈,分配在堆上。

在最简单的情况下,编程语言实现为每个进程/地址空间使用一个堆栈,通常使用称为pushpop (或类似的东西)的特殊处理器指令进行管理,并实现为从固定地址开始的动态栈帧数组,虚拟内存的顶部)。

这是(或曾经是)很快,但并不特别安全。 当许多代码在同一个地址空间(线程)中同时执行时,会造成麻烦。 现在每个人都需要自己的堆栈。 但是,所有的堆栈(除了一个堆栈)都必须是固定大小的,以免它们彼此重叠或与堆栈重叠。

但是,使用堆栈的任何编程语言也可以通过以不同方式管理堆栈来实现:使用列表数据结构或类似的存储堆栈帧但实际上分配在堆上的列表数据结构。 在堆填满之前没有堆栈溢出。


它使用分段堆栈。 这基本上意味着它使用链表而不是固定大小的数组,因为它是堆栈。 当空间用尽时,它会使堆栈变大一点。

编辑:

以下是更多信息:http://golang.org/doc/go_faq.html#goroutines

这么伟大的原因并不是因为它永远不会溢出(这是一个很好的副作用),而是你可以创建一个非常小的内存占用的线程,这意味着你可以拥有很多的线程。


我不认为他们可以“完全”避免堆栈溢出。 它们提供了一种方法来防止最典型的与编程相关的错误产生堆栈溢出。

当内存结束时,无法防止堆栈溢出。

链接地址: http://www.djcxy.com/p/80443.html

上一篇: How come Go doesn't have stackoverflows

下一篇: c malloc functionality for custom memory region