可能重复:
堆栈内存如何增加?
让我们考虑一个使用分段的操作系统。
我的问题是:操作系统是否会接收堆栈指针的每次更改
并立即(或相当立即)分配/释放物理内存中的空间,
或者它使用一种聪明的策略来分配比您减少 sp 时所需的内存更多的内存,释放内存只有当释放的内存达到一定数量时?
我希望我的问题足够清楚。
可能重复:
堆栈内存如何增加?
让我们考虑一个使用分段的操作系统。
我的问题是:操作系统是否会接收堆栈指针的每次更改
并立即(或相当立即)分配/释放物理内存中的空间,
或者它使用一种聪明的策略来分配比您减少 sp 时所需的内存更多的内存,释放内存只有当释放的内存达到一定数量时?
我希望我的问题足够清楚。
如果我理解你在问什么,答案如下:
操作系统在进程创建开始时为堆栈分配一定的空间。当堆栈操作发生时,处理器会自动增加和减少堆栈指针,并且软件会减少堆栈指针以分配临时数据的空间(如在函数调用中)。递减是因为栈实际上是向下增长的,如果指针超过给定的分配空间就会发生栈溢出。分配的空间量因系统而异。操作系统可以做的唯一可能的“技巧”是分页,它可以将内存标记为已分配,但在软件使用它之前不会实际分配物理内存。这称为需求分页,并且在堆而不是堆栈中具有更多应用。
还要添加到上面的答案..
进程的堆栈向堆向下增长,操作系统必须确保这些区域不重叠。
当堆栈需要更多空间(即堆栈指针指向非法/未分配的内存)时,会导致页面错误。
PS:以上步骤来自我基于pintos OS的UG OS课程的OS作业,实际步骤可能会有所不同(在像linux这样的OS中会很复杂)。这里链接到部分堆栈增长见4.3.3节。