分配“弱”内存页面

时间:2015-12-19 22:02:59

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

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

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

我可以通过在malloc()之上粘贴一个框架来解决这个问题,以便在malloc() NULL出来的情况下释放旧版本,但它会剥夺其他内存进程并使其成为页面out(或将解压缩的部分分页)。或者,我可以在应用程序中保留一些软限制,但这似乎是随意的,只能缓解问题,如果周围有空闲内存则不是最理想的。我觉得这是现代操作系统中的虚拟内存管理器应该处理的事情。

有关如何在其他现代应用程序中解决此问题的任何提示和信息,我们表示赞赏。

1 个答案:

答案 0 :(得分:1)

不,普通操作系统中没有机制可以像你描述的那样实现弱用户空间内存。

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

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

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

祝你好运。