c++ - mmap : enforce 64K alignment

标签 c++ c posix

我正在将(由我)为 Windows 编写的项目移植到移动平台。

我需要 VirtualAlloc (+friends) 的等价物,自然是 mmap。但是,有 2 个显着差异。

  1. VirtualAlloc 返回的地址保证是所谓的分配粒度 (dwAllocationGranularity) 的倍数。不要与页面大小混淆,这个数字是任意的,在大多数 Windows 系统上是 64K。相比之下,mmap 返回的地址只能保证页面对齐。

  2. 可以通过调用 VirtualFree 立即释放保留/分配区域,无需传递分配大小(即 VirtualAlloc 中使用的大小) )。相比之下,应该为 munmap 指定要取消映射的确切区域大小,即它释放给定数量的内存页面,而与它们的分配方式无关。

这给我带来了问题。虽然我可以接受 (2),但 (1) 是一个真正的问题。我不想深入细节,但假设更小的分配粒度(例如 4K)将导致严重的效率下降。这与我的代码需要在分配区域内的每个粒度边界处放置一些信息有关,这会在连续的内存区域内强加“间隙”。

我需要解决这个问题。我可以考虑分配增加区域的非常天真的方法,以便它们可以 64K 对齐并且仍然具有足够的大小。或者保留大量的虚拟地址空间区域,然后分配正确对齐的内存区域(即实现一种对齐的堆)。但我想知道是否有其他选择。例如特殊的 API,可能是一些标志、 secret 系统调用或其他任何东西。

最佳答案

(1)其实很容易解决。如您所见,munmap 采用大小参数,这是因为 munmap 能够部分 释放。因此,您可以分配一 block 比您需要的更大的内存,然后释放未对齐的部分。

关于c++ - mmap : enforce 64K alignment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31411730/

相关文章:

c++ - 在 C++ 类构造函数中初始化 Char 数组成员

c++ - 在加入的线程上调用 pthread_cancel 会导致 linux 下的段错误

c - 如何绕过 Linux VFS inode 缓存?不将 inode 添加到其 super_block 列表是否安全?

c - 如果线程在调用 pthread_mutex_lock() 时没有成功,会发生什么情况?

c++ - 当 QFileDialog::getOpenFileName 窗口打开时,程序意外结束

c# - 使用 C++/CLI 作为 'middleware' 使用 native C++ 中的 .NET 类

C中putchar的字符集

计算最接近的浮点值

java - 更改文件夹中文件的文件权限

regex - Posix Regex 的负向后查找解决方法