【发布时间】:2015-07-14 16:01:57
【问题描述】:
我正在将一个(由我编写的)为 Windows 编写的项目移植到移动平台。
我需要VirtualAlloc (+friends) 的等价物,自然是mmap。但是有 2 个显着差异。
VirtualAlloc返回的地址保证是所谓的分配粒度 (dwAllocationGranularity) 的倍数。不要与页面大小混淆,这个数字是任意的,在大多数 Windows 系统上是 64K。相比之下,mmap返回的地址只能保证页面对齐。保留/分配的区域可以通过调用
VirtualFree立即释放,无需传递分配大小(即VirtualAlloc中使用的大小)。相比之下,munmap应该被赋予要取消映射的确切区域大小,即它释放给定数量的内存页面,而与它们的分配方式没有任何关系。
这给我带来了麻烦。虽然我可以接受(2),但(1)是一个真正的问题。我不想详细说明,但假设分配粒度小得多,例如 4K,将导致严重的效率下降。这与我的代码需要在分配区域内的每个粒度边界放置一些信息有关,这会在连续的内存区域内施加“间隙”。
我需要解决这个问题。我可以考虑分配增加区域的非常幼稚的方法,以便它们可以 64K 对齐并且仍然具有足够的大小。或者保留巨大的虚拟地址空间区域,然后分配正确对齐的内存区域(即实现一种对齐的堆)。但我想知道是否有替代品。例如特殊的 API、可能是一些标志、秘密系统调用或其他任何东西。
【问题讨论】: