1

私はコンピューティングサイエンスプロジェクトを行っています。私はCを使用してマルチプロセッサプログラミングを行っています。私たちの要件の1つは、メモリの小さなチャンクを割り当て続けることができないということです。必要に応じて、メモリを大きなチャンクに割り当てることができます。

したがって、プログラムで構造体を使用していると想像してください。そして、私のプログラムが機能する方法には、動的メモリ割り当てが必要です。しかし、私たちが使用しているハードウェアでは非常にコストがかかります。したがって、最善の解決策は、最初に大きなメモリプールを割り当て、必要に応じてこのプールからメモリを割り当てることです。

これが機能することを想定する方法は、これらの構造のビット配列を割り当て、このプールからメモリを割り当てて解放する独自のメモリ管理モジュールを作成することです。しかし、私はこれらのモジュールを書くための最も理想的な方法を知りたいです。メモリの管理に役立つライブラリはありますか、またはこれらを書き込む方法はありますか?

編集:これが私が使用しているプラ​​ットフォームです:Ubuntuを実行するAMDオプテロンシステム。オプテロンにはNUMAアーキテクチャがあり、メモリを割り当てるときにこれを利用したいと思います。したがって、mallocを使用する代わりに、 1つの特定のノードにメモリを割り当てるnuma_alloc_onnodeを使用します。これを使用してメモリの大きなチャンクを割り当ててから、メモリマネージャを使用してこのメ​​モリを管理したいと思います。

4

1 に答える 1

4

そこにはたくさんのメモリプールマネージャーがあり、いくつかは商用で、いくつかはオープンソースです。それらをご覧になり、概要を理解した後、ここでより具体的な質問をしてください。

いくつかのグーグルの結果(cメモリプールマネージャーオープンソース):

http://256stuff.com/sources/mpool/

http://www.ravenbrook.com/project/mps/

これは、このテーマに関するIBMの優れた記事です。

http://www.ibm.com/developerworks/linux/library/l-memory/

また、マルチプロセッサ環境について言及しているので(メモリ管理に直接関係していませんが)、これも読む価値があります。

http://drdobbs.com/go-parallel/article/showArticle.jhtml?articleID=217500206

アップデート

ライブラリの必要な移植性に応じて、さまざまなアプローチがあります。移植性が重要な場合、ライブラリは、malloc(またはcalloc)のラッパーを提示してメモリのチャンクを取得し、より効率的な実装を適用します(ライブラリが達成したい特定の目標に対して測定)。特定のOSを対象とするライブラリは、通常、ネイティブオペレーティングシステムコールを使用し、ある程度のパフォーマンスと、移植性を犠牲にしてそのオペレーティングシステムの詳細を活用する機能を獲得します。

メモリ管理ライブラリが目指す具体的な目標はさまざまです。これが私が何年にもわたって見たいくつかの目標です:

  • 大きなオブジェクトと小さなオブジェクトの個別の管理戦略
  • 長持ちするものと急速に削除されるものの別々の管理戦略
  • メモリ管理の問題のデバッグ(たとえば、割り当てられたメモリに特定のパターンを書き込み、最後に追加のパディングを割り当てて、デバッグ機能が範囲外のポインタアクセスによってパディングが上書きされたかどうかを確認できるようにします)
  • 特定のプラットフォームの制約が与えられた場合のより高速なメモリアクセス(たとえば、一部の割り当ては高価な場合があり、他の割り当ては比較的安価な場合があります)。
  • メモリの最適化をサポートします(たとえば、メモリにアクセスするための特別なセマンティクスを使用して、ポインタをポインタに実際に割り当てることによって)。

更新2

あなたの更新に基づいて...私の4番目の箇条書きが適用されます。NUMAアーキテクチャ用のヒープマネージャの作成に関する良い読み物です(記事の最後にあるソースコード)。

http://ebookbrowse.com/numa-aware-heap-memory-manager-article-final-pdf-d12526838

于 2012-02-24T23:17:59.917 に答える