C 分配;“弱”;内存页

C 分配;“弱”;内存页,c,caching,memory,memory-management,virtual-memory,C,Caching,Memory,Memory Management,Virtual Memory,我很想知道,在Linux、OS X或Windows等常见操作系统中,是否有办法在用户空间中分配“弱”内存(标准接口显然不可能实现)。我的意思是一种mmap(),如果操作系统选择将页面推出核心,则会使映射无效 比如说,我想在32位系统上使用10G数据集。为了从这个数据集中获取一个片段,我从文件中读取它并将其解压缩到内存[。如果可能的话,我宁愿保留片段的解压缩版本,以避免每次访问时解压缩数据,但为了允许访问所有片段,我必须最终释放一些数据,以避免耗尽内存/地址空间 我可以通过在malloc()上粘贴

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

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

我可以通过在
malloc()
上粘贴一个框架来模拟这种情况,如果
malloc()
NULL
s out,则释放旧的片段,但它会剥夺其他进程的内存并使它们进行分页(或分页已解压缩的片段)或者,我可以在应用程序中保留一些软限制,但这似乎是任意的,只会缓解问题,如果周围有空闲内存,这是次优的。我觉得这是现代操作系统中虚拟内存管理器应该处理的事情


任何关于如何在其他现代应用程序中解决此问题的提示和信息,我们都将不胜感激。

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

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

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

作为一个学术练习,您可以在内核级别使用设备驱动程序实现所描述的概念,这意味着该功能将作为一个伪设备公开。我不太愿意将生产实现真正建立在这个伪设备上,因为它会对可移植性和可维护性产生负面影响d会对整个平台的性能和行为产生不利影响(毕竟我们在这里讨论的是内核代码),相比之下,开发和测试会花费很长时间


祝你好运。

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