操作系统如何确定在编译时作为堆栈分配的内存量?

时间:2017-01-30 04:54:43

标签: memory-management operating-system stack

我的教科书说:

  

一旦操作系统决定创建一个新进程,它就会出现   为过程映像的所有元素分配空间;因此,   操作系统必须知道私有用户地址需要多少空间   空间(程序和数据)和用户堆栈。

据我了解,堆栈包含函数和局部变量。由于在编译时无法知道大部分函数输入和任何相关计算产生的数据,因此操作系统必须分配一定量的内存作为堆栈。

鉴于此,操作系统如何在编译时确定堆栈组成部分所需的足够内存量?鉴于程序的巨大可变性,我无法想象操作系统如何完成此任务。似乎如果一个人试图在编译时分配固定数量的内存作为堆栈,那么它通常会导致内存太多或太少。但是,我认为有一个有效的机制来处理这个问题(分配适当数量的内存作为堆栈);否则,堆栈溢出将是常见的情况。

如果有人愿意花时间澄清这个概念,我将不胜感激。

2 个答案:

答案 0 :(得分:1)

堆栈大小通常由链接器确定。大多数链接器都有设置堆栈大小的选项。然后,程序加载程序将与程序的地址空间的其余部分一起创建堆栈,因为它从可执行文件中读取指令。

答案 1 :(得分:0)

我认为您从未听说过 stack overflow

简短的回答是无法在编译时确定。因为如果可以计算stack memory所需的compile-time数量,就不会有发生stack overflow的事情,因为编译器会简单地给出一个错误,告诉所需的stack memory超过限制。

考虑简单的功能:

int foo() 
{
     return foo();
}

该函数将成功编译。但是会导致堆栈溢出