Operating system 如何保护堆区域免受堆栈干扰&;反之亦然?

Operating system 如何保护堆区域免受堆栈干扰&;反之亦然?,operating-system,Operating System,堆栈总是向下增长而堆总是向上增长吗? 如果是这样,那么操作系统如何保护堆区域不受堆栈的干扰,反之亦然? 如果不是,那么哪些因素会影响它?操作系统版本?编译程序?还有别的吗?是的,通常情况就是这样。这方面的实现细节由操作系统管理,差异很大。举一个非常简单的例子,假设堆栈从内存中较高的地址开始,而堆从较低的地址开始。如果跟踪堆的顶部和堆栈的顶部,在堆上放置更多的数据,在堆栈上放置更多的数据,它们最终会在这两者之间的某个地方相遇,因为正如您所说,堆栈向下增长,而堆向上增长。当这种情况发生时,内存就用完

堆栈总是向下增长而堆总是向上增长吗?
如果是这样,那么操作系统如何保护堆区域不受堆栈的干扰,反之亦然?

如果不是,那么哪些因素会影响它?操作系统版本?编译程序?还有别的吗?

是的,通常情况就是这样。这方面的实现细节由操作系统管理,差异很大。举一个非常简单的例子,假设堆栈从内存中较高的地址开始,而堆从较低的地址开始。如果跟踪堆的顶部和堆栈的顶部,在堆上放置更多的数据,在堆栈上放置更多的数据,它们最终会在这两者之间的某个地方相遇,因为正如您所说,堆栈向下增长,而堆向上增长。当这种情况发生时,内存就用完了,所以你需要跟踪的就是这两个发生碰撞的时间


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

“有些进程有自己的堆”。这是什么意思?是否存在共享公共堆的某些进程?如果是这样的话,共享内存的用途是什么?堆上的所有内容(无论是在一个大的公共堆中还是每个进程的单个小堆中)都通过分页进行保护。这意味着,即使堆在物理上可能被定位为一个大的连续块,但它的每个单独部分仅对从一开始就分配它的进程可见。这意味着进程无法从其他进程读取数据。共享内存的作用是将一个进程堆中的数据映射到另一个进程堆中,或者将所有进程都可以全局读取的数据映射到另一个进程,以允许它们相互查看数据。所有这些都是通过分页完成的。