【问题标题】:Where does malloc return memory?malloc 在哪里返回内存?
【发布时间】:2016-02-28 07:07:04
【问题描述】:

我正在学习 C 语言中的 malloc 函数。我知道如何请求内存

p = malloc(number_of_bytes);

并在以后不使用时释放它

free(p);

但我想知道一些比这更理论的东西:我知道虚拟内存有三种可能性:

  1. 虚拟地址不能分配物理存储(在页面文件或物理内存中)

  2. 虚拟地址可以在页面文件上有物理存储

  3. 虚拟地址可以在物理内存上进行物理存储

所以,我的问题是:

malloc 返回的内存在哪里(我的意思是,它是在页面文件上,还是在物理内存上(可能是堆?))?

【问题讨论】:

  • C++ 标签不合适
  • 这里有一些关于malloc内部实现的好读物:link

标签: c linux memory memory-management


【解决方案1】:

它在页面文件上,在物理内存上吗?

在具有虚拟内存管理的操作系统上,malloc 不知道它分配的虚拟内存如何映射到物理内存,这完全是设计使然。 malloc 在比虚拟内存管理器更高的级别上运行。到malloc操作系统提供的地址空间中的所有内存都是一样的。

有些页面可能从物理映射开始,只是稍后被换出到文件中,然后根据需要再回到内存中。但是,操作系统对您的程序透明地执行所有这些操作,因此malloc 不知道物理内存。

【讨论】:

    【解决方案2】:

    它是特定于实现的。在具有GNU libcmusl-libc 的Linux 上,malloc 经常调用mmap(2) system call 以从内核获取更多虚拟内存。 free 通常将内存区域标记为可供将来调用 malloc 重用,但偶尔(对于大内存区域)使用munmap 释放内存

    使用strace并研究相关源代码...(通常,malloc在Linux上的一些免费软件标准C库中实现)。我相信musl-libc 有一个可读性很好的malloc 实现

    详细了解processesvirtual address spacesvirtual memoryAdvanced Linux Programming

    另请参阅 proc(5) 并考虑 cat /proc/$$/mapscat /proc/self/maps 的输出

    特别是在 Linux 上,另请阅读 Linux memory overcommit。这是一个我不喜欢并且我正在禁用的功能......

    注意ASLR。您可以禁用它(例如,在 GDB 下拥有可重现的观察点)。

    要调试与malloc 相关的问题(尤其是memory leaks),请使用valgrind(以及最近的GCC 编译器,他们的-fsanitize= debugging options)。

    【讨论】:

    • 另外,Linux 使用延迟页面分配,因此在程序实际写入分配的内存之前,新的malloced 内存空间可能不会由物理内存或交换空间支持。在那之前,它可能只是占用页表中的地址空间,页面标记为“写时复制”。
    【解决方案3】:

    如果有的话,通常会在虚拟内存中分配。因此,我们假设它有一个,并且内存硬件由硬盘和 RAM 组成。如果物理内存 (RAM) 中没有可用空间,则会在硬盘内的页面文件中分配。

    堆是对象的内存,分配方式相同。只是为了澄清这里关于堆的概念,想象一个没有操作系统和虚拟内存的嵌入式应用程序,如果它是一个对象,它将被分配在物理内存 (RAM) 的堆区域中,如果不是,它将是分配在堆区域之外,但仍在物理内存 (RAM) 中。

    【讨论】:

      猜你喜欢
      • 2018-11-09
      • 1970-01-01
      • 1970-01-01
      • 2011-03-30
      • 1970-01-01
      • 2017-07-08
      • 2016-07-11
      • 1970-01-01
      • 2015-11-26
      相关资源
      最近更新 更多