【问题标题】:Clearing Memory in RAM?清除内存中的内存?
【发布时间】:2018-10-09 05:24:21
【问题描述】:

我有一些 c++ 代码用于分配内存并释放它,虽然 RAM 没有立即清除...我的疑问是(我使用的是 linux 操作系统)

1)操作系统是否需要时间来释放已释放的内存?

2)我们如何强制RAM按时间间隔清除释放的内存?

谢谢

【问题讨论】:

  • @Scheff:不知道为什么你会为此获得 +1;自从sbrk 有意义以来已经有几十年了。它确实是 1970 年代的功能。它肯定不是最新的。
  • @harish:我怀疑你对记忆的看法太天真了。对于初学者,您似乎忽略了 C++ 运行时是操作系统和代码之间的中介。而“清空”内存的想法似乎忽略了虚拟内存的分页机制。如果有的话,“清除”会使操作系统错误地认为您仍在积极写入内存

标签: c++ operating-system ram


【解决方案1】:

释放内存的主题比您想象的要复杂。有whole articles 专门用于分配和释放策略。

通常,大块分配给mmap(内存映射文件),它立即free 释放。小块内存是从一大块堆中分割出来的,即其大小由sbrk 系列函数管理。

释放从大堆中挖出的内存通常是通过将释放的块放入空闲列表(或类似列表)来完成的。空闲列表由 C 库管理,内核不通过 sbrk 释放。该进程无限期地保留已释放的块。

有时,堆末尾的连续内存区域位于空闲列表中。在这种情况下,C 库可能会决定缩小堆,并将内存归还给操作系统。这是很少见的情况,因为在堆的末尾有一小块内存就足以防止这种情况发生。

查看mallopt for Linux,了解如何控制free 发布策略的激进性。请注意,此调用不可移植,并且会从一个操作系统更改为另一个。此外,malloc_trim(0) 是一种不可移植的、仅限 Linux 的方法,用于强制 C 库将它可以返回的所有内存返回给操作系统。最有可能的是,您的操作系统有一个类似的非便携式调用以达到相同的目的。

通常,中小型内存块永远不会返回给操作系统,而是在进程的生命周期内保留在内部空闲列表中。对 malloc 的下一次调用通常会从这个空闲列表中分配内存。

强制释放内存的唯一方法是直接管理它,完全避免 malloc/free。您可以通过 mmap 分配一大块内存,然后在完成后取消映射。使用股票 malloc/free 很难确保分配(和空闲)是在 LIFO(后进先出)中完成的,否则会有一小块内存干扰向操作系统释放内存。

注意

详细信息因操作系统而异。 Windows 和 POSIX 系统有不同的策略和不同的内存映射原语。在没有虚拟内存的操作系统上,如 DOS,所有内存都可以立即返回给操作系统(没有 mmap,也没有 sbrk)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-20
    • 2014-01-13
    • 2016-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多