카네기 멜론 대학 교수님 말에 의하면, 명시적 가용 리스트를 통한 할당기는 어려우니까 나처럼 처음 하는 사람들은 초보적인 할당기인 묵시적 가용 리스트를 통한 할당기를 먼저 구현해 보라고 한다...
CS:APP포스트에서 계속 얘기했던, 가상 메모리에 힙 영역에 메모리를 할당하는 것이다. C언어에서 메모리 할당할 때 쓰는 Malloc 함수가 동적으로 메모리를 할당 하는 것이다.
동적 메모리 할당은 프로그램이 실행될 때 필요한 만큼 메모리를 빌리고, 다 쓰면 직접 돌려주는 것.
말록 함수 ?
프로그램을 만들 때, 변수나 배열 같은 걸 미리 크기를 고정해서 선언할 수도 있지만,
실행 중에 "아 지금 메모리 100바이트 필요하네?" 하고 그때 가서 메모리를 빌리는 것이다.
빌린 메모리는 직접 관리해야 하고.
빌린 다음에는, 다 쓰고 나서 반납(free)도 해줘야 한다.
필요할 때만 메모리를 쓰니까 메모리 낭비를 줄일 수 있고,
크기가 유동적인 데이터 (예를 들면 사용자가 입력한 데이터가 10글자일 수도, 1000글자일 수도 있는 경우)를 다루기 쉬워진다 !
필요할 때만 메모리를 쓰니까 메모리 낭비를 줄일 수 있다.
크기가 유동적인 데이터 (예를 들면 사용자가 입력한 데이터가 10글자일 수도, 1000글자일 수도 있는 경우)를 다루기 쉬워진다.
동적 메모리 할당기는
힙(heap)이라고 부르는 프로세스의 가상메모리 영역을 관리한다.
malloc을 쓰면 슈슈슉 마법 같이 다 됬지만, 이젠 내가 관리를 어떻게 해야할지 구현하는 것이다. 벌써 재밌다.
일단 이 힙에서 제일 중요한게 brk 라고 한다.
break라고 읽고, 힙의 꼭대기를 가르킨다.
그래서 꼭대기가 왜 중요하냐면...
- 운영체제로 부터 커다란 메모리를 받아온다 !
- 그리고 이걸 처음엔 하나의 블록으로 관리한다.
- 그리고 이 블록을 하나씩 쪼개서 할당해준다 !
(여기서 쪼개지면 다시 붙이는 과정이 있긴한데 이게 어려움)- 할당 안된 블록들을 쪼개줘야 하기 떄문에 할당해준 천장을 알아야함

저 그림 처럼 위로 계속 자라는데, 계속해서 할당을 해줘야하니까 천장 포인터를 올려줘야하는거임.
나는 저 부분이 제일 어려웠는데, 원리는 이렇다.
brk는 천장을 가르킴.- 사용자가 사이즈를 요청하면 그만큼 할당을 해주고, 이전
brk를 리턴해줌.
(그러면 해당 메모리의 시작주소를 알 수 있음 !)- 그리고 이전
brk + 사용자가 요청한 size를 해줘서brk를 갱신함 !
이 둘은 이거 하나로 갈린다.
어떤 엔트리가 할당된 블록을 반환하기 위해서 무엇이 사용이 됬냐 ?
해당 조건으로 명시적 인지 묵시적인지 할당기가 갈리게 된다.
명시적 할당기
명시적으로 할당된 블록을 반환해 줄 것을 요구하게 된다. 예를 들어 우리가 쓰는 C는 malloc패키지를 통해 명시적 할당기를 제공한다. 그래서 내가 현재 malloc_lab으로 구현하는 거는 명시적 할당기를 구현하는 것이다.
묵시적 할당기
묵시적 할당기는 더이상 프로그램에 의해서 사용되지 않고, 블록을 반환하는지를 할당기가 검출할 수 있을 것을 요구한다. 이는 가비지 컬렉터 라고 알려져 있다.
그래서 자바를 신이라고 부르나보다...
카네기 멜론 교수님이 말하신대로 묵시적 가용 리스트 부터 구현할 예정이다...
이걸 끝내면 앞으로 최종 학력을 카네기 워터멜론 으로 바꿔도 되겠지...