一尘不染

Go怎么没有堆栈溢出

go

我在此演示文稿中阅读了http://golang.org/doc/ExpressivenessOfGo.pdf
第42页:

安全

-没有堆栈溢出

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


阅读 254

收藏
2020-07-02

共1个答案

一尘不染

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

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

那是(或曾经是)快速的,但是并不是特别安全。当在相同的地址空间(线程)中同时执行大量代码时,会引起麻烦。现在每个人都需要自己的堆栈。但是然后,所有堆栈(也许除外)都必须是固定大小的,以免它们彼此重叠或与堆重叠。

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

2020-07-02