메모리 풀

메모리 풀(memory pool)은 고정된 크기의 블록을 할당하여 malloc이나 C++의 new 연산자와 유사한 메모리 동적 할당을 가능하게 해준다. malloc이나 new 연산자 같은 기능들은 다양한 블록사이즈 때문에 단편화를 유발시키고, 파편화된 메모리들은 퍼포먼스 때문에 실시간 시스템에서 사용할 수 없게 된다. 좀더 효율적인 방법은 memory pool이라고 불리는 동일한 사이즈의 메모리 블록들을 미리 할당해 놓는 것이다. 그러면 응용 프로그램들은 실행 시간에 핸들에 의해서 표현되는 블록들을 할당하고, 접근하고, 해제할 수 있다.

많은 실시간 운영 체제들은 Transaction Processing Facility와 같은 메모리 풀을 사용하고 있다.

아파치 웹 서버와 같은 몇몇 시스템들은 나중에 한번에 해제되는 다양한 사이즈의 할당자들을 관리하는 것을 메모리 풀이라고 한다. 이를 region이라고도 한다.

샘플 메모리 풀 구현 
간단한 메모리 풀 모듈은 컴파일 시간에 응용 프로그램에 최적화된 크기의 블록으로 3개의 풀을 할당할 수 있다. 응용 프로그램은 다음의 인터페이스를 이용해서 메모리를 할당, 접근, 해제할 수 있다.
 풀들로부터 메모리를 할당. 함수는 필요한 블록이 적합한 풀을 결정할 것이다. 풀의 모든 블록들이 이미 예약되어 있다면, 함수는 그 다음으로 큰 풀에서 찾기를 시도한다. 할당된 메모리 블록은 핸들에 의해서 표현된다.
 할당된 메모리에 대한 액세스 포인터 접근.
 이전에 할당되었던 메모리 블록 해제.
 예를 들면, 핸들은 unsigned int 데이터 형으로 구현될 수 있다. 모듈은 내부에서 핸들을 분리해서 풀 인덱스나 메모리 블록 인덱스, 버전으로 해석할 수 있다. 풀과 메모리 블록 인덱스는 핸들에 대응되는 블록에 빠르게 접근할 수 있게 해주고, 이미 해제된 메모리 블록의 핸들을 감지하도록 해준다.

메모리 풀 vs malloc 
이점
 메모리 풀은 일정한 실행 시간으로 메모리 할당을 할 수 있도록 한다(단편화없이). malloc을 사용해서 메모리가 할당된 각각의 오브젝트들은 각각 따로 메모리 해제를 해주어야 하는 반면에 풀 내에서 할당된 수많은 오브젝트들에 대한 메모리의 해제는 단 한번의 조작으로 가능하다.
 메모리 풀들은 계층구조적으로 그룹화될 수 있으며, 이러한 그룹화는 loop나 재귀함수같은 특별한 프로그래밍 구조에 적합할 수 있다.
 고정된 크기의 블록 메모리 풀들은 각각의 할당된 메모리 블록에 대한 메타정보 및 할당된 블록의 사이즈 같은 설명을 보관할 필요가 없다. 특히 작은 크기의 할당에서는 상당한 공간을 절약할 수 있다.
단점
 메모리 풀들은 메모리 풀을 사용하는 응용 프로그램에 따라 조정되어야 한다.

참고 자료 
 Programming with Memory Pools

같이 보기 
 메모리 풀 시스템
 Free list

외부 링크 
 PJLIB Reference: Fast Memory Pool
 Pool Concepts
 A Memory Allocator

메모리 관리