4주차의 Red-Black Tree 구현에서 Insert 연산에서 새로운 Node를 할당하는데 stdlib.h 헤더의 malloc 함수를 사용했었다.
5주차에서는 이 malloc를 약식으로 직접 구현해보는 것이 목표이다.
마찬가지로, 기본 코드 구조를 제공받는데, 이는 카네기 멜론 대학교(CMU)의 dynamic storage allocator를 C언어로 작성하는 실습 과제를 그대로 수행하는 것이다.
이는 아래의 CS:APP(Computer Systems: A Programmer's Perspective) 책에 포함된 Labs 중 하나이며, Malloc Lab이라 불린다. (참고로 책의 저자도 카네기 멜론 대학의 교수이다.)
좀 늦었지만, 내가 이 책을 정글에서 처음 펼쳐본건 5주차 malloc lab 구현에 들어가면서부터다. 그 전까지는 다행히도 매주 과제를 진행함에 있어서 기존에 알고 있는 지식만으로 커버가 가능했기도 하고, 또 생각보다 매 주차의 목표를 달성하는데 주어지는 시간이 그닥 많지 않고, 그것들을 완벽히 이해하는 것에 집중을 하다 보면, 대부분은 그것만으로도 시간이 충분치 않다. 그렇기에 다른 것을 할 여유가 그리 생기지 않는다. (물론, SICP 스터디와, 알고리즘 스터디를 따로 진행하긴 했지만.. SICP 스터디에 관해서는 따로 게시글을 작성 할 예정이다. 그리고 Lisp도..)
여튼, CS:APP Chapter 9. Virtual Memory의 Dynamic Memory Allocation 부분부터 보는데, 문장이 이해가 가질 않았다. 처음에는 내가 앞부분을 읽지 않아서 당연히 그런거라 생각을 하고 쭉 읽어갔지만, 무언가 이상함을 느꼈다. 나는 번역본을 구입하여 읽고 있었기에 혹시나 원서로 보면 어떨까 해서 팀원에게 받은 pdf본과 비교해서 읽어봤더니 역시나... 번역 퀄리티가 영 좋지 않았던 것이다. 심지어 완전히 잘못 번역한 부분도 존재했다! 다행히 내가 아직 읽지 않은 내용에 의존적인 부분은 없었기 때문에 그대로 책을 쭉 읽어나갔다.
책을 쭉 읽어본 결과, 개념 자체는 오히려 RB Tree에 비해 간단했다. 단지 코드의 포인터 연산 부분에서 실수의 여지가 많고, 구현 과정에서의 디버깅 스킬이 매우 중요했다. 나의 경우, memory corruption이 일어나거나 알 수 없는 이유로 인해 gdb로 디버깅 도중 ?? 가 출력되는 경우도 발생했기 때문에, 함수를 하나하나 테스트해볼 수 있게 테스트용 소스 코드를 작성하고, Makefile을 수정했다.
확실히 본인만의 테스트 환경 셋팅 유무가 코드의 완성도를 크게 높여준다고 생각한다. 실제로 완성도 뿐만 아니라 전체적인 코드 작성 속도도 빨라졌다! 디버깅은 문제가 되는 코드를 수정하는 것이다. 각각의 함수가 사전에 문제없이 작동한다는 것을 테스트를 통해 보장할 수 있다면, 문제가 생겼을 때, 범위를 굉장히 좁힐 수 있기 때문이다.
pintos를 본격적으로 시작하기 전, 이렇게 디버깅 스킬을 향상시킬 수 있어서 다행이다. 예전에 한창 C를 다룰때의 기억도 새록새록 떠오른다.
이제 본격적으로 CS:APP을 달릴 차례다.
EDIT:
garbage collection의 작동 원리와 memory compaction에 대한 내용이 꽤나 흥미로웠는데, 시간이 된다면 새로운 게시글에서 다뤄보겠다.
'카이스트 정글' 카테고리의 다른 글
Proxy Lab 그리고 ECF (0) | 2024.09.25 |
---|---|
야크셰이빙 중독 (0) | 2024.09.21 |
레드-블랙 트리 그리고 C언어 (0) | 2024.09.12 |
정글 나인 헬퍼 제작 후기 (0) | 2024.09.06 |
컴퓨팅 사고로의 전환 (0) | 2024.08.31 |