【问题标题】:Per thread memory allocation每线程内存分配
【发布时间】:2010-10-21 08:01:50
【问题描述】:

我正在开发用于多线程应用程序的跟踪工具,尤其是关于内存分配的跟踪工具。

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

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

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

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

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

编辑:

如上所述,保留自己的桌子是一种过于繁重的方法。

【问题讨论】:

    标签: c memory-management pthreads


    【解决方案1】:

    要不要把 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);
    }
    

    这可以优化,但我希望你明白...

    【讨论】:

    • 您分配了一个内存区域并返回了 'allocated area address'+2*sizeof(int) 所以在 myfree() 中你应该传递给 free() 的地址是 'mymalloc() 返回的地址'-2*sizeof(int),即'imem'。
    • 不错的解决方案,我喜欢!谢谢
    【解决方案2】:

    我能想到的唯一想法(尽管您可能考虑过这一点)是保留一个包含这些列的分配表:

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

    然后,您将不得不使用自己的 ma​​llocfree 函数来执行实际的 mallocing 和 freeing,同时还要保持分配表的更新。

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

    【讨论】:

      【解决方案3】:

      这有点复杂。在我的头顶上:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-07-22
        • 2020-02-11
        • 2018-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-18
        • 2021-01-23
        相关资源
        最近更新 更多