[Malloc_Lab] 묵시적 가용 리스트를 이용한 동적 메모리 할당기 (1)

Laska·2025년 4월 27일
post-thumbnail

우리가 계속해서 사용했던 malloc을 직접 구현해보려고한다.

카네기 멜론 대학 교수님 말에 의하면, 명시적 가용 리스트를 통한 할당기는 어려우니까 나처럼 처음 하는 사람들은 초보적인 할당기인 묵시적 가용 리스트를 통한 할당기를 먼저 구현해 보라고 한다...

아니 그래서 일단 동적 메모리 할당이 뭔데요...?

CS:APP포스트에서 계속 얘기했던, 가상 메모리에 힙 영역에 메모리를 할당하는 것이다. C언어에서 메모리 할당할 때 쓰는 Malloc 함수가 동적으로 메모리를 할당 하는 것이다.

동적 메모리 할당은 프로그램이 실행될 때 필요한 만큼 메모리를 빌리고, 다 쓰면 직접 돌려주는 것.

말록 함수 ?

프로그램을 만들 때, 변수나 배열 같은 걸 미리 크기를 고정해서 선언할 수도 있지만,

실행 중에 "아 지금 메모리 100바이트 필요하네?" 하고 그때 가서 메모리를 빌리는 것이다.

빌린 메모리는 직접 관리해야 하고.
빌린 다음에는, 다 쓰고 나서 반납(free)도 해줘야 한다.

필요할 때만 메모리를 쓰니까 메모리 낭비를 줄일 수 있고,

크기가 유동적인 데이터 (예를 들면 사용자가 입력한 데이터가 10글자일 수도, 1000글자일 수도 있는 경우)를 다루기 쉬워진다 !

  • 필요할 때만 메모리를 쓰니까 메모리 낭비를 줄일 수 있다.

  • 크기가 유동적인 데이터 (예를 들면 사용자가 입력한 데이터가 10글자일 수도, 1000글자일 수도 있는 경우)를 다루기 쉬워진다.


그래서 할당기는 ?

동적 메모리 할당기는 힙(heap)이라고 부르는 프로세스의 가상메모리 영역을 관리한다.

malloc을 쓰면 슈슈슉 마법 같이 다 됬지만, 이젠 내가 관리를 어떻게 해야할지 구현하는 것이다. 벌써 재밌다.


그럼 구현 전 알아야 할 개념들 부터 하나씩 집어보자 !

일단 이 힙에서 제일 중요한게 brk 라고 한다.

break라고 읽고, 힙의 꼭대기를 가르킨다.

그래서 꼭대기가 왜 중요하냐면...

  1. 운영체제로 부터 커다란 메모리를 받아온다 !
  2. 그리고 이걸 처음엔 하나의 블록으로 관리한다.
  3. 그리고 이 블록을 하나씩 쪼개서 할당해준다 !
    (여기서 쪼개지면 다시 붙이는 과정이 있긴한데 이게 어려움)
  4. 할당 안된 블록들을 쪼개줘야 하기 떄문에 할당해준 천장을 알아야함

저 그림 처럼 위로 계속 자라는데, 계속해서 할당을 해줘야하니까 천장 포인터를 올려줘야하는거임.

나는 저 부분이 제일 어려웠는데, 원리는 이렇다.

  1. brk는 천장을 가르킴.
  2. 사용자가 사이즈를 요청하면 그만큼 할당을 해주고, 이전 brk를 리턴해줌.
    (그러면 해당 메모리의 시작주소를 알 수 있음 !)
  3. 그리고 이전 brk + 사용자가 요청한 size 를 해줘서 brk를 갱신함 !

명시적 할당기, 묵시적 할당기 ?

이 둘은 이거 하나로 갈린다.

어떤 엔트리가 할당된 블록을 반환하기 위해서 무엇이 사용이 됬냐 ?

해당 조건으로 명시적 인지 묵시적인지 할당기가 갈리게 된다.

명시적 할당기

명시적으로 할당된 블록을 반환해 줄 것을 요구하게 된다. 예를 들어 우리가 쓰는 C는 malloc패키지를 통해 명시적 할당기를 제공한다. 그래서 내가 현재 malloc_lab으로 구현하는 거는 명시적 할당기를 구현하는 것이다.

묵시적 할당기

묵시적 할당기는 더이상 프로그램에 의해서 사용되지 않고, 블록을 반환하는지를 할당기가 검출할 수 있을 것을 요구한다. 이는 가비지 컬렉터 라고 알려져 있다.

그래서 자바를 신이라고 부르나보다...


그리고 이제 내가 구현할 명시적인 할당기에 대한 다양한 함수들은 구현하며, 포스팅 할 예정이다...

카네기 멜론 교수님이 말하신대로 묵시적 가용 리스트 부터 구현할 예정이다...
이걸 끝내면 앞으로 최종 학력을 카네기 워터멜론 으로 바꿔도 되겠지...

profile
똑똑해지고 싶어요

0개의 댓글