2016-09-12 7 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; 
} 

することができますように、SE pagesize上記のコードでは(すなわち、割り当ての単位である)dwPageSizeとdwAllocationGranularity間の最大として計算されます。 私が知っていることは、これらの2つの値の間の関係の種類です:ここでは逆さまに説明された方法で値を計算する必要がありますか?そして、dwPageSizeがdwAllocationGranularityよりも大きい可能性がある状況はありますか?

+0

関連性のないメモ - jemallocを使用すると、すべての点でtcmallocより優れています。 – rustyx

+0

割り振り粒度をページより小さくすることは、私が見る限りではあまり賢明ではありませんが、公式には除外されていないと言えます。おそらく、Googleはちょうどここで慎重である。 –

+1

これを書いたプログラマは、 "ページサイズ"の意味を理解していません。粒度は常にページサイズの整数倍でなければならず、決して小さくすることはできません。細分性は、アドレス空間の断片化に対する簡単な対策です。それは永久に64KBでした。割り当て内のすべてのページが同じ保護属性を持つことは保証されていません。[this post](http://stackoverflow.com/a/19466079/17034)を参照してください。 –

答えて

2

免責事項:この回答はドキュメントに基づくものではなく、これらの定数の私の解釈に基づいています。

ページサイズが正しく報告されていると仮定します。割り当ての粒度は、OSのメモリ割り当てインターフェイスの粒度を参照していると仮定します。

を検討するために、これらの2例があります。

  • は、割り当ての粒度がページサイズよりも大きいです。ページのサイズのメモリブロックを割り当てることは、実際にはより大きなリソースの割り当てにつながるため、これを防止する必要があります。

  • 割り当ての粒度はページサイズよりも小さい。アロケーション粒度のサイズのメモリブロックを割り当てることは、依然としてページ全体が割り当てられ/マッピングされることにつながるので、防止されるべきである。

基本的にどちらの場合も、OSは要求されたよりも多くのメモリを割り当てます。最大値を使用することにより、これを避けることができ、(ユーザスペース)割り当てコードは、実際のメモリ使用量に関して(相対的に)特定できる。

+1

あなたの推論はかなり正しいです。 ** SYSTEM_INFO **データ構造のドキュメント(https://msdn.microsoft.com/en-us/library/windows/desktop/ms724958(v=vs.85).aspx)は、** dwPageSize ** ページのサイズとページ保護とコミットメントの粒度です。 ** VirtualAlloc **関数で使用されるページサイズです。次に** dwAllocationGranularity **は、仮想メモリを割り当てることができる開始アドレスの粒度です。私の疑いは、この2つの値が厳密にシステム定義されているか、より柔軟でカスタマイズ可能であるかどうかです。 –