버디 시스템은 메모리 할당을 효율적으로 관리하기 위해 고안된 방법이다. 버디 시스템에서는 메모리의 요청을 2의 거듭제곱 크기로 맞춰서 할당하고, 할당된 메모리 블록이 사용되지 않을 때 이를 병합하여 더 큰 메모리 블록으로 만든다.
예를 들어서 설명하면,
1. 요청된 메모리 크기 조정
: 5KB의 메모리를 요청하면, 가장 가까운 2의 거듭제곱인 8KB 크기의 블록을 할당한다.
2. chunk devide
: 할당할 수 있는 적절한 크기의 메모리 블록이 없다면, 더 큰 블록을 2개의 작은 블록으로 나누어 할당한다. 이 작은 블록들을 'buddy' 라고 하며, 블록을 나누는 과정을 반복하여 요청된 크기의 메모리 블록이 나올 때까지 계속 나눈다.
3. chunk merge
: 할당된 메모리 블록이 더 이상 필요하지 않다면, 해당 블록을 다시 버디 시스템에게 반납한다. 반환된 블록이 사용되지 않는다면, 블록을 합쳐서 다시 더 큰 블록을 만든다. 병합된 블록을 통해 fragmentation 을 해결할 수 있다.
하지만 작은 크기의 메모리 요청이 계속되고, 시스템에 크기가 서로 다른 블록들만 남는다면, fragmentation 문제는 더욱 심각해질 수 있다.
Slab allocator 는 커널에서 메모리를 효율적으로 관리하기 위해 사용하는 방법 중 하나이다. 특히 kernal data structure 를 위한 메모리 할당을 최적화하는데 중점을 두는 방법이다.
Slab
: slab 은 연속적인 페이지로 구성된다. 예를 들어, 하나의 slab이 두 개의 4KB 페이지로 구성될 수 있다는 뜻이다.
Cache
: Cache는 특정 kernal data structure를 위한 slab 의 집합이다. File descriptor, PCB 등 특정한 kernal data structure 에 대응하는 cache가 존재할 수 있다.
객체 관리
: cache가 생성될 때, 해당 cache는 data structure's instance 로 채워진다. 각 객체들은 초기에는 free 상태로 표시되며, 커널이 해당 data structure를 저장할 때 used 상태로 변환된다.
메모리 할당
: slab이 사용 중인 객체들로 가득 채워지면, 다음 객체는 free slab에 할당된다.
Slab Allocator 는 slab과 동일한 크기의 객체를 할당하므로, fragmentation이 발생하지 않는다.