고정 크기 블록을 사용하면 설명 한 것은 무료 목록 입니다. 이것은 다음과 같은 트위스트를 갖는 매우 일반적인 기술입니다. 사용 가능한 블록 목록은 사용 가능한 블록 자체에 저장됩니다. C 코드에서는 다음과 같습니다.
static void *alloc_ptr = START_OF_BIG_SEGMENT;
static void *free_list_head = NULL;
static void *
allocate(void)
{
void *x;
if (free_list_head == NULL) {
x = alloc_ptr;
alloc_ptr = (char *)alloc_ptr + SIZE_OF_BLOCK;
} else {
x = free_list_head;
free_list_head = *(void **)free_list_head;
}
return x;
}
static void
release(void *x)
{
*(void **)x = free_list_head;
free_list_head = x;
}
할당 된 모든 블록의 크기가 동일하고 크기가 포인터 크기의 배수이므로 정렬이 유지되는 한 잘 작동합니다. 할당 및 할당 해제는 일정 시간 (즉, 메모리 액세스 및 기본 추가와 같이 일정한 시간)입니다. 최신 컴퓨터에서 메모리 액세스에는 캐시 미스 및 가상 메모리가 포함될 수 있으므로 디스크 액세스가 가능하므로 "일정한 시간" 꽤 클 수 있습니다). 메모리 오버 헤드가 없습니다 (블록 당 추가 포인터 또는 이와 유사한 것 없음; 할당 된 블록이 연속적 임). 또한 할당 포인터는 한 번에 많은 블록을 할당해야하는 경우에만 주어진 지점에 도달합니다. 할당이 사용 가능 목록을 선호하므로 현재 포인터 아래의 공간이 클럭이 가득 찬 경우에만 할당 포인터가 증가합니다. 그런 의미에서, 기술.
감소빈 블록은 빈 목록을 따라야 확실하게 식별 될 수 있기 때문에 릴리스 후의 할당 포인터는 더 복잡 할 수 있습니다. 가능할 때 큰 세그먼트 크기를 줄이는 것이 중요하다면 더 많은 오버 헤드와 함께 대체 기술을 사용할 수 있습니다. 할당 된 두 블록 사이에 "구멍"을 넣습니다. 구멍은 메모리 순서로 이중 연결 목록과 함께 연결됩니다. 구멍의 시작 위치와 메모리에서 구멍의 시작 위치를 알고 있으면 구멍 크기를 찾을 수 있도록 구멍에 대한 데이터 형식이 필요합니다. 그런 다음 블록을 해제하면 다음 구멍과 이전 구멍과 병합하여 모든 구멍의 순서가 지정된 목록을 다시 작성 (일정 시간)하는 구멍을 작성합니다. 오버 헤드는 할당 된 블록 당 약 2 개의 포인터 크기 워드입니다. 그러나 그 가격으로 "최종 홀"의 발생, 즉 큰 세그먼트 크기를 줄일 수있는 기회를 확실하게 감지 할 수 있습니다.
가능한 많은 변형이 있습니다. 좋은 입문서는 Wilson 등의 Dynamic Storage Allocation : A Survey and Critical Review 입니다.