堆栈可以长成堆吗?

时间:2018-12-07 19:21:45

标签: operating-system stack heap

我目前正在学习操作系统,并且了解到堆栈位于内核和堆之间。令我感到困惑的是,在大多数实现中,由于堆栈趋于向下增长,而堆增长至更高的内存地址,是什么阻止了堆栈向堆中增长呢?如果有可能,如果它长进了堆怎么办?

2 个答案:

答案 0 :(得分:0)

这不一定正确:

  

我目前正在学习操作系统,并且了解到堆栈位于内核和堆之间。

堆栈和堆只是内存。除了如何使用外,它们没有区别。地址空间中可以有多个堆和多个堆栈。

堆无法增长到堆栈中,反之亦然。操作系统将不允许堆重新分配已经为堆栈分配的内存。

一个人可以访问超出堆栈末端的内存,从理论上讲,该堆栈可以是堆的一部分。某些操作系统在堆栈末尾放置了无法访问的防护。

答案 1 :(得分:0)

记忆的简化视图通常看起来像这样:

 ===================
| Operating System  | High memory
 ===================
|   Your program    |
|  ---------------  |
| | Process stack | |
|  ---------------  | Transient program area
| |  Process heap | |
|  ---------------  |
| |  Program code | |
|  ---------------  |
 ===================
| Operating system  | Low memory
 ===================

正如您所指出的,进程堆栈从操作系统代码的下面开始,并向下扩展。另一方面,进程堆从固定程序代码的上方开始,然后向上增长。

在PC操作系统的早期,这实际上是程序在内存中的物理布局。例如,CP / M操作系统为某些操作系统引导程序代码保留了前256个字节的内存,而其余的必要操作系统服务则占用了高内存区域。程序从地址0x0100开始,可以使用该地址与顶部的操作系统代码开始之间的所有内存。 MS-DOS非常相似。

没有护栏来防止您提到的事情发生:程序会在堆栈上分配太多空间,从而会覆盖在堆上分配的内存。或者,程序将分配覆盖处理器堆栈的堆内存。当这些事情中的任何一个发生时,程序将崩溃。在某些情况下,操作系统也会崩溃。当然,因为一次只能运行一个程序,所以这没什么大不了的:只需重新启动计算机,然后重试即可。

现代计算机具有更高级的内存布局,并且这种概念图不再成立。如今的操作系统在执行内存访问限制方面可以做得更好。例如,为进程的堆栈分配一个固定的段(通常为1兆字节)。如果程序尝试使用比分配的更多的堆栈空间,内存管理器将不允许它。该程序将因访问冲突而崩溃。出于相同的原因,程序的堆无法增长到分配给堆栈的内存中。

相关问题