각 크기 클래스가 2의 거듭제곱
인 segregated fits의 특별한 경우이다.
기본 아이디어는 2^m 워드 더미가 주어졌을 때 각 블록 크기 2^k에 대해 별도의 자유 목록을 유지한다. (0<=k<=m)
요청된 블록 크기는 2에 가장 가까운 거듭제곱으로 반올림된다.
원래 크기 2^m 워드의 가용 블록이 하나 있다. 크기 2^k의 블록을 할당하려면 k<=j<=m이 되는 2^j 크기의 사용 가능한 첫 번째 블록을 찾는다. 만약 j=k이면 완료된다. 그렇지 않으면 블록을 j=k가 될 때까지 반으로 분할한다. 분할을 수행하면 남은 각 반(buddy)이 적절한 free list에 표시된다. 크기가 2^k인 블록을 free로 만들기 위해 free buddies와 결합을 계속한다. 할당된 버디를 만나면 결합을 중지한다.
buddy system의 중요한 사실은 블록의 주소와 크기가 주어지면, 버디의 주소를 계산하는 것은 쉽다는 것이다. 예를 들어, 32바이트 블록의 주소는 xxx...x00000
이고, buddy address는 xxx...x10000
이다.
즉, 블록과 버디의 주소는 정확히 한 비트 위치에서 다르다.
buddy system allocator의 가장 큰 장점은 빠른 검색과 병합이다.
블록 크기에 대한 2의 거듭제곱 요구사항이 상당한 내부 단편화를 일으킬 수 있다는 큰 단점도 있다. 이러한 이유로 버디 시스템 할당기는 범용 워크로드에 적합하지 않다. 그러나, 블록의 크기가 2의 거듭제곱으로 미리 알려진 특정 애플리케이션별 워크로드의 경우 버디 시스템 할당기는 확실한 매력을 가진다.
void mm_free(void *bp) {
size_t size = GET_SIZE(HDRP(bp));
// header & footer free
PUT(HDRP(bp), PACK(size, 0));
PUT(FTRP(bp), PACK(size, 0));
coalesce(bp); // 이 부분!!!!!
}
buddy
가 된다.buddy
를 찾을 수 있다.buddy
가 가용 상태인지 확인해서 가용 상태라면 병합한다.buddy
가 아니라면 병합하지 않는다.모든 블록의 크기가 2의 거듭제곱 크기라는 것을 이용해서, 현재 반환되는 블록의 buddy
를 찾을 수 있다.
buddy
의 bp는 현재 bp에서 size만큼 빼거나 더해서 구할 수 있다.buddy
가 왼쪽 버디인지, 오른쪽 버디인지 알아야 한다.buddy
에 해당한다.출처
Randal E. Bryant David R. O’Hallaron - Computer Systems A Programmer’s Perspective-Pearson (2015)