我在此演示文稿中阅读了http://golang.org/doc/ExpressivenessOfGo.pdf 第42页:
安全 -没有堆栈溢出
安全
-没有堆栈溢出
这怎么可能?和/或Go如何避免这种情况?
这是一个称为“分段堆栈”的功能:每个goroutine都有自己的堆栈,并在堆上分配。
在最简单的情况下,编程语言实现在每个进程/地址空间使用单个堆栈,通常通过称为push和pop(或类似名称)的特殊处理器指令进行管理,并实现为从固定地址(通常是固定地址)开始的动态堆栈帧数组。虚拟内存的顶部)。
push
pop
那是(或曾经是)快速的,但是并不是特别安全。当在相同的地址空间(线程)中同时执行大量代码时,会引起麻烦。现在每个人都需要自己的堆栈。但是然后,所有堆栈(也许除外)都必须是固定大小的,以免它们彼此重叠或与堆重叠。
但是,使用堆栈的任何编程语言也可以通过以不同的方式管理堆栈来实现:通过使用列表数据结构或类似的方法来保存堆栈帧,但实际上是在堆栈上分配的。在堆满之前,没有堆栈溢出。