dwPageSize和dwAllocationGranularity之间的关系

我正在阅读Google的TCMalloc源代码(Windows移植)。

int getpagesize() { static int pagesize = 0; if (pagesize == 0) { SYSTEM_INFO system_info; GetSystemInfo(&system_info); pagesize = std::max(system_info.dwPageSize, system_info.dwAllocationGranularity); } return pagesize; } 

正如你可以在pagesize (这是分配的单位)上面的代码片段计算为dwPageSize和dwAllocationGranularity之间的最大值。 我的意思是要了解这两个价值之间的关系:是否有必要按照上面解释的方式来计算价值? 是否有任何情况下,dwPageSize可能大于dwAllocationGranularity?

免责声明:这个答案不是基于任何文档,而只是根据我对这些常量的解释。

我假设页面大小正确报告。 我假定分配粒度是指OS内存分配接口的粒度。

有这两种情况需要考虑:

  • 分配粒度大于页面大小。 分配一个页面大小的内存块会导致实际上更大的资源分配,因此应该避免。

  • 分配粒度小于页面大小。 分配一个分配粒度大小的内存块仍然会导致整个页面被分配/映射,因此应该被阻止。

基本上这两种情况都会导致操作系统分配更多的内存比请求。 通过使用最大值可以避免这种情况,使得(用户空间)分配代码可以相对于其实际的存储器使用情况(相对)确定。