4

我正在阅读 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 的情况?

4

1 回答 1

2

免责声明:此答案不基于任何文档,而仅基于我对这些常量的解释。

我假设正确报告了页面大小。我假设分配粒度是指操作系统内存分配接口的粒度。

有这两种情况需要考虑:

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

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

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

于 2016-09-12T19:23:34.927 回答