当前位置: 首页 > 面试题库 >

mmap如何工作?

唐博文
2023-03-14
问题内容

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

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

谢谢。


问题答案:

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

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

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

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

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

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

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

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



 类似资料:
  • 问题内容: 我已经编写了一个Linux驱动程序,该驱动程序ioremaps将特定设备的PCI BAR0导出为sysfs二进制属性,允许用户空间直接控制它。 当我尝试在属性顶部使用MMAP来直接访问该位内存(从Userland程序)时,问题就浮现了。读取可以很好地完成并返回期望值,尽管当我写入该内存时,它似乎被缓存在内核和内存之间的某个地方,而不是传递给GM​​CH根联合体(以及设备)。我想做的是每

  • mmap(建立内存映射) 相关函数 munmap,open 表头文件 #include <unistd.h> #include <sys/mman.h> 定义函数 void *mmap(void *start,size_t length,int prot,int flags,int fd,off_t offsize); 函数说明 mmap()用来将某个文件内容映射到内存中,对该内存区域的存取即是直

  • mmap 建立内存映射 相关函数 munmap,open 表头文件 #include <unistd.h> #include <sys/mman.h> 定义函数 void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offsize); 函数说明 mmap()用来将某个文件内容映射

  • 8. mmap mmap可以把磁盘文件的一部分直接映射到内存,这样文件中的位置直接就有对应的内存地址,对文件的读写可以直接用指针来做而不需要read/write函数。 #include <sys/mman.h> void *mmap(void *addr, size_t len, int prot, int flag, int filedes, off_t off); int munmap(

  • 与malloc'相同大小的内存和手动读取整个文件到malloc'区域相比,这有什么不同?

  • 问题内容: 我正在尝试在用户空间中使用mmap读取“ mem_map”开始的物理内存。它是一个包含所有物理页面的数组。这是一台运行3.0内核的i386计算机。 代码是这样的: 我以此为根。输出为: 可以肯定的是,我搜索了问题并将以下行添加到我的/etc/sysctl.conf文件中: 但这也不起作用。 谁知道为什么不允许这样的mem_map操作,以及如何解决呢? 谢谢。 问题答案: 听起来好像内核