一尘不染

mmap如何工作?

linux

我正在Linux上需要从硬盘驱动器获取mmap文件的程序,但是我有一个问题,是什么会使它失败。就像所有的内存碎片化一样,每个只有200M,但是我想将一个文件映射到1000M的内存中,它将成功吗?

另一个问题是,Linux中是否有任何工具可以像Windows中的某些工具那样来回收内存,例如xp的内置工具。

谢谢。


阅读 271

收藏
2020-06-07

共1个答案

一尘不染

mmap() 使用地址超出了程序的堆区域,因此堆碎片化不是问题,除非它可以使堆占用更多空间并减少映射可用空间。

如果有许多映射文件,则在地址空间相对受限的32位系统上,可能会出现碎片问题。在64位系统上,碎片化不太可能成为问题,因为即使在现有映射之间只有很小的区域可用,与现有映射相邻的仍然有很多可用的连续地址空间。

在32位系统上,更常见的问题是地址空间太小,根本无法映射大文件。在4GB的地址空间中,通常有2GB的空间可供用户空间使用,其他2GB的空间则由内核保留。在可用的2GB空间中,您的映射必须与程序的代码共享空间,堆栈(通常很小)和堆(可能很大)。

简而言之,mmap()如果文件太大,通常会在32位系统上失败,但是您不可能拥有足够大的文件来在64位系统上引起该问题。

如果要创建私有的写时复制映射,由于缺少交换空间,它也可能会失败。内核必须确保可用RAM和交换的总和足够大,以容纳映射的大小,以防万一您修改了所有页面,以便内核被迫对其全部进行私有副本。共享映射应该不会出现此问题,因为可以将更改刷新到磁盘上的文件,然后在内存不足时可以丢弃页面,并在以后从磁盘重新加载。

当然,如果您没有访问文件的权限,或者它不是可以映射的文件类型(例如目录或套接字),则映射也会失败。

不清楚您对重新收集内存的含义。请记住,mmap()消耗的稀缺资源不是内存,而是 地址空间
。即使计算机实际上仅具有128MB的内存,也可以映射1GB的文件,但是在32位系统上,即使计算机具有16GB的内存,也不能映射4GB的文件。

虚拟内存的概念对于理解功能至关重要mmap(),因此,如果您还不熟悉虚拟内存,请仔细阅读。

2020-06-07