2016-09-12 59 views
4

我正在閱讀Google的TCMalloc源代碼(Windows移植)。dwPageSize和dwAllocationGranularity之間的關係

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大?

+0

無關的註釋 - 使用jemalloc,它在各方面都優於tcmalloc。 – rustyx

+0

就我所見,分配粒度小於頁面的分配粒度並不是很明智,但據我所知,它還沒有被正式排除。據推測,谷歌在這裏只是謹小慎微。 –

+1

寫這個的程序員不明白「頁面大小」是什麼意思。沒有關係,除了粒度必須始終是頁面大小的整數倍並且永遠不會變小。粒度是針對地址空間碎片的簡單對策。它永遠是64KB。它不*保證分配中的所有頁面具有相同的保護屬性,請參見[本文](http://stackoverflow.com/a/19466079/17034)。 –

回答

2

免責聲明:這個答案不是基於任何文檔,而是基於我對這些常量的解釋。

我認爲頁面大小是正確報告的。我假設分配粒度是指OS內存分配接口的粒度。

有這兩種情況考慮:

  • 的分配粒度大於頁面大小。分配一個頁面大小的內存塊會導致實際更大的資源分配,因此應該阻止它。

  • 分配粒度小於頁面大小。分配一個分配粒度大小的內存塊仍然會導致整個頁面被分配/映射,因此應該阻止它。

基本上這兩種情況都會導致操作系統分配更多的內存比請求。通過使用最大值,可以避免這種情況,使得(用戶空間)分配代碼可以相對於其實際的存儲器使用情況(相對)確定。

+1

你的推理非常正確。 ** SYSTEM_INFO **數據結構的文檔(https://msdn.microsoft.com/zh-cn/library/windows/desktop/ms724958(v=vs.85).aspx)告訴** dwPageSize ** 是頁面大小和頁面保護和承諾的粒度。這是** VirtualAlloc **函數使用的頁面大小。那麼** dwAllocationGranularity **是可以分配虛擬內存的起始地址的粒度。我的疑問是,如果這兩個值是一種嚴格的系統定義或更靈活和可定製的。 –