힙 영역
컴퓨터 구조
컴퓨터 구조를 공부하면서 알게된 내용을 요약해서 작성해보자.
힙 영역이 필요한 이유
- 특정 데이터를 여러 함수에 걸쳐 사용할 때 프로그래머가 직접 관리하는 특정 메모리 영역에 저장해야 한다.
- 이런 메모리는 함수의 호출 횟수와 관계없이 프로그래머가 해당 메모리 영역의 사용이 완료 되었다고 확신할 때 까지 유효하게 유지되고 이후 해당 메모리는 무효화되며, 이 과정을 동적 메모리 할당과 해제라고 한다.
- 이와 같은 이유로 메모리 수명 주기에는 프로그래머가 완전히 직접 제어할 수 있는 매우 큰 메모리 영역이 필요하며, 이 영역을 바로 힙 영역이라고 한다.
- 프로그래머가 수명 주기를 결정할 수 있는 메모리 영역을 제공하는 역할이다.
메모리조각 할당 전략
- 메모리를 요청할 때 메모리 할당자는 적절한 크기의 여유 메모리 조각을 찾아야 한다.
- 메모리 할당 전략이 있다.
- 최초 적합 방식
- 다음 적합 방식
- 최적 적합 방식
최초 적합 방식
- 가장 간단한 방법이다.
- 처음부터 탐색하다가 가장 먼저 발견된 요구 사항을 만족하는 항목을 반환한다.
- 단순하지만 메모리 할당 과정에서 앞부분에 작은 메모리 조각이 남을 가능성이 높다.
- 다음 메모리를 할당할 때 더 많은 여유 메모리 조각을 탐색해야 하는 문제가 있다.
다음 적합 방식
- 적합한 여유 메모리 조각이 마지막으로 발견된 위치에서 시작한다.
최적 적합 방식
- 사용 가능한 메모리 조각을 모두 찾은 후 요구 사항을 만족하면서 크기가 가장 작은 조각을 반환한다.
- 최초 적합 방식이나 다음 적합 방식만큼 빠르지 않다.
메모리 할당
- 12바이트 메모리를 요청했을 때 할당을 위해 발견된 여유 메모리 조각이 12바이트라고 생각하자.
- 이 조각을 할당된 것으로 표시하고 헤더 뒤에 따라오는 메모리 조각의 주소를 반환한다.
- 헤더를 담고 있는 메모리는 반환되면 안된다. 헤더가 손상되면 메모리 할당자가 정상적으로 작동할 수 없다.
- 위 상황처럼 이상적인 상황은 많지 않다. 12바이트 메모리를 요청했을 때 12바이트보다 큰 경우가 대부분이다. 이 메모리 조각보다 큰 메모리 조각을 할당하는 것이 가장 빠르지만, 메모리 낭비가 되고 내부 단편화가 발생하게 되어 해당 메모리 조각의 남은 부분은 사용할 수 없다는 문제가 있다.
- 여유 메모리 조각을 두 개로 분할하여 앞부분은 할당한 후 반환하고, 뒷부분은 좀 더 작은 크기의 새로운 여유 메모리 조각으로 만드는 방법이 확실하면서도 자주 사용되는 방법이다.
메모리 해제
- 사용자가 메모리를 요청할 때 얻은 주소를 해제할 때 해제 함수에 주소를 전달하면 된다.
여유 메모리를 효율적으로 병합하기
- 메모리 조각은 헤더를 가지고 있는데 조각 끝에 푸터를 추가할 수 있다.
- 헤더와 푸터는 메모리 조각을 잉종의 암시적 양방향 연결 리스트로 만든다.