2009. 9. 22. 17:21

Thread Safe Memory Pool Templete 공유

Thread Safe가 지원되는 Memory Pool을 공유합니다.
효율은 어느정도 되는지 측정하지 않았지만,
최소한, C++의 new / delete 보다는 훨씬 빠를 것입니다.

Memory Pool 이라는것이, 한꺼번에 Memory를 Alloc 받고, 그 영역을 나누어 사용하는 것이라 하겠죠.
따라서, new / delete 가 굉장히 빈번히 있는 프로그램에서는 Memory Pool 사용이 훨씬 유연하리라 봅니다.

open source 진영에서도 많은 Memory Pool이 등장합니다.
Pool을 모두 할달 했을때의 할당 요청은 NULL을 리턴하는등,
뭐, 제가 만든 것은 많이 단순한 것으서 기능은 많지 않습니다.

그래도, simple is best, 속도는 좀 빠르더군요. (정량적으로 측정하진 않았습니다.)

API는 다음과 같이 구성됩니다.
  • CMemoryPoolTmpl<TYPE,nBucketSize>
    ; TYPE : Memory Pool에서 사용될 TYPE을 지정합니다.
    ; nBucketSize : MemoryPool의 Size를 지정합니다. 만약, 4096개의 TYPE을 capacity로 한다면,
      4096/32=128, 즉, 128개로 지정합니다. 이와 같이, nBucketSize는 MAX TYPE 개수를 32로 나눈값으로
      지정합니다.
  • DWORD CMemoryPoolTmpl::CreateMemoryPool(VOID)
    ; 한꺼번에 Memory를 Alloc 합니다.
    ; Win32 Error Code가 리턴됩니다.
  • VOID CMemoryPoolTmpl::DestroyMemoryPool(VOID)
    ; Memory Pool을 DeAlloc 합니다.
  • inline TYPE* CMemoryPoolTmpl::Alloc(VOID)
    ; TYPE 하나를 할당받습니다. 이미 꽉 찬 상태라면,  NULL이 리턴됩니다.
  • inline VOID CMemoryPoolTmpl::Free(TYPE* *ppData)
    ; 할당된 *ppData를 받아, 할당 해제 합니다. 그리고, *ppData 값을 NULL로 만들어 줍니다.

소스 코드는 다음과 같습니다.



그리고, 그 사용예는 다음과 같습니다.