我的教科书说:
一旦操作系统决定创建一个新进程,它就会出现 为过程映像的所有元素分配空间;因此, 操作系统必须知道私有用户地址需要多少空间 空间(程序和数据)和用户堆栈。
据我了解,堆栈包含函数和局部变量。由于在编译时无法知道大部分函数输入和任何相关计算产生的数据,因此操作系统必须分配一定量的内存作为堆栈。
鉴于此,操作系统如何在编译时确定堆栈组成部分所需的足够内存量?鉴于程序的巨大可变性,我无法想象操作系统如何完成此任务。似乎如果一个人试图在编译时分配固定数量的内存作为堆栈,那么它通常会导致内存太多或太少。但是,我认为有一个有效的机制来处理这个问题(分配适当数量的内存作为堆栈);否则,堆栈溢出将是常见的情况。
如果有人愿意花时间澄清这个概念,我将不胜感激。
答案 0 :(得分:1)
堆栈大小通常由链接器确定。大多数链接器都有设置堆栈大小的选项。然后,程序加载程序将与程序的地址空间的其余部分一起创建堆栈,因为它从可执行文件中读取指令。
答案 1 :(得分:0)
我认为您从未听说过 stack overflow 。
简短的回答是无法在编译时确定。因为如果可以计算stack memory
所需的compile-time
数量,就不会有发生stack overflow
的事情,因为编译器会简单地给出一个错误,告诉所需的stack memory
超过限制。
考虑简单的功能:
int foo()
{
return foo();
}
该函数将成功编译。但是会导致堆栈溢出。