堆是如何在进程之间分配的?

Posted

技术标签:

【中文标题】堆是如何在进程之间分配的?【英文标题】:How is the heap divided up among processes? 【发布时间】:2022-01-16 08:44:07 【问题描述】:

我知道每个进程都有自己的独立堆,与线程不同(它们共享一个公共堆,因此会减慢堆内存分配,因为 malloc 等函数需要使用锁进行同步)。但是,如何确定分配给每个进程的内存的位置和数量,以及如何确保这不会与分配给其他进程的内存冲突?

我无法通过搜索找到明确的答案,但如果存在,请提供一个链接,我将不胜感激。谢谢!

【问题讨论】:

【参考方案1】:

为了回答这个问题,您需要了解虚拟内存。在虚拟内存中,内存对于用户进程可以看到的内容是连续的。堆被赋予了非常大的虚拟内存,它仅受物理 RAM 数量和交换空间的限制,以支持分配。进程本身只看到一个连续的虚拟地址空间。在 Linux 上,内存分配是使用伙伴算法完成的,内核为每个页面保留一个页面结构。因此,task_struct 中的页面结构和进程的内存映射允许 Linux 内核跟踪哪些页面是空闲的,哪些不是。

【讨论】:

以上是关于堆是如何在进程之间分配的?的主要内容,如果未能解决你的问题,请参考以下文章

进程/线程/堆/栈之间的关系

如何验证两个检查点之间是否已释放所有内存分配?

如何在父进程和子进程之间发送带有 pipe() 的矩阵?

我是如何学习写一个操作系统:进程的调度

(小奇JAVA面试)每日10道Java面试题打卡—Java基础篇3

UCOSII 如何分配任务之间的延时节拍时间