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

Memory management 操作系统如何确定编译时作为堆栈分配的内存量?,memory-management,operating-system,stack,Memory Management,Operating System,Stack,我的教科书说: 一旦操作系统决定创建一个新进程,它 为过程映像的所有元素分配空间;因此, 操作系统必须知道私有用户地址需要多少空间 空间(程序和数据)和用户堆栈 据我所知,堆栈包含函数和局部变量。由于函数的大部分输入和任何相关计算产生的数据在编译时都是未知的,因此操作系统必须分配静态内存量作为堆栈 鉴于此,操作系统如何在编译时确定堆栈组成部分所需的足够内存量?鉴于程序的巨大变化性,我无法想象操作系统如何完成此任务。如果试图在编译时将固定数量的内存分配为堆栈,则通常会导致内存过多或过少。然而,我假

我的教科书说:

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

据我所知,堆栈包含函数和局部变量。由于函数的大部分输入和任何相关计算产生的数据在编译时都是未知的,因此操作系统必须分配静态内存量作为堆栈

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


如果有人能抽出时间来澄清这个概念,我将不胜感激。

我想你从未听说过

简而言之,无法在编译时确定。因为如果可以计算
编译时所需的
堆栈内存量
,不会出现
堆栈溢出
这样的情况,因为编译器只会给出一个错误,告诉您所需的
堆栈内存量
超过了限制

考虑一下简单的函数:

int foo() 
{
     return foo();
}

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

堆栈大小通常由链接器决定。大多数链接器都有设置堆栈大小的选项。然后,当程序加载器从可执行文件读取指令时,程序加载器将创建堆栈以及程序的其余地址空间。

调用堆栈的大小取决于许多因素,包括编程语言、机器体系结构、多线程和可用内存量。这澄清了我的理解。谢谢。编译器使用非常复杂的优化算法确定堆栈大小和布局。谢谢你的回复。我设法从我的研究中确定了这一点,但你的回答还是很有帮助的。