4

私はマルチスレッドアプリケーション用のトレースツール、特にメモリ割り当てに取り組んでいます。

スレッドごとのメモリ割り当てが欲しいのですが。スレッドがmallocを実行する場合、使用されるメモリはグローバルヒープであることを私は知っています。どのスレッドがどのくらいのメモリを割り当てたかを追跡したいと思います。

私はmallocにラッパーを作成し、mallocが存在するたびに次のように値をインクリメントしました。

void *mymalloc(size_t size) {
    mem_used[thread_id] += size;
    return malloc(size);
}

それはうまくいきます。問題は、free解放されたメモリの量を返さないメソッドにあります。

私の解決策を考慮に入れないでください、それは私が試したことを示すためだけです。

編集:

上で述べたように、私自身のテーブルを維持することはあまりにも重い方法です。

4

3 に答える 3

8

mymallocを次のように変更するのはどうですか。

int* mymem = malloc(size + sizeof(int)*2);
mymem[0] = thread_id;
mymem[1] = size;
mem_used[thread_id] += size;
return &mymem[2].

次に、myfree(void * mem)で、次のようにします。

void myfree(void* mem)
{
    int* imem = (int*)(mem - sizeof(int)*2);
    int thread_id = imem[0];
    int size = imem[1];
    mem_used[thread_id] -= size;
    free(imem);
}

これは最適化することができますが、私はあなたがアイデアを得ることを願っています...

于 2009-04-23T10:28:17.263 に答える
1

私が考えることができる唯一の考えは(おそらくこれを考慮しているとはいえ)、これらの列に割り当てテーブルを保持することです。

  • ThreadID(もちろん)
  • ポインタ
  • 割り当てられたサイズ

次に、独自のmalloc関数free関数を使用して、実際のmallocと解放を実行するだけでなく、割り当てテーブルを最新の状態に保つ必要があります。

これはデバッグ目的ですか?そうしないと、このテーブルを維持するためのオーバーヘッドが大きくなる可能性があるためです。

于 2009-04-23T10:29:20.537 に答える
0

もう少し複雑です。頭のてっぺんから:

  • ポインタ値とそのポインタに割り当てられたメモリサイズを使用してマップを作成します。
  • my_mallocで、引数を使用してマップを更新しますsize
  • そのスレッドの(ポインター値を検索して取得する)をfree減算するための独自のラッパーを作成します。size
于 2009-04-23T10:27:29.280 に答える