【问题标题】:Allocating "weak" memory pages分配“弱”内存页
【发布时间】:2015-12-19 22:02:58
【问题描述】:

我很想知道是否有办法在 Linux、OS X 或 Windows 等常见操作系统的用户空间中分配“弱”内存(显然,标准接口不可能)。我的意思是那种mmap(),如果操作系统选择将页面推出核心,这将使映射无效。

假设,我想在 32 位系统上使用 10G 数据集。为了从这个数据集中得到一个片段,我从文件中读取它并将它解压缩到内存 [.如果可能的话,我宁愿保留这些片段的解压缩版本,以避免在每次访问时解压缩数据,但为了允许访问所有片段,我最终必须释放一些数据以避免耗尽内存/地址空间。

如果malloc() NULLs out,我可以通过在malloc() 上粘贴一个框架来模拟这一点,但它会剥夺其他进程的内存并使它们页出(或页出解压片)。或者,我可以在应用程序中保留一些软限制,但这似乎是任意的,只能缓解问题,如果周围有可用内存,则不是最佳的。我觉得这是现代操作系统中的虚拟内存管理器应该处理的事情。

感谢任何有关如何在其他现代应用程序中解决此问题的提示和信息。

【问题讨论】:

  • 你的意思是要建一个缓存系统?
  • 我更愿意利用已经内置在操作系统中的缓存,可能使用特定于平台的系统调用
  • 这与每个现代操作系统已经进行的分页有何不同?
  • 如果我正确理解分页的工作原理,在这种情况下,我绝不希望操作系统将我的页面保存到磁盘(并重新读取它们),而是向我发出它们已被丢弃的信号
  • 解压缩原始数据可能比读取/写入未压缩页面更快(我已编辑问题以消除这种混淆)

标签: c caching memory memory-management virtual-memory


【解决方案1】:

不,常见的操作系统中没有实现您所描述的弱用户空间内存的机制。

弱引用来自垃圾回收框架的领域,否则对象/分配被放弃(即没有“强”引用)。如果垃圾收集器在应用程序尝试通过将弱引用分配给“强”引用来回收它之前到达分配,则弱引用将被无效/无效。

您在问题和后续 cmets 中描述的功能可以通过应用程序缓存更好、更简单地实现,该缓存在缓存填满并用新需要的“页面”覆盖它们时丢弃“页面”。如果缓存可以被多个线程访问,请小心实现互斥锁。互斥体(如果需要)是这里最奇特的东西。其他一切都是非常标准的香草编程。

通过学术练习,您可以使用设备驱动程序在内核级别实现您所描述的概念,这意味着该功能将作为伪设备公开。我非常不愿意在这个伪设备上实际建立生产实现,因为它对可移植性和可维护性有负面影响,可能会对整个平台的性能和行为产生不利影响(毕竟我们在这里谈论的是内核代码),并且会比较需要很长时间来开发和测试。

祝你工作顺利。

【讨论】:

    猜你喜欢
    • 2011-12-15
    • 2015-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-04
    • 2011-09-03
    相关资源
    最近更新 更多