linux - 如何在没有系统调用的情况下在堆上分配内存?

标签 linux operating-system memory-management

我想知道是不是堆上需要的空间不够大 这样就不需要brk/sbrk系统all(移动数据段的中断指针(brk)),库函数(如malloc)如何在堆上分配空间。 我不是在问堆管理的数据结构和算法。我只是问如果 malloc 不调用系统调用,它如何获取堆的第一个位置的地址。我问这个是因为我听说并不总是需要调用系统调用 (brk/sbrk),因为这些只需要扩展空间。如果我错了请纠正我。

最佳答案

基本思想是当你的程序启动时,堆很小,但不一定为零。如果您只分配 (malloc) 少量内存,则库能够在加载时拥有的少量空间内处理它。然而,当 malloc 用完该空间时,它需要进行系统调用以获取更多内存。

该系统调用通常是 sbrk(),它将堆内存区域的顶部向上移动一定量。通常,malloc 库例程会将堆增加大于当前分配所需的大小,希望以后的分配可以在不进行系统调用的情况下执行。

malloc 的其他实现使用 mmap() 代替——这允许程序创建稀疏虚拟内存映射。然而,基于 mmap() 的 malloc 实现与基于 sbrk() 的实现做同样的事情:每个系统调用都保留比当前调用所需更多的内存。

查看此问题的一种方法是跟踪使用 malloc 的程序:您会看到,对于对 malloc 的 N 次调用,您将看到 M 次系统调用(其中 M 远小于 N)。

关于linux - 如何在没有系统调用的情况下在堆上分配内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9137394/

相关文章:

linux - 如何为静态文件创建原生 Debian 包?

exception - 缓存未命中是一种中断/故障吗

c - 内存管理和内存分配之间的区别。当分配/访问发生时它们都一起工作2内存|它们是如何精确相关的

linux - 谁调度线程?

objective-c - Objective-C/ARC 中的 dealloc 会释放局部静态变量吗?

python - 如果我在 Ubuntu 上开始学习 C,它会在我今年夏天晚些时候开始学习 Objective-C 时给我带来优势吗?

linux - OpenVZ 不会创建容器错误 "invalid value for DISKINODES"

c - 增加堆缓冲区大小的最佳方法

objective-c - 我必须自动释放这个对象吗?

c - 区分文件系统上的文件