我很想知道,在Linux、OS或Windows等常见操作系统中,是否有办法在用户空间中分配“弱”内存(使用标准接口显然是不可能的)。我的意思是一种mmap(),如果操作系统选择将页面推到内核之外,它将使映射无效。
比方说,我想在32位系统上使用10G数据集。为了从这个数据集中获取一块数据,我从文件中读取它并解压缩到内存中。如果可能的话,我更喜欢保留片段的解压缩版本,以避免在每次访问时解压缩数据,但为了允许访问所有片段,我最终必须释放一些数据,以避免耗尽内存/地址空间。
我可以通过在malloc()上粘贴一个框架来模拟这一点,以便在malloc() NULL耗尽时释放旧的部分,但它会剥夺其他进程的内存并使它们页出(或者说将解压缩的部分页出)。或者,我可以在应用程序中保留一些软限制,但这似乎是任意的,只会缓解问题,如果周围有空闲内存,则是次优的。我觉得这是现代操作系统中的虚拟内存管理器应该处理的事情。
任何关于如何在其他现代应用程序中解决此问题的提示和信息都将受到欢迎。
发布于 2015-12-20 10:31:26
不,在普通操作系统中没有实现您所描述的弱用户空间内存的机制。
弱引用来自垃圾收集框架的域,其中对象/分配被放弃(即没有“强”引用)。如果垃圾收集器在应用程序试图通过将弱引用分配给“强”引用来回收它之前到达分配,那么弱引用将无效/为空。
你在问题和后续评论中描述的功能可以通过应用程序缓存更好、更简单地实现,当缓存填满并用新需要的“页面”覆盖它们时,它会丢弃“页面”。如果缓存可以被多个线程访问,则要小心实现互斥锁。互斥量(如果需要)是这里最奇特的东西。其他的一切都是非常标准的普通编程。
通过学术练习,您可以使用设备驱动程序在内核级别实现您正在描述的概念,这意味着该功能将公开为伪设备。我非常不愿意实际地将生产实现建立在这个伪设备上,因为它对可移植性和可维护性有负面影响,可能会对整个平台的性能和行为产生不利影响(毕竟我们在这里讨论的是内核代码),而且相比之下,开发和测试将需要很长时间。
祝你的努力顺利。
https://stackoverflow.com/questions/34375847
复制相似问题