2009-04-23 9 views
3

저는 멀티 스레드 응용 프로그램을위한 추적 도구, 특히 메모리 할당에 대해 작업하고 있습니다.스레드 당 메모리 할당

스레드 별 메모리 할당이 필요합니다. 스레드가 malloc을 수행 할 때 사용되는 메모리는 전역 힙이라는 것을 알고 있습니다. 얼마나 많은 메모리를 할당했는지 추적하고 싶습니다.

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

그것은 잘 작동 :

나는 같은 malloc에이 값을 매번 증가, malloc에 ​​따라 래퍼를했다. 문제는 free 메서드에서 발생합니다.이 메서드는 해제 된 메모리 양을 반환하지 않습니다.

내 솔루션을 고려하지 말고, 내가 시도한 것을 보여 주기만하면됩니다.

편집 :

내 자신의 테이블이 너무 무거운 방법입니다 유지, 위 했나요한다.

답변

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 (무효 * 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

당신은 free()에 전달해야하는 주소가 'mymalloc()에서 반환 된 주소'인 myfree()에서 메모리 영역을 할당하고 '할당 된 영역 주소'+ 2 * sizeof (int)는 'imem'입니다. –

+0

좋은 해결책, 나는 그것을 좋아한다! 감사 –

0

좀 더 복잡합니다. 머리 상단에서 :

  • 해당 포인터에 할당 된 포인터 값과 메모리 크기로 맵을 생성하십시오.
  • my_malloc에서 size 인수로지도를 업데이트하십시오.
  • free에 대한 랩퍼를 작성하여 해당 스레드에 대한 포인터 값을 조회하여 size을 빼십시오.
1

내가 생각할 수있는 유일한 생각은 (당신이 아마도 이것을 고려했지만) 할당 테이블을 오순절로 유지하는 것입니다.

(물론)
  • ThreadID
  • 포인터

그런

  • 할당 크기, 당신은 실제 mallocing와 해방을 위해 자신의 의 malloc무료 기능을 사용해야합니다, 할당 테이블을 갱신 된 상태로 유지하는 것이다.

    디버깅 용입니까? 그렇지 않으면이 테이블을 관리하는 오버 헤드가 커질 수 있습니다.