每线程内存分配

时间:2009-04-23 10:18:27

标签: c memory-management pthreads

我正在研究多线程应用程序的跟踪工具,尤其是内存分配。

我想要每线程内存分配。我知道当一个线程执行malloc时,使用的内存是全局堆。我想跟踪哪个线程分配了多少内存。

我在malloc上做了一个包装器,每次有一个malloc时递增值:

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

效果很好。问题在于free方法,它不会返回释放多少内存。

不要考虑我的解决方案,只是为了展示我的尝试。

编辑:

如上所述,保留自己的桌子是一个太沉重的方法。

3 个答案:

答案 0 :(得分: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);
}

这可以优化,但我希望你能得到这个想法......

答案 1 :(得分:1)

我能想到的唯一想法(虽然你可能认为这个)是保留这些列的分配表:

  • ThreadID(当然)
  • 指针
  • 分配大小

然后,您必须使用自己的 malloc 免费函数来执行实际的mallocing和释放,同时保持更新分配表。

这是出于调试目的吗?否则,维护此表的开销可能很大。

答案 2 :(得分:0)

这有点复杂。脱离我的头脑:

  • 使用为该指针分配的指针值和内存大小创建一个映射。
  • my_malloc中,使用size参数更新地图。
  • free编写自己的包装器,减去该线程的size(通过查找指针值检索)。