madvise:不明白

时间:2014-05-15 12:17:36

标签: c linux ram mmap

背景:

我在旧笔记本电脑上运行。我总共512Mo只有128Mo ram。没钱买更多的公羊。

我使用mmap来帮助我规避这个问题并且效果很好。 C代码。 Debian 64位。

问题:

除了我所有的努力,我的内存很快就知道了,而且我想知道我是否可以释放我读过的mmaped区域以释放我的ram。

我认为madvise可以提供帮助,尤其是选项MADV_SEQUENTIAL

但我不太了解全貌。

需要:

在读取区域后能够释放mmaped已分配的内存,这样它就不会用大文件填充我的整个ram。我不会很快读到它,所以对我来说是垃圾。将它保留在ram中毫无意义。

更新:我没有完成该文件,因此不想致电munmap。我有其他的东西与它有关,但在其他地区。随机读取。

2 个答案:

答案 0 :(得分:2)

对于mmap() ed文件的随机读/写访问权限,MADV_SEQUENTIAL可能不是很有用(实际上可能会导致意外行为)。在这种情况下,MADV_RANDOMMADV_DONTNEED会是更好的选择。但是,请注意内核可以自由地忽略任何madvise() - 虽然在我的理解中,Linux目前没有,因为它倾向于将madvise()更多地视为命令而非咨询......

另一个选项是mmap()根据需要只选择文件的选定部分,并munmap()当你完成它们时,可能会保留一些当前活动的少量数据库映射(即,如果需要,一次映射多个区域,但仍然限制它)。

答案 1 :(得分:0)

当然,当你完成这些资源时,你必须释放资源,以免泄漏资源,从而过早耗尽可用空间。

不确定问题是什么,如果您知道mmap(),那么你肯定也知道munmap()吗?它就在同一个手册页上。