【问题标题】:How heap area is protected from the interference of the stack & vice-versa?如何保护堆区域免受堆栈的干扰,反之亦然?
【发布时间】:2012-06-22 10:50:07
【问题描述】:

堆栈总是向下增长而堆总是向上增长吗?
如果是这样,那么操作系统如何保护堆区域免受堆栈的干扰,反之亦然?
如果不是,那么影响它的因素有哪些?操作系统版本?编译器?还有什么吗??

【问题讨论】:

    标签: operating-system


    【解决方案1】:

    是的,通常是这种情况。其实现细节由操作系统管理并且变化很大。举一个非常简单的例子,假设堆栈从内存中的较高地址开始,而堆则从较低地址开始。如果您跟踪堆的顶部和堆栈的顶部,并且将更多数据放在堆上,将更多数据放在堆栈上,它们最终会在两者之间的某个地方相遇,因为正如您所说,堆栈向下增长而堆向上增长。发生这种情况时,内存已用完,因此您只需要跟踪这两者何时发生冲突。

    对于一个真正的操作系统,这通常不是那么简单,因为每个进程都有自己的堆栈,有些有自己的堆,我们可能正在处理实际物理位置可能在任何地方的虚拟内存地址。您可以假设每个堆和堆栈都有一个地址和一个限制,这些地址和限制构成了每个进程可以使用的最大内存量的边界。如果达到此限制,操作系统需要告诉进程它内存不足或尝试找到更多内存来分配给内存不足的进程。

    【讨论】:

    • "有些有自己的堆" 。这是什么意思?是否存在一些共享公共堆的进程?如果是这样,共享内存有什么用?
    • 堆上的所有内容(无论是在一个大的公共堆中还是在每个进程的小单独堆中)都通过分页保护。这意味着即使堆在物理上可能位于一个连续的大块中,但它的每个单独部分仅对从一开始就分配它的进程可见。这意味着进程无法从其他进程读取数据。共享内存的作用是将数据从一个进程的堆映射到另一个进程,或者将数据映射到所有进程都可以全局读取,以允许它们彼此查看数据。所有这些都是通过分页来完成的。
    猜你喜欢
    • 1970-01-01
    • 2013-10-29
    • 2011-07-30
    • 2022-01-14
    • 2015-07-27
    • 2019-03-17
    • 2017-08-28
    • 2014-04-17
    • 2017-12-23
    相关资源
    最近更新 更多