記憶に関してアリーナという用語の意味は何ですか?


100

私はプログラミングの概念としてメモリに関する本を読んでいます。後の章の1つでは、作者は「アリーナ」という単語を多用していますが、決して定義していません。私は単語の意味とそれが記憶にどのように関連するかを検索しましたが、何も見つかりませんでした。以下は、著者が用語を使用するいくつかのコンテキストです。

「シリアライゼーションの次の例には、特定の分野からのメモリ割り当てと呼ばれる戦略が組み込まれています。」

「...これは、メモリリークを処理するとき、または特定の領域から割り当てるときに役立ちます。」

「...メモリの割り当てを解除する場合は、アリーナ全体の割り当てを解除します。」

著者は、1つの章で100回を超える用語を使用しています。用語集での唯一の定義は次のとおりです。

アリーナからの割り当て-最初にアリーナを割り当て、次にプログラム自体(プロセスメモリマネージャーではなく)によってアリーナ内の割り当て/割り当て解除を管理する手法。複雑なデータ構造とオブジェクトの圧縮とシリアル化、または安全が重要なシステムやフォールトトレラントシステムのメモリ管理に使用されます。

これらのコンテキストを与えられた誰かが私のためにアリーナを定義できますか?


本の名前は?
yaobin 2018年

1
Frantisek FranekによるCおよびC ++のプログラミングコンセプトとしての@yaobinメモリ。
Nocturno

回答:


109

アリーナとは、一度割り当てた大きな連続したメモリの一部であり、その後、そのメモリの一部を渡すことにより、メモリを手動で管理するために使用します。例えば:

char * arena = malloc(HUGE_NUMBER);

unsigned int current = 0;

void * my_malloc(size_t n) { current += n; return arena + current - n; }

ポイントは、メモリ割り当ての動作を完全に制御できることです。あなたのコントロールの外にある唯一のものは、初期割り当てのための単一のライブラリー呼び出しです。

1つの一般的な使用例は、各アリーナが1つの固定サイズのメモリブロックを割り当てるためにのみ使用される場合です。その場合、非常に効率的な再生アルゴリズムを作成できます。もう1つの使用例は、「タスク」ごとに1つのアリーナを持つことです。タスクが完了したら、アリーナ全体を一度に解放でき、個々の割り当て解除の追跡について心配する必要はありません。

これらの手法はそれぞれ非常に特殊化されており、通常は、自分が何をしているか、および通常のライブラリ割り当てが十分ではない理由を正確に知っている場合にのみ役立ちます。優れたメモリアロケータは既に多くの魔法をすでに実行していることに注意してください。自分でメモリの処理を開始する前に、十分ではないという十分な量の証拠が必要です。


25
良い答えですが、最後の段落を削除または修正することを検討してください。証拠はまったく必要ありません。どのようにメモリを使用するがわかっているときはいつでも、「優れた」汎用アロケーター以上のことを知っています。この知識を使えば、カスタムアロケーターが常に優先されます。アロケータは魔法ではありません。アリーナは、明確に定義された同じ時点ですべてが死亡するアイテムが多数ある場合に役立ちます。それはあなたが知る必要があるほとんどすべてです。それはロケット科学ではありません。
Andreas Haferburg 2016

11
@AndreasHaferburg:標準ライブラリのメモリアロケータは、独自のカスタムライティングよりも自動的に大きな利点があります。つまり、書き込み/テスト/デバッグ/保守などを行う必要がないということです。独自の割り当てを管理することでパフォーマンスを改善できますが、この改善がトレードオフに値することを決定する前に、十分な証拠が必要です。
ruakh

17
@ruakhどこでも「知恵」として何百万回も繰り返される、このカーゴカルトの考え方は好きではありません。「C ++の神々が私たちに与えてくれたので、それを使わなければなりません。」そして、私のお気に入り:「それは魔法です。」いいえ、それは魔法ではありません。これは、コンピュータでさえ実行できるほど単純なアルゴリズムに過ぎません。私の本では、それは魔法からは程遠いです。私の推測では、メモリ割り当てがパフォーマンスに与える影響を過小評価し、アリーナの複雑さを過大評価しています。開発者の時間よりもパフォーマンスが重要であるかどうかは、SOについて話し合うのは少し無意味なビジネス上の決定です。
Andreas Haferburg、2016年

8
@AndreasHaferburg:確かに、tcmallocは特定のアルゴリズムを使用しており、その背後にある考え方は簡単に説明できますが、実装は複雑であり、簡単ではありません。最も重要なのは、メモリの順序付けを正しく行うためにプラットフォーム固有の知識が必要であることです。ユーザーがまったく移植できない(効率的なミューテックス、tcmalloc、ラムダの型名など)か、極端な英雄的要素(std :: functionなど)のみを使用できるものには、「マジック」を使用します。「理解できない」という意味ではありません。
Kerrek SB、2016

12
@AndreasHaferburg:そして、私の最後のアドバイスは、原則として「デフォルトよりもよく知る」ことは難しいと言っているのではなく、カスタムソリューションを維持するためのコストが高いということです(誰かがそれを記述し、文書化し、入手する必要があります)そうです、そして誰か他の人がバグを修正しなければなりません、そして誰もが使用が広がったときに元の仮定をレビューして再検証しなければなりません)、そしてあなたはそのコストを正当化する証拠が必要です。
Kerrek SB、2016

10

私はこれを可能な答えとして使います。

•Memory Arena (also known as break space)--the area where dynamic runtime memory is stored. The memory arena consists of the heap and unused memory. The heap is where all user-allocated memory is located. The heap grows up from a lower memory address to a higher memory address.

ウィキペディアの同義語を追加します:リージョン、ゾーン、アリーナ、エリア、またはメモリコンテキスト。

基本的には、OSから取得して分割するメモリであり、一度にすべて解放できます。これの利点は、への小さな呼び出しを繰り返すmalloc()とコストがかかる可能性があることです(すべてのメモリ割り当てにはパフォーマンスコストがあります。プログラムの論理アドレス空間にメモリを割り当てるのにかかる時間と、そのアドレス空間を物理メモリに割り当てるのにかかる時間)。まるで、球場を知っているかのように、大量のメモリを取得して、必要に応じて変数に渡すことができます。


5

「ヒープ」の同義語と考えてください。通常、プロセスには1つのヒープ/アリーナしかなく、すべてのメモリ割り当てはそこから行われます。

ただし、場合によっては、一連の割り当てをグループ化する必要があります(パフォーマンスのため、断片化を回避するためなど)。その場合は、新しいヒープ/アリーナを割り当てることをお勧めします。その後、どの割り当てでも、どのヒープから割り当てるかを決定できます。

たとえば、同じサイズの多くのオブジェクトが頻繁に割り当てられたり割り当て解除されたりするパーティクルシステムがあるとします。メモリの断片化を回避するために、それらのパーティクルにのみ使用されるヒープから各パーティクルを割り当てることができ、他のすべての割り当てはデフォルトのヒープから行われます。


5

http://www.bozemanpass.com/info/linux/malloc/Linux_Heap_Contention.htmlから:

libc.so.x共有ライブラリにはglibcコンポーネントが含まれており、その中にヒープコードが存在します。ヒープの現在の実装では、アリーナと呼ばれる複数の独立したサブヒープを使用しています。各アリーナには、並行性保護のための独自のミューテックスがあります。したがって、プロセスのヒープ内に十分なアリーナがあり、スレッドのヒープアクセスをそれらの間で均等に分散するメカニズムがある場合、ミューテックスの競合の可能性は最小限になります。これは割り当てに適しています。malloc()では、現在のスレッドの現在のターゲットアリーナのミューテックスが解放されている(trylock)かどうかを確認するテストが行​​われます。そうであれば、アリーナはロックされ、割り当てが続行されます。ミューテックスがビジーの場合、残りの各アリーナが順番に試され、ミューテックスがビジーでない場合に使用されます。ブロックせずにロックできるアリーナがない場合は、新しい新しいアリーナが作成されます。このアリーナは定義上、まだロックされていないため、割り当てをブロックせずに続行できます。最後に、スレッドによって最後に使用されたアリーナのIDはスレッドローカルストレージに保持され、その後、そのスレッドによってmalloc()が次に呼び出されたときに最初に試行するアリーナとして使用されます。したがって、malloc()へのすべての呼び出しはブロックせずに続行されます。

このリンクを参照することもできます。

http://www.codeproject.com/Articles/44850/Arena-Allocator-DTOR-and-Embedded-Preallocated-Buf


3
リンクを投稿するときは、リンクされた記事が削除されても投稿が引き続き役立つように、要約を投稿する必要があります。
12

5
これはbozemanpass.com/info/linux/malloc/Linux_Heap_Contention.htmlからのコピーアンドペーストのようです。ソースをそのまま使用する場合は、クレジットを提供してください。
jscs 2012年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.