
malloc이란 c의 동적 메모리할당, dynamic memory allocation을 의미하며, 컴퓨터의 가상메모리(virtual memory), 즉 heap을 관리한다. 메모리를 할당시키고 프리(free)시키며 메모리를 정확하고, 효율적이고, 빠르게 관리하는 것이 핵심이다.

프로그램을 실행시키기 전까지는 얼마만큼의 메모리가 필요한지 모르기 때문이다.
적은 메모리를 할당하면 프로그램 에러가 생기는데, 그렇다고 처음부터 너무 많은 메모리를 할당하면 메모리가 낭비된다. 따라서, 런타임에 필요한 크기가 주어질 때마다 메모리를 동적으로 할당하게 된다.
동적 메모리 할당에는 두 가지 유형이 있다.
명시적 할당기
묵시적 할당기
할당기는 할당기 처리량과 메모리 최고 이용도 간 균형을 찾으려고 한다.
시간 당 처리하는 요청을 극대화하면서도, 메모리를 효율적으로 사용해야 한다.
이를 위해 이용도(peak utilization)라는 지표를 사용한다. 힙을 얼마나 효율적으로 쓰고 있는지를 측정하는 척도이다.
할당된 부분들은 얼마든지 연속적으로 붙어있거나 떨어져있을 수 있다.
이 상황에서 5워드 데이터를 넣으려고 하면 실패하게 되는데,
총 공간을 계산해봤을 때 충분한 메모리가 있음에도, 빈 공간들이 연속적이지 않아 할당할 수 없는 상황을 External Fragmentation(외부 단편화) 라고 한다.
외부단편화를 해결하기 위해서 메모리를 동일한 크기로 잘라서 그 동일한 크기로 할당하게 되는 방법을 생각해보자. 그러면 그 빈 공간들은 생기지 않게 된다. 반면 들어오는 데이터보다 필요 이상으로 데이터를 할당하게 되어, 할당된 데이터 내에 빈 공간이 생기게 되는데 이를 Internal Fragmentation(내부 단편화) 라고 한다.
이러한 단편화 현상을 방지하기 위해 고려해야 될 점이 있다.
이러한 사항을 고려하면서 메모리 관리를 효과적으로 하고자 block(블록) 이라는 단위를 사용한다.

Header: 블록의 시작점. 블록 사이즈와 할당 여부를 표시한다. 워드가 8byte이므로 마지막 세 비트(000)은 비어있게 되는데, 이 자리를 활용하여 블록의 할당(001) 또는 해제(000)를 표시하는 데 사용한다.
Payload: 실제 데이터가 들어가는 부분. 워드 단위로 반올림하여 저장한다.
Padding(optional): 사용하지 않는 공간. 정렬할 때의 조건에 맞추기 위해서 또는 외부단편화를 극복하기 위해서 등의 이유로 패딩을 붙여줄 수 있다.
Footer: 블록의 끝점. header의 정보와 동일한 정보를 갖는다.
Previous or Next free block pointer: 이중 연결리스트의 형태로 가용리스트를 관리하는 방식을 사용할 때 구성하는 항목. 가용리스트에는 할당이 해제된 블록의 포인터들이 저장되어 있다.
block pointer: header 칸의 바로 뒤 주소. 이를 활용하여 메모리가 저장된 위치를 찾는다.
First fit
list를 앞부터 탐색해서 처음 만나는 가용 블록을 선택
Next fit
이전에 검색이 종료된 지점에서 검색을 시작
Best fit
모든 블록을 탐색하여 가장 적절한 블록 선택
배치 공간을 찾은 후, 가용 블록을 얼마나 활용할지 판단해야 한다.
인접한 가용 블록을 병합해주지 않으면, 충분한 메모리가 있음에도 불구하고 할당하지 못하게 된다. 따라서 Coalescing(연결)이 필요하다.할당기가 요청하는 크기의 블록을 찾을 수 없는 경우
Coalescing은 다음 네 가지 case를 가진다.
반환된 블록을 다음 가용블록과 연결하는 것은 header를 이용하면 간단하다. 반면 이전의 블록과 연결하는 것은 상수시간 내에 불가. 따라서 Footer를 추가하여 이전 블록 상태 쉽게 조사할 수 있도록 한다.