Распределение памяти по потокам - PullRequest
3 голосов
/ 23 апреля 2009

Я работаю над инструментом трассировки для многопоточных приложений, особенно над распределением памяти.

Я хотел бы выделить память для каждого потока. Я знаю, что когда поток выполняет malloc, используемая память является глобальной кучей. Я хотел бы проследить, какой поток выделил, сколько памяти.

Я сделал обертку для malloc, увеличивая значения каждый раз, когда есть malloc как:

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

Хорошо работает. Проблема в методе free, который не возвращает объем освобожденной памяти.

Не принимайте во внимание мое решение, оно просто показывает, что я пытался.

EDIT:

Как упомянуто выше, хранить мой собственный стол - слишком сложный метод.

Ответы [ 3 ]

8 голосов
/ 23 апреля 2009

как насчет изменения 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 голос
/ 23 апреля 2009

Единственная мысль, о которой я могу подумать (хотя вы, вероятно, рассмотрели это), - это сохранить таблицу распределения с этими столбцами:

  • ThreadID (конечно)
  • Указатель
  • Выделенный размер

Затем вам придется использовать свои собственные функции malloc и free , чтобы выполнять фактическую блокировку и освобождение, а также обновлять таблицу выделения.

Это для отладки? Потому что в противном случае затраты на ведение этой таблицы могут быть значительными.

0 голосов
/ 23 апреля 2009

Это немного сложнее. С вершины моей головы:

  • Создать карту со значением указателя и объемом памяти, выделенным для этого указателя.
  • В вашем my_malloc обновите карту с помощью аргумента size.
  • Напишите свою собственную обертку для free, вычитая size (который вы получаете, просматривая значение указателя) для этого потока.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...