지금까지 열심히 Implicit Free List에 대해 다루었다. 이제부턴 아직 소개하지 않은 Method들인 Explicit Free List와 Segregated Free List에 대해 알아보자.
Explicit Free List는 '현재 Block의 Size' 뿐만 아니라 'Next Free Block의 주소값'도 저장하는 방식이다.
당연히 공간적인 관점에서는 Implicit Free List가 더 유리하다.
Implicit Free List에선 Boundary Tags 방법을 사용하지 않는다고 보았을 때 Extra Space가 1Word면 충분하다.
반면, Explicit Free List에선 2Words가 필요한 것이다.
아래 그림을 보면, Implicit Free List에선 5Words Size의 Block에 4Words의 Payload가 저장될 수 있는 반면, Explicit Free List에선 똑같은 5Words Size Block에 3Words Size의 Payload를 저장할 수 있다.
Explicit Free List는...
여전히 Size 정보가 필요하다. ★
여전히 Boundary Tags가 필요하다. ★
Explicit Free List의 Allocation도 당연히 Implicit Free List처럼 Splitting이 필요하다.
Free Block에 Allocation 후, 여유분이 없으면 마치 Doubly Linked List에서 중간 Node를 삭제하듯이 연결을 끊으면 그만이지만,
여유분이 남는 경우, Previous Free Block, Next Free Block과 여유분이 각각 서로 Doubly Linked 되도록 설정해주어야 한다.
Explicit Free List의 Free는 기본적으로 'Insertion'이다.
Method1) LIFO(Last-In-First-Out) Policy : Queue 논리를 따르는 것이다. 그냥 간단히 Free List의 맨 앞에 Newly Freed Block을 삽입하는 것이다.
Method2) Address-Ordered Policy : Newly Freed Block을 Free List에 삽입할 때, 항상 Address Order에 맞게 Sorting해서 삽입하는 방식이다.
이전 포스팅에서 언급했던 'Free 상황 4가지 Case'에 대해 Method1(LIFO Policy)을 적용해보자.
Case2 : Allocated Block을 Free하려고 하는데, Next Block이 Free인 상황이다.
일단 Coalescing부터 진행하자.
이를 위해, Next Block을 일단 Free List에서 Splice Out한다. 즉, 축출한다는 것이다.
이어서, 축출된 해당 블록과 Newly Freed Block을 하나로 합친다.
Coalescing이 끝나면, 새롭게 만들어진 Coalesced Free Block을 Free List의 맨 앞에 삽입한다!
Case4 : Allocated Block을 Free하려고 하는데, Previous & Next Block이 모두 Free인 상황이다.
Explicit Free List의 추가적인 특징
Heap Memory가 Full에 가까울수록 Explicit Free List의 Search Time이 빨라진다.
Implicit Free List보다 Implementation 측면에서는 조금 더 난이도가 있다. 아무래도 Splicing 과정이 필요하기 때문이다. Linked List를 다룬다는 점도 그렇고.
Implicit Free List보다 공간 활용적 측면에선 훨씬 좋지 않다.
Implicit과 Explicit 모두 Internal Fragmentation의 최소화를 위해 Best Fit Searching을 채택해야하는데, 이전에 설명한 것처럼, Best Fit은 Cost가 높다.
Q) Explicit의 경우, Block의 크기가 최소 몇 Words여야 하나요?
A) 생각해보자. Boundary Tags를 사용한다고 할 때, Header, Footer, Prev Ptr, Next Ptr까지 총 4Words의 Extra Space가 필요하다.
이때, Payload가 있어야 하는데, 과연 이 Payload가 단순히 1Word 이상이면 될까? 그렇지 않다. 2Words는 최소로 있어야 한다. Double-Word Alignment 기준으로 말이다. 즉, Alignment까지 고려하면, 최소 6Words가 필요할 것이다. (현재 예시에서) ★★★
Q) Implicit/Explicit, 그리고 Search Method(First Fit, Next Fit, Best Fit)에 상관 없이, Immediate Coalescing을 사용하면 바로 바로 Coalescing을 수행하므로 Previous Free Block은 있을 수 없지 않나요?
A) 정확하다. Immediate Coalescing의 경우, 그때 그때 바로 바로 Free Block들을 조정해주기 때문에 Allocated Block의 바로 앞에 Free Block이 있는 경우는 발생하지 않을 것이다. ★★★
Segregated Free List Method는 'Free Block의 Size'에 대해 Free List를 각각 마련하는 방식이다. 서로 다른 Size 값이 N개라면, N개의 'Free List(Size Class)'를 두어 각 Free Block들을 분류해서 기억하는 것이다.
"Each size class of blocks has its own free list!"
위와 같이, Unique한 Size가 아니라, Size의 Range를 하나의 Class로 두기도 한다. 너무 많은 Class가 있으면 그것 나름대로의 Overhead가 있을 수 있으므로.
이러한 Segregated Free List의 가장 큰 장점은 무엇일까?
이 방식을 적용한 Dynamic Memory Allocator를 'Seglist Allocator'라고도 부른다. ★
malloc(n Words)으로, 크기가 n Words인 Block의 Allocation을 요청했다고 해보자. n보다 크기가 큰 Size Class들 중 Size가 가장 작은 Class부터 찾아간다. ★★★
즉, malloc(4 Words)인 경우, 위의 그림에서 1-2, 3 Class는 Skip한다.
따라서, n Size의 Block을 할당하고자 하면,
예를 들어, malloc(6)시, 위의 그림 기준으로, 5-8 Class를 훑기 시작하고, 해당 Class의 첫 번째 Free Block에 대해, 6 Words 만큼을 Allocation하고, 나머지 2Words는 여유분 Free Block이 되므로 이 부분을 Split해서 1-2 Class에 귀속시킨다.
만약, 한 Class에서 Proper Block을 찾지 못하면, 그 다음 크기가 큰 Size Class로 가서 Keep Searching한다. 찾을 때까지!
Free시엔, Explicit Free List에서 그랬던 것처럼, 'Coalescing'과 'Placing on an appropriate list'가 연달아 수행되어야 한다. 아래 그림처럼 말이다. ★★
Seglist Allocator의 장점은 다음과 같다.
Throughput이 좋다.
Peak Memory Utilization이 우수하다.
Segregated Free List에서 First Fit 방식을 채택하더라도, 그 메모리 활용도는 Heap에 대한 Best Fit Search의 메모리 활용도에 준한다.
만약, 극단적으로, 모든 Size에 대해 일일이 Size Class를 마련할 경우, Memory 활용도가 매우 높아질 것이다.
즉, Fragmentation을 최소화할 수 있다.
즉, Segregated Free List 방식은 Throughput이나 Peak Memory Utilization이나, 모든 면에서 Implicit or Explicit Free List보다 우수하다.
이 밖에 Dynamic Memory Allocator 구현 방법 Method4인 'Blocks Sorted by Size'라는 방법도 존재한다. Red-Black Tree를 사용하는데, 이 개념은 본 SP 연재에선 생략하겠다. Dynamic Memory Allocator 구현 방법에 대한 학습은 여기까지이다. 다음 포스팅에선 아직 소개하지 않은 Implicit Memory Management에 대해서 다뤄보겠다.
금일 포스팅은 여기까지이다.