ProudNet은 고성능 메모리 관리자가 내장되어 있습니다. 개발자는 고성능 메모리 관리자를 이용해서 응용 프로그램의 처리 성능을 가속할 수 있습니다.
ProudNet에서 지원하는 메모리 관리자는 크게 다음과 같습니다.
2.1Lookaside allocator
Lookaside allocator는 통상적인 memory pool 기법을 응용합니다. 만약 항상 동일한 크기의 메모리를 자주 할당/해제해야 한다면 Lookaside allocator를 사용하는 것이 좋습니다.
Lookaside allocator의 주요 메카니즘은 아래와 같습니다.
새로운 메모리 블럭을 할당할 때, 새로운 시스템 메모리가 할당된다.
메모리 블럭을 해제할 때, 해제된 블럭은 lookaside allocator에 반환된다.
다시 메모리 블럭을 할당할 때 lookaside allocator에 반환되었던 메모리 블럭이 재활용된다.
이 과정은 매우 빠른 속도로 실행됩니다. OS 환경에서의 메모리 할당 속도보다 훨씬 빠릅니다. 하지만 단점도 존재합니다.
Lookaside allocator는 항상 같은 크기의 메모리만 할당할 수 있습니다.
Lookaside allocator로 할당된 메모리 블럭은 Lookaside allocator가 파괴되기 전에 모두 해제되어야 합니다.
Lookaside allocator를 쓰는 방법은 다음과 같습니다.
먼저 Proud.CLookasideAllocator.New 메서드로 객체를 생성합니다. 전역 객체로 생성해도 됩니다.
Proud.CLookasideAllocator.Alloc 메서드로 메모리 블럭을 할당합니다.
해제는 Proud.CLookasideAllocator.Free 로 합니다. Realloc은 따로 존재하지 않습니다.
모든 메모리 블럭을 해제한 후 Proud.CLookasideAllocator 객체를 파괴합니다.
자세한 것은 Proud.CLookasideAllocator의 설명을 참고하십시오.
2.3 C++ 클래스의 기본 할당자로 지정하기도 본 모듈을 쓰는 좋은 방법 중 하나입니다.
2.2Fast heap
ProudNet의 Fast heap은 Lookaside allocator보다 약간 더 느리지만 OS 환경에서의 메모리 할당/해제 속도보다는 훨씬 빠릅니다. 그리고 Lookaside allocator와 달리 다양한 크기의 메모리 블럭을 할당/해제가 가능합니다.
ProudNet의 Fast heap의 구현 클래스는 Proud.CFastHeap입니다. Proud.CFastHeap 또한 lookaside allocator와 마찬가지로 모든 메모리 블럭이 파괴된 후에야 Proud.CFastHeap 객체를 제거할 수 있습니다.
Fast heap을 쓰는 방법은 다음과 같습니다.
먼저 Proud.CFastHeap.New 메서드로 fast heap 객체를 생성합니다. 전역 객체로 생성해도 됩니다.
Proud.CFastHeap.Alloc 메서드로 메모리 블럭을 할당합니다.
해제는 Proud.CFastHeap.Free로 합니다. CFastHeap.Realloc 으로 메모리 블럭을 재할당할 수 있습니다.
모든 메모리 블럭을 해제한 후 Proud.CFastHeap객체를 파괴합니다.
자세한 것은 Proud.CFastHeap의 설명을 참고하십시오.
2.3 C++ 클래스의 기본 할당자로 지정하기도 본 모듈을 쓰는 좋은 방법 중 하나입니다.
2.3C++ 클래스의 기본 할당자로 지정하기
Fast heap이나 Lookaside allocator를 C++ 클래스에서 가속을 쉽게 받는 방법은 C++의 operator new, delete 메서드를 오버라이드하는 것입니다. 이렇게 하면 C++ 클래스를 new, delete 연산자로 생성, 파괴할 때 시스템의 메모리 heap 대신 fast heap이나 lookaside allocator가 사용됩니다.
아래 예시에서, 클래스가 operator new나 delete로 인스턴스화할 때 고성능 메모리 관리자가 대신 메모리를 할당/해제하게 합니다.
class Example { static CLookasideAllocatorPtr gAlloc; // 혹은 CFastHeap을 써도 OK. public: void* operator new(size_t size) { return gAlloc->Alloc(size); } void operator delete(void* ptr, size_t size) { gAlloc->Free(ptr); } }; CLookasideAllocatorPtr Example::gAlloc(CLookasideAllocator::New()); // 혹은 CFastHeap을 써도 OK.
이들은 각각 서로 다른 장단점이 존재합니다. 적절히 선택을 하십시오.