boost/pool이야기
1 개요 #
이 라이브러리는 풀링을 사용하는데 있어서 상당한 융통성을 얻을 수 있는 몇몇 인터페이스들을 제공합니다. boost/pool개념 문서를 참조해서 풀링이 어떻게 동작하는지를 이해하는게 좋습니다.
2.1 객체 용법(object usage) vs 싱글톤 용법(singleton usage) #
객체 방식은 각각의 풀이 생성 및 소멸되는 객체로서 존재하는 방식입니다. 풀 객체가 소멸하면 풀 안에 할당된 모든 메모리 청크들도 메모리 해제됩니다.
싱글톤 방식은 각각의 풀에 대한 생명주기가 static으로서 존재하는 방식입니다. 다시말하면, 이 방식에서의 풀은 프로그램이 종료할 때까지 소멸되지 않습니다. 싱글톤 방식에서의 풀 객체들은 공유상태에 놓일 수 있습니다. 따라서 싱글톤 방식에서는 쓰레드 안전성을 보장하고 있습니다. (내부적으로 뮤텍스를 적용하여 동기화를 구현하고 있습니다) 싱글톤 방식 풀 객체에 의해 할당된 시스템 메모리는 release_memory 또는 purge_memory 메소드를 통하여 해제할 수 있습니다.
2.2 메모리 부족 상태 : 예외 vs NULL 반환 #
몇몇 풀 인터페이스는 메모리 부족시 예외를 일으키지만, 그렇지 않다면 0을 반환합니다. 일반적으로 표준을 따르라고 지시않는한, 풀 인터페이스는 항상 예외를 발생하는 것 대신 0을 반환하는 것을 더 선호합니다.
3.1 pool #
pool 인터페이스는 NULL 반환기반의 간단한 객체 방식 인터페이스입니다. 예는 다음과 같습니다.
void func()
{
boost::pool<> p(sizeof(int));
for (int i = 0; i < 10000; ++i)
{
int * const t = p.malloc();
... // t에 대해서 무언가를 한다. 단, t를 free()하지는 않는다.
}
} // 함수가 종료하면, p는 소멸되며 malloc()된 모든 int값들은 조용히 해제된다.
3.2 object_pool #
object_pool 인터페이스는 NULL 반환방식의 객체 방식 인터페이스입니다만, 메모리 청크들을 할당할때마다 객체의 타입을 인식하도록 되어있습니다. 소멸시점에서 object_pool 인터페이스를 통해 할당된 모든 청크들은 자신들의 소멸자가 호출됩니다.
struct X { ... }; // 별도의 처리를 담고 있는 소멸자를 가지고 있다고 하자.
void func()
{
boost::object_pool<X> p;
for (int i = 0; i < 10000; ++i)
{
X * const t = p.malloc();
... // t에 대해서 무언가를 한다. 단, t를 free()하지는 않는다.
}
} // 함수가 종료하면, p는 소멸되며 X객체들에 대해 각각 모두 소멸자들이 호출된다.
3.3 singleton_pool #
singleton_pool 인터페이스는 NULL 반환방식의 싱글톤 용법 인터페이스입니다. 싱글톤 용법을 사용한다는 것을 제외하고 pool 인터페이스와 동일합니다.
struct MyPoolTag { };
typedef boost::singleton_pool<MyPoolTag, sizeof(int)> my_pool;
void func()
{
for (int i = 0; i < 10000; ++i)
{
int * const t = my_pool::malloc();
... // t에 대해서 무언가를 한다. 단, t를 free()하지는 않는다.
}
// 명시적으로 malloc()된 모든 int값들을 해제합니다.
my_pool::purge_memory();
}
3.4 pool_alloc #
pool_alloc 인터페이스는 예외 방식을 적용한 싱글톤 용법 인터페이스입니다. 이 인터페이스는 singleton_pool 인터페이스를 기초로 만들어졌으며, 표준 할당자 호환 클래스를 제공합니다.(다시말하면 STL 컨테이너에서 사용하는 것이 가능합니다)
void func()
{
std::vector<int, boost::pool_allocator<int> > v;
for (int i = 0; i < 10000; ++i)
v.push_back(13);
} // 이 함수가 종료하더라도 pool 할당자에 의해 할당된 시스템 메모리를 해제하지 "않습니다"
// 이 시스템 메모리를 강제로 해제하려면 boost::singleton_pool<boost::pool_allocator_tag, sizeof(int)>::release_memory() 을 호출해야만 합니다.









![[http]](/wiki/imgs/http.png)
