동적 메모리 할당(malloc-lab)

김정민·2021년 1월 20일
0

출처
CMU(카네기 멜런 대학교)의 Malloc Lab http://csapp.cs.cmu.edu/3e/malloclab.pdf
컴퓨터 시스템
http://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&barcode=9791185475219
위키백과
https://ko.wikipedia.org/wiki/%EB%8F%99%EC%A0%81_%EB%A9%94%EB%AA%A8%EB%A6%AC_%ED%95%A0%EB%8B%B9

개요

동적 메모리 할당은 컴퓨터 프로그래밍에서 런타임 동안 사용할 메모리 공간을 할당하는 것을 말한다. 사용이 끝나면 운영체제가 쓸 수 있도록 반납하고 다음에 메모리에 대한 요구가 오면 재 할당을 받을 수 있다. 정적 메모리 할당처럼 프로그램이 실행하는 순간 프로그램이 사용할 메모리 크기를 고려하여 메모리 할당이 이루어지는 방식과 대조적이다.

동적으로 할당된 메모리 공간은 프로그래머가 명시적으로 해제하거나 가비지 콜렉팅이 일어나기 전 까지 그대로 유지된다. C/C++과 같이 가비지 콜렉터가 없는 프로그래밍 언어의 경우, 메모리 동적 할당을 실행하면 사용자가 해제하기 전까지 메모리 공간에 계속해서 유지된다.

동적 메모리 할당은 힙 영역에서 공간을 할당하기 때문에 프로세스가 종료되면 운영 체제가 메모리 리소스를 반납하면서 할다이 해제된다. 그러나 프로세스가 계속 실행될 때에는 동적할당 된 영역은 유지되므로 정해진 힙 영역의 크기를 넘는 메모리 할당을 요구하면 할당되지 않는다.

힙 영역

힙 영역은 원시 자료형이 아닌 보다 크기가 큰 형태의 데이터를 담고자 동적으로 할당하는 메모리 공간을 지칭한다. 구조체나 객체를 스택에 선언하여 사용하는 것도 가능하지만, 런타임에 크기가 결정되는 동적 배열이나 리스트와 같은 경우는 힙을 사용하는 것이 보다 공간을 효율적으로 활용할 수 있다.

그래서 상황에 따라 원하는 크기만큼 메모리가 할당되므로 경제적이고, 이미 할당된 메모리라도 언제든지 크기를 조절할 수 있다. 하지만 더 이상 사용하지 않을 때에는 명시적으로 메모리 할당을 해제해 주어야 한다.

malloc-lab

C에는 stdlib.h 헤더 파일에 malloc(memory allocation)이라는 메모리 동적 할당 함수가 선언되어 있다. malloc-lab을 통해서 메모리 동적 할당의 방식과 직접 자신만의 malloc을 구현해 볼 수 있다.

메모리 동적할당을 하기 위해 우선적으로 고려해야 할 사항들이 몇 가지 존재한다.

  1. 포인터에게 메모리를 해제하기 위해 사이즈를 얼마만큼 주어야 하는가?
  2. 할당이 해제된 블록들을 어떻게 찾아낼 것인가?
  3. 할당을 위한 블록들을 어떻게 선택할 것인가?
  4. 특정 데이터에 할당된 영역이 특정 데이터의 크기보다 커서 남는 공간이 생기는 경우 어떻게 할 것인가?
  5. 할당이 해제된 블록들을 어떻게 다시 힙 영역에 삽입할 수 있을까?

해제를 위한 사이즈를 알기 위해 기본적으로 각 블록의 앞에 블록 사이즈를 저장한다. 이를 header field(또는 header)라고 부를 수 있다. 블록에 이러한 정보를 저장하기 위해 추가적인 공간을 필요로 한다.

해제된 블록들을 찾는 방식에는 묵시적 가용 리스트, 명시적 가용 리스트, Segregated free list 등의 방식이 존재한다. 묵시적 가용 리스트는 모든 블록에 길이와 할당 정보를 저장해서 필요한 블록을 하나씩 찾는 방식이다. 명시적 가용 리스트는 할당이 해제된 블록 사이에만 주소 정보를 저장해서 묵시적 가용 리스트에 비해 할당이 해제된 블록을 찾기 쉽게 해줄 수 있다. Segregated free list는 블록의 사이즈 별로 해제된 블록들을 관리해서 더 효과적으로 메모리 할당을 가능하게 해준다.(잘 이해안됨) 명시적 가용 리스트와 묵시적 가용 리스트의 방식을 이용해서 malloc-lab을 진행했다.

0개의 댓글