블로그 이미지
Every unexpected event is a path to learning for you.

카테고리

분류 전체보기 (2737)
Unity3D (817)
Programming (474)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (228)
협업 (58)
3DS Max (3)
Game (12)
Utility (136)
Etc (96)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (53)
Android (14)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday
04-20 00:00

메모리를 할당받기 위해 사용하는 malloc() 함수는 일반적으로 glibc에 포함된 메모리 할당자에서 구현이 되어있다. 현재 glibc에서 사용하는 메모리 할당자는 ptmalloc(http://www.malloc.de/en/) 이다.

메모리 할당자의 역할은 brk/sbrk/mmap 등을 사용해서 시스템으로부터 큰 메모리 영역을 할당 받아서, 이것을 적절하게 분할하여 어플리케이션이 요청하는 메모리 할당을 처리하게 된다. 즉, malloc()을 호출하더라도 항상 시스템콜을 통해서 시스템으로부터 메모리를 할당 받는게 아니다. 그리고 반대로 메모리를 해제하는 경우도 즉시 시스템으로 반환되지 않고, 메모리 할당자가 자유 메모리 리스트에 추가해서 나중에 프로그램이 다시 메모리 할당을 요청하는 경우 재사용하게 된다.

따라서 빈번하게 메모리를 할당하고 반납하는 프로그램의 경우 메모리 할당자에서 단편화(fragmentation)가 발생해서 실제로 요청한 메모리보다 더 많은 메모리를 시스템으로부터 할당받는 문제가 발생하게 된다. mallinfo()를 사용하면 시스템으로부터 얼마를 할당받았고, 실제 사용은 얼마나 하고 있고, 사용은 안하지만 반납은 안한 메모리가 얼마인지 등의 메모리 사용량 정보를 자세히 확인할 수 있다. 그러나 struct mallinfo 구조체의 멤버들이 int 타입으로 되어있어서 사용량이 큰 경우 제대로된 결과를 표시할 수 없는 문제점이 있다.

그래서 규모가 큰 어플리케이션들은 glibc의 기본 메모리 할당자인 ptmalloc이 메모리 단편화 문제가 심하다고 하여 다른 메모리 할당자를 사용하는 경우도 있다. FireFox의 jemalloc이 대표적인 예이다.

현재 개발 중인 메모리 기반의 데이터베이스 프로그램도 이런 메모리 단편화 문제로 상당히 많은 양의 메모리를 손해 보는 문제가 있었다. 대략 1MB 당 0.2MB의 메모리가 단편화로 손해 보는 것으로 조사 되었다.

그래서 이런 문제를 해결하기 위해 Google Perf-tool(http://code.google.com/p/google-perftools/)에 포함된 TCMalloc 메모리 할당자를 도입해서 사용했다. TCMalloc은 속도도 빠르고 메모리 단편화 문제도 ptmalloc에 비해 상당히 적었다. 그러나 시스템으로부터 할당받은 메모리를 전혀 반환하지 않는 점이 단점이라고 할 수 있다. 즉, 메모리를 한번이라도 할당 받으면, 해당 메모리는 프로그램이 해제를 하더라도 시스템으로 전혀 반환되지 않고 프로세스가 다음에 사용할 때까지 잡고 있는 것이다.

만약 프로그램의 메모리 할당 패턴을 정확하게 알고 있다면 자신만의 메모리 할당자를 만드는것도 한 방법일 수 있다. 하지만 brk/sbrk 시스템콜은 프로세스의 데이터 세그먼트를 선형적으로 확장해서 메모리를 할당받기 때문에 반환 과정을 구현하기가 쉽지 않다. 반면에 mmap은 속도는 조금 느리지만 할당받은 메모리를 munmap으로 쉽게 반환할 수 있는 장점이 있다. 즉, 프로그램이 사용할 전체 메모리량을 미리 예측할 수 있다면 해당 크기만큼 mmap으로 할당 받아서 적절하게 분배하여 사용한 후 munmap으로 반환하도록 구현하면 된다.


<참고 자료>
* Advanced Memory Allocation
* Building your own memory manager for C/C++ projects



반응형

'Programming > C/C++' 카테고리의 다른 글

[펌] C++, 가상함수,순수가상함수  (2) 2010.03.14
[펌] 프로그램, 프로세스, 스레드  (0) 2010.03.13
[펌] 동기화 객체  (1) 2010.03.13
[펌] 유니코드 코드변환  (0) 2010.03.13
[펌] 문자열 인코딩  (0) 2010.03.13
Posted by blueasa
, |