[CMU-LAB] Unix Shell Lab 리뷰
정글 커리큘럼에는 카네기 멜론 대학교의 강의 15-213 Introduction to Computer Systems에서 제공하는 Lab 중에서 malloc lab과 proxy lab 과제를 수행하는 주차가 있다. 강의 교재 CS:APP 를 읽으면서 컴퓨터 시스템의 이론을 익히고 CS:APP에 나와 있는 코드와 Lab 과제물에 있는 코드를 기반으로 간단한 프로그램들을 만드는 주차이다.
정글에서 하나의 Lab 과제를 수행하는 데 주어진 시간은 일주일이다. 일주일 동안 그 Lab 과제 하나에만 매달린다고 생각하면 그렇게 짧지만은 않은 기간이기는 하지만 낯선 개념과 익숙해지는 시간, 과제 안내서를 읽고 과제 방법을 이해하는 시간, CS:APP 교재를 읽는 시간, 코드 짜면서 디버깅하는 시간, 테스트 코드에 맞게 코드 수정하는 시간 등등이 필요하다는 걸 생각하면 한없이 부족한 기간이기도 하다.
proxy lab의 경우 특히나 과제를 제대로 수행하려면 교재 CS:APP의 8장 예외적인 제어 흐름, 10장 시스템 레벨 입출력, 11장 네트워크 프로그래밍, 12장 동시성 프로그래밍 4개 챕터를 정독해야 했는데 당시에는 그럴 시간이 없어서 11장만 그것도 엄청 버거워하면서 읽었던 기억이 난다. 당시에는 내가 과제를 하는 건지 과제가 나를 하는 건지 모를 정도로 과제에 압도되었던 것 같다.
정글에서는 과제를 마무리 짓지 못했지만 정글을 수료하고 나서 이 4개 챕터를 차근차근 읽어보니 과제를 다시 해보면 그래도 완수할 수 있지 않을까 하는 자신감이 채워졌다. 원래는 카네기 멜론 대학교의 다른 lab 과제들까지 해볼 생각은 없었는데 proxy lab에 다시 도전하다 보니까 SIGPIPE 시그널을 핸들링하는 부분이 막막했다. 그래서 Unix Shell Lab을 하면서 시그널 핸들링에 좀 익숙해져야겠다는 생각으로 shell lab 과제를 먼저 진행했고 오늘 마침내 모든 테스트에 통과했다.
다음 리포지토리에서 모든 테스트를 통과한 소스 코드를 확인할 수 있다. README에는 과제 소개 및 출처, 과제 요구 사항, 프로그램 실행 및 테스트 방법, 과제 수행 일지, 과제를 하면서 배운 것을 모두 정리해놓았다.
https://github.com/jee-in/shell-lab
GitHub - jee-in/shell-lab: [CS:APP] Unix Shell Lab
[CS:APP] Unix Shell Lab. Contribute to jee-in/shell-lab development by creating an account on GitHub.
github.com
사실 CS:APP 8장 예외적인 제어 흐름을 예전에 읽어두긴 했는데 시그널 부분은 어려워서 제대로 이해를 못했었다. 이번에 shell lab을 수행해보고 나서야 시그널의 종류, 시그널 핸들러 함수를 사용할 때 경쟁 상태 race condition 를 주의해야 하는 이유 등을 이해할 수 있게 됐다. 그리고 이번 과제를 수행하면서 드디어 Makefile 작성 방법을 정리하고 넘어간 점이 뿌듯하다. 앞으로 과제 수행할 때는 make 도구를 이용해서 빌드, 테스트 자동화를 습관화할 수 있으면 좋겠다.
개발을 할 때마다 어렵게 느껴지는 부분은 뚜렷한 답이 없는 고민을 마주했을 때이다. 예를 들면 이번 과제에서는 sio.c 라이브러리를 tsh.c와 분리할지 말지 또는 Makefile 문법을 조금 더 공부해서 스크립트를 더 짧게 축약할지 말지 등의 사소한 고민들에 빠졌었는데 이런 고민을 하는 시간이 은근 시간을 많이 잡아먹는다. 그래도 요즘 느끼는 것은 이런 고민에 빠지면 일단 잠깐 모니터 앞을 벗어나거나 다음날 다시 시작하는 것이 도움이 된다는 것이다. 나의 판단은 어디까지나 내가 해본 경험과 지식의 테두리라는 한계 안에 있기 때문에 개발 경험치를 쌓다보면 이런 고민의 시간도 줄어들 수 있지 않을까 생각해본다.