4

Linux で C++ 用の Hoard アロケータを作成する必要があります。アルゴリズムは非常に単純ですが、アロケーターデータ (ヒープなど) をどこに (どのように) 格納するかわかりません

それが私の見方です。アロケーターはプロセスではなく、どのアプリケーションでも使用できる関数のセットです。すべてのアプリには独自のヒープがあります。

  1. アプリの起動時、何が起こっていますか?
  2. また、ヒープが既に作成されていることをアロケータがどのように検出するのでしょうか?
  3. アロケーターが (アプリを閉じるときに) ヒープを作成、保存、および破棄する方法は?
  4. 関数が呼び出されたとき、それがどのスレッド (またはどのプロセッサ) で実行されているかを調べる方法は?
4

3 に答える 3

2
  1. アロケーターが設計され、アプリケーションの起動コードにフックされて、オペレーティング システムからメモリを先制的に要求しない限り、アプリの起動中にはおそらくあまり発生しません。
  2. ヒープは実際には作成されません。割り当てシステムは、オペレーティング システムがメモリを必要とするとき (最初のセットアップのため、または後で要求された割り当てを満たすために余分なメモリが必要な場合) に、オペレーティング システムにメモリを要求します。UNIX ライクなシステムでは、よく使用されるシステム コールは と呼ばれsbrkます。(厳密に言えば、Linux ではsbrk、システム コールのライブラリ関数ラッパーbrkです。これは、重要な違いである場合とそうでない場合があります。)
  3. アロケータは、sbrk上記の呼び出しを使用してオペレーティング システムからメモリを取得します。その後、そのメモリを管理するのはそれ自体です。アプリケーションが終了すると、オペレーティング システムはメモリを再利用します。つまり、呼び出しを介して何を渡したかを認識しているsbrkため、どのメモリを取り戻す必要があるかを認識しています。
  4. 特定のコードがどのスレッドまたはプロセッサで実行されているかはほとんど問題になりません。質問のコンテキストをもう少し詳しく説明していただければ、お答えします。
于 2012-03-16T05:34:02.017 に答える
1

アプリの起動時、何が起こっていますか?

アプリケーションが起動すると、アロケータが初期化されます。必要に応じて、アロケーターへの最初の呼び出しでこれを行うことができます。

また、ヒープが既に作成されていることをアロケータがどのように検出するのでしょうか?

質問に従っているかどうかわかりません。このアロケーターを使用するコードによって管理されるヒープについて話している場合、ヒープを作成したときに追跡エントリを作成するため、それがわかります。他のプロセスのヒープについて話している場合、または他のアロケータによって作成されたヒープについて話している場合は、とにかくそれらのヒープを使用できないため、気にしません。

アロケーターが (アプリを閉じるときに) ヒープを作成、保存、および破棄する方法は?

通常、低レベルと高レベルのアロケーターがあります。低レベルのアロケータは、オペレーティング システムから生のメモリ チャンクを取得するだけです。正確なメカニズムはプラットフォーム固有です。高レベル アロケーターはヒープを管理し、低レベル アロケーターからヒープ構造を保持するためのメモリを取得します。

関数が呼び出されたとき、それがどのスレッド (またはどのプロセッサ) で実行されているかを調べる方法は?

スレッド固有のデータを使用するか、プラットフォーム固有の「スレッド ID の取得」関数を呼び出すことで、どのスレッドを見つけることができます。どのプロセッサについては、プラットフォーム固有であり、入手するまでに情報が古くなっている可能性があります。ほとんどのプラットフォームにはそのような機能がありますが、これは最適化 (ロックの競合を減らすため、またはキャッシュ ヒット率を向上させるため) としてのみ使用できることを覚えておいてください。重要なことに、スレッドはいつでもあるプロセッサから別のプロセッサに移動できるため、ロックをバイパスするために使用することはできません。

正直なところ、優れたパフォーマンスを提供し、プラットフォーム間で移植可能なメモリ割り当ては、実際には非常に巧妙な方法です。この分野の専門家でない場合、本番アプリケーションに必要なパフォーマンスと安定性を提供するアロケータを開発できる可能性はほとんどありません。

于 2012-09-14T21:09:52.363 に答える
1

「Hoard アロケータを書く」とはどういう意味ですか? 誰かがすでにこのアロケーターを書いています。C++ から使用しようとしていますか? Emery Berger の Hoard の内部動作は、ホワイト ペーパーHoard: a scaled memory allocator for multithreaded applicationsで非常に詳細に説明されています。答えがないものは、ソースを読むか、作者に連絡することでいつでも解決できます。メーリングリストがなかったらびっくりです。

于 2012-03-16T07:04:51.797 に答える