책 정리/Modern C++ Design
4장, 작은 객체에 대한 메모리 할당 : 4 - 메모리 풀에서 할당 기능을 어떻게 만들 것인가?
최익필
2010. 9. 25. 18:00
이 포스트를 만든 목적
- 정리 해보려고
이 포스트의 준비물
- Firefox 3.6.10
참고 서적
- Modern C++ Design 중 Chapter 4.5 부분
내용
3부에서는 Chunk 를 만들어 보았다면, 4부에서는 Chunk를 그룹화 하여 사용 하는 방법에 대해서 다룬다.
맛보기 코드
chunkgroup.hpp 부가 설명
1. 우선 Chunk::is_useable 과 Chunk::is_has 멤버 함수를 추가 했다. 추가 이유는 다음과 같다.
- 해당 Chunk가 사용 가능한지 판별하기 위해
- 사용할 수 없을 경우, 새로운 청크를 만들어야 하기 때문이다.
- 해당 Chunk가 특정 메모리를 보유하고 있는지 판변하기 위해
- 메모리를 해제해야 할 경우, 가지고 있어야만, 정상 해제할 수 있기 때문이다.
2. ChunkGroup 의 내부에서 Chunk들은 vecter<Chunk *> 로 가지고 있다. 이유는 다음과 같다.
- Chunk *인 이유는 vector의 사이즈가 변할 때, Chunk 의 내부가 변할 수 있기 때문이다.(복사 --> 소멸)
- 어차피 순차로 접근할 수 밖에 없는 상황이므로, 자료구조는 vecter 가 좋기 때문이다.
순차접근이 아닐 경우, 다른 자료구조를 쓰면 퍼포먼스를 올릴 수 있으나, 메모리 사용량을 감수해야 한다.
3. Chunk 자체는 자신의 크기를 모르고 ChunkGroup이 Chunk 에게 블럭크기, 갯수를 알려 준다.
- 이 메모리 풀은 작은 객체를 위한 메모리 할당기이므로 메모리 사용량을 줄이는게 목표에 있다.
4. Chunk *ChunkGroup::pcurrent_chunk_ 는 캐쉬 기능 역활을 한다.
- 할당 및 해제 작업할 때, 해당 Chunk의 포인터를 저장해 두었다가, 찾지 않고 바로 사용한다.
- 삭제와 할당이 다른 Chunk 에서 비번이 발생 할 경우, 캐쉬 기능을 원할이 수행하지 못한다. ;(
chunkgroup.hpp 문제점
- Chunk 의 갯수를 늘리기만 할 뿐, 줄이는 기능은 없다.
- 일정 크기에서 멈추겠지만, 최악의 경우, 메모리 고갈 상태가 올 수도 있다. ;(
- 아직까지 사용이 불편하다.
- 예를 들어, 객체 크기 3, 4, 5, 6, 7, 8 이 있을 경우, 각각 관리하는 방법이 수작업 밖에 없다.
여담
- 여러 객체 크기에 따른 관리는 다음에 5부에서 다루겠다.