본문 바로가기

프로그래밍/미분류

front end allocator / back end allocator

반응형

최근 힙을 망가뜨리는 버그를 처리해야 했다. 그래서 힙에 대해 이런 저런 책을 찾아 보면서 공부를 좀 했는데, 이해가 안 되는 부분이 있었다.


실전 윈도우 디버깅 (advanced windows debugging) 을 보면, 힙의 구조에 대해 설명하면서 매우 비슷한 리스트인 front end allocator 와 back end allocator 에 대해 설명한다. 책에서의 설명에서는 둘 다 특정 크기의 배열을 가지고 있고, 각 배열은 대략 특정 크기의 사용이 해제된 메모리 블록 리스트의 헤더를 가지고 있다. 이런 식으로 메모리 블록을 관리하다가, 다시 할당 요구가 오면 다시 내어주고 하는 데 이 두 구조가 쓰이는 것 같다. 그런데, 이 둘은 매우 비슷하면서도 아주 살짝씩 다르다.

두 가지의 설명이 매우 비슷하고, 각 구조를 설명하는 그림도 매우 비슷해서 다른 두가지를 설명하고 있는 것인지, 아니면, 하나에 대한 설명을 다시 반복하는지를 구분하기가 힘들었다. (가뜩이나 뭔소리 하나 싶은 독서였다.)

다른 것이란 것까지 알게 된 이후에도 왜 두가지를 가지고 있는지가 궁금했다. 그에 대한 해답이 다음 문단에 나와 있는 것 같다.


http://www.blackhat.com/presentations/bh-usa-09/MCDONALD/BHUSA09-McDonald-WindowsHeap-PAPER.pdf


[생략]

XP SP3과 Win2K3 에서 힙 관리자는 구조적으로 분리되어 있는 두 요소로 구성된다. 프론트 엔드 힙 매니저는 고성능의 전면 서브시스템이고, 백 엔드 힙 매니저는 견고한 일반목적의 힙 구현이다.

프론트 엔드 매니저

[생략]

LAL 프론트 엔드는 1024 바이트 이하의 할당 요구를 담당한다. 크기가 0-1024 사이의 다양한 free 메모리 청크를 관리하는 단일 링크리스트 구조체의 배열을 이용한다. LFH 프론트 엔드는 크기가 0-16K 를 처리하고, 16K 이상의 모든 할당은 백 엔드가 처리한다.

프론트 엔드 매니저는 힙 성능을 최적화하기 위해 존재하는 것이다. LAL과 LFH는 low-contention, lock-free / atomic-swap 기반의 operation 을 사용하여 구현되었으며, 따라서 동시성이 높은 시스템에서 좋은 성능을 나타낸다. LAL은 특정 블록크기에서 동작하며, 동작이 최대한 빠르게 이루어지게 하기 위해서 블록 나누기, 블록 합치기를 하지 않는다. LFH 는 동시성 성능과 더불어 힙 조각화도 신경쓰기 때문에, 이것보다 훨씬 복잡하다. LFH는 메모리와 캐시 사용성을 높이기 위한 목표를 가지고 동작한다. 이 논문 뒤에서 프론트 엔드에 더 상세하게 논할 것이다.


즉, 백엔드는 좀 더 커다란 메모리 블록까지 관리할 수 있는 범용적인 관리자이고, 프론트 엔드는 속도에 중점을 둔 관리자인 듯 하다.

728x90