전체 글(166)
-
CSAPP 9장 파트 6: 지금까지의 개념을 C 코드로 구현하기
전체 구조: 두 파일파일역할흐름 속 위치memlib.c진짜 sbrk 대신 쓰는 가짜 커널. 큰 배열(MAX_HEAP)을 힙처럼 흉내 냄파트 1의 "커널"mm.callocator 본체 (구현할 것)파트 1~5의 "allocator"memlib.c 안의 mem_sbrk는 mem_brk를 incr만큼 올리고 이전 mem_brk를 반환한다. 공간이 모자라면 -1을 반환.mm.c는 mm_init, mm_malloc, mm_free 세 함수를 내보냄상수와 매크로: 파트 3~5의 계산을 이름 붙인 것#define WSIZE 4 // 워드 = 4바이트 (헤더/푸터 크기)#define DSIZE 8 // 더블워드 = 8바이트 (정렬 단위)#define CHUNKSIZE (1..
2026.10.02 -
CSAPP 9장 파트 5: 결정 ④ 병합, boundary tag
지금 위치: 네 가지 결정 중 마지막 ④ 병합입니다.이번 파트의 질문: 블록을 free하고 난 후, free된 블록의 이웃이 free라면 어떻게 할까? 그리고 앞 뒤 이웃의 상태와 위치를 어떻게 빨리 알아낼까? 1. 문제: 이웃한 빈 블록이 "가짜 단편화"를 만든다블록을 free하면 그 이웃도 free일 수 있습니다. 합치지 않고 두면 이런 일이 생깁니다.[ free 3워드 ][ free 3워드 ] ← 합치면 6워드이 상태에서 payload 4워드를 요청하면(블록 크기 6워드 필요?) 각각은 3워드라 둘 다 작아서 실패합니다. 합계는 충분한데 쪼개져 있어서 못 쓰는 상태, 이것이 가짜 단편화(false fragmentation)입니다. 해결은 간단합니다. 인접한 빈 블록은 하나로 합칩니다(coa..
2026.10.02 -
CSAPP 9장 파트 4: 결정 ② 배치, ③ 분할, 힙 확장
지금 위치: 네 가지 결정 중 ② 배치, ③ 분할과, 마지막 수단인 힙 확장(sbrk)입니다.이번 파트의 질문: 블록을 알아볼 수 있게 됐다. 그럼 malloc(n)이 왔을 때 어느 빈 블록에 넣고, 남는 부분은 어떻게 하고, 맞는 게 없으면 어떻게 하나?malloc 흐름 한눈에 보기malloc(n)이 오면 allocator는 이 순서로 움직입니다.malloc(n) │ ├─ 0단계: 요청 크기를 블록 크기로 변환 (헤더 + 정렬 반영) │ ├─ 1단계: [배치] 힙을 훑으며 맞는 free 블록 찾기 (find_fit) │ ├─ 찾았다 → 2번으로 │ └─ 없다 → 4번으로 │ ├─ 2단계: [분할] 고른 블록에 넣고, 남는 부분 처리 (place) → 블록 포인터..
2026.10.02 -
CSAPP 9장 파트 3: 결정 ① 추적 - 블록의 모양
지금 위치: 네 가지 결정 중 첫 번째, 추적입니다. 나머지 세 가지(배치, 분할, 병합)가 전부 이 결정 위에서 돌아갑니다.이번 파트의 질문: allocator는 "이 블록이 어디서 시작하고, 얼마나 크고, 쓰이는 중인지"를 어디에 어떻게 기록할까?1. 문제: 힙은 그냥 바이트의 나열이다힙은 구분선이 없는 연속된 바이트입니다. 그 위에서 allocator가 알아야 할 것은 이 둘입니다.블록이 어디서 끝나는지 (= 크기)블록이 allocated인지 free인지그리고 제약 하나가 있습니다.파트 2에서 봤듯이 allocator의 관리 정보자체도 힙 안에 저장해야 합니다(별도 저장 공간 불가).그래서 이 정보를 블록 내부에 심어둡니다.2. 해결: 헤더(header)를 붙인다블록 맨 앞에 1워드(4바이트) 헤더..
2026.10.01 -
CSAPP 9장 파트2: 빌려주고 돌려받다 보면 생기는 낭비
지금 위치: 파트 1이 "왜 allocator가 필요한가"였다면, 여기서는 "그 일이 왜 어려운가"를 다룹니다.이번 파트의 질문: allocator는 무엇을 잘해야 하고, 무엇이 그것을 방해하며, 그래서 무엇을 결정해야 하는가?1. allocator가 풀어야 하는 조건 (제약)allocator는 아무렇게나 일할 수 없고, 아래 제약 안에서 일해야 합니다제약의미이게 왜 어렵게 만드나1. 임의의 요청 순서할당/해제가 어떤 순서로 올지 모름 (짝이 맞거나 중첩된다는 보장도 없음)미래를 예측해서 최적 배치를 짤 수 없다2. 즉시 응답요청을 모아서 한꺼번에 처리 불가지금 당장 결정해야 한다3. 힙만 사용allocator가 쓰는 자료구조도 힙 안에 저장관리 정보도 공간을 차지한다4. 정렬 조건 지켜야함 어떤 타입도..
2026.10.01 -
CSAPP 9장 파트 1: 왜 allocator가 필요한가?
1. 문제의 출발: 프로그램이 필요한 메모리 크기를 미리 알 수 없다프로그램이 필요로 하는 메모리 크기는 실행해봐야 아는 경우가 많습니다. 예를 들어 "정수 n개를 입력받아 저장하라"는 프로그램에서 n은 실행 중에 입력으로 들어옵니다. 가장 단순한 해결책은 정적 배열입니다.#define MAXN 15213int array[MAXN]; // 크기를 코드에 박아둠하지만 이 방식에는 한계가 있습니다.MAXN은 코드를 만들 때 넣어둔 임의의 숫자일 뿐이고, 실제 사용할 수 있는 메모리 크기, 사용자가 필요한 메모리 크기와 무관합니다.사용자가 MAXN보다 큰 메모리를 요청하는 경우 그냥 실패합니다.더 키우려면 코드를 고치고 다시 컴파일해야 합니다. (유지보수 지옥) 그래서 필요한 것은 동적 메모리 할당입니..
2026.10.01