2

私のアプリケーションはほとんどレイヤーで構成されているため、 APR メモリ プールのようなものが最善の方法であることがわかりました。

ここここC++ placement newの投稿についてSOを読んでいる間、およびより一般的なC割り当ての質問で、ある投稿で提案されているように、階層型プールアロケーターを手作りすることを考えていましたが、純粋なNYIの伝統では、このようなものがすでにあるかどうかを最初に尋ねています存在します。

また、未使用のメモリを OS に戻すことができるという優れた特性を持つこともできます (割り当ては で行うことできるためmmap(MAP_ANON)) 。

4

2 に答える 2

5

別の優れた階層メモリ アロケータを知っていますが、それは裏で呼び出しmallocます。

tallocは、デストラクタを備えた階層型プール ベースのメモリ アロケータです。これは Samba4 で使用されるコア メモリ アロケータであり、Samba4 開発の多くの面で大きな違いをもたらしました。

talloc を使い始めるには、talloc ガイドを読むことをお勧めします。

そうは言っても、Glibc はmallocすでにmmap(MAP_ANON)より大きな割り当てを使用しておりmmap_threshold、これは 経由で設定できますmallopt(M_MMAP_THRESHOLD, bytes)。デフォルトでは、動的に調整されます

/*
  MMAP_THRESHOLD_MAX and _MIN are the bounds on the dynamically
  adjusted MMAP_THRESHOLD.
*/

#ifndef DEFAULT_MMAP_THRESHOLD_MIN
#define DEFAULT_MMAP_THRESHOLD_MIN (128 * 1024)
#endif

#ifndef DEFAULT_MMAP_THRESHOLD_MAX
  /* For 32-bit platforms we cannot increase the maximum mmap
     threshold much because it is also the minimum value for the
     maximum heap size and its alignment.  Going above 512k (i.e., 1M
     for new heaps) wastes too much address space.  */
# if __WORDSIZE == 32
#  define DEFAULT_MMAP_THRESHOLD_MAX (512 * 1024)
# else
#  define DEFAULT_MMAP_THRESHOLD_MAX (4 * 1024 * 1024 * sizeof(long))
# endif
#endif

下げる場合は注意してください。デフォルトでは、#define DEFAULT_MMAP_MAX 65536を使用してピースが割り当てられることはありませんmmap。これは で変更できますがmallopt(M_MMAP_MAX, count)、多くmmapの を使用するとオーバーヘッドが生じます。

環境変数MALLOC_MMAP_THRESHOLD_などもこれらのオプションを設定します。

明らかに、 でmalloc割り当てるメモリmmapは で解放されmunmapます。これが Glibc のソース コード以外のどこかに文書化されているかどうか、または互換性が保証されているかどうかはわかりません。

于 2009-05-07T17:34:58.467 に答える