이번주는 CS:APP3e Lab Assignments의 malloc lab을 구현해보는 시간이었다. 학습 키워드는 시스템 콜, 데이터 세그먼트, 메모리 단편화, sbrk/mmap이다.
이 중 상당수는 지난 포스트에서 개념을 정리해두었다. 이번에는 그걸 실제 구현으로 옮겨보는 과정이었다. malloc을 구현하는 방법은 여러 가지가 있는데, 대표적으로 Implicit Free List, Explicit Free List, Segregated List, Buddy System이 있다.
여기에 더해서 빈 공간을 탐색하는 방식으로 First Fit, Next Fit, Best Fit이 있는데, 나는 Implicit + First Fit, Explicit + First Fit을 중심으로 구현했고, Implicit + Next Fit까지는 확장해봤다. 근데 나머지 방식들은 생각보다 구현 난이도가 높아서 시도하는 게 쉽지 않았다.
이번에 malloc을 구현하면서 가장 크게 느낀 건, 설계를 생각보다 훨씬 더 세세하게, 정확하게 해야 한다는 점이다. 주석 없이 길게 코드를 쓰다 보면 내 머릿속에서 개념이 계속 헷갈린다. 예를 들어 여기서 정의한 size가 payload size인지, 전체 block size인지, 이 매크로가 header를 받는 건지 payload pointer를 받는 건지 같은 것들이 계속 꼬였다. 그래서 변수명이나 매크로 정의를 최대한 명확하게 가져가려고 신경을 많이 썼다. 협업을 한다면 이런 정의들은 따로 문서로 정리해서 공유해야겠다는 생각도 들었다.
긴 코드를 읽는 감각도 조금씩 익숙해지는 느낌이다. 직접 매크로를 정의하고 써보니까, 왜 큰 코드베이스에 매크로가 그렇게 많은지 납득이 됐고, 그걸 어떻게 읽어야 하는지도 조금씩 감이 잡히는 것 같다. 이번 AI 팀 프로젝트에서는 저번에 만든 미니 SQL에 B+ Tree를 결합해서 범위 탐색의 속도를 빠르게 향상시키는 과제였는데, B+ Tree의 자료구조를 배우고 의의를 아는 것에 중점을 두었다. 이번에 공부하는 방법을 바꿔봤는데, 코드를 내가 직접 한줄 한줄 보기보다는 큰 틀에서의 흐름을 마크다운 파일로 각 과정마다의 설명을 만들어달라고 AI에게 부탁해서 코드를 큰 틀에서 학습하고, 질문형으로 들어가며 코드를 보는 탑 다운 방식으로 공부했는데, 효율이 잘 나온 것 같아 다음에도 이 방법을 적용해보려한다.
아직도 큰 코드 읽는 방법은 계속 찾아보는 중이다.