카이스트 정글은 마치 부하 테스트와 같다. 나 자신의 한계점이 어디인지 찾아나가는 과정 그리고 그 한계을 뛰어 넘을 정신 개조를 할 기회인 것이다. 그것이 자의이든 타의이든.
생각해보면, 나는 무의식적으로 내 한계를 스스로 정해왔던 것 같다. 특히, 익숙하지 않거나 경험해보지 않은 것들, 혹은 과거에 시도했다가 포기한 경험이 있는 것들에 대해서는 더더욱.
그 중 한 가지 예로, 어떤 것의 작동 원리와 과정을 얼마나 깊이 파고들어갈지 결정하는 문제를 들 수 있다. 무엇보다도 개발 도중 발생하는 문제가 단순한 코드상의 로직이 아니라, os 레벨의 지식을 요구하는 트러블슈팅일 때가 그렇다. 결국 이는 cs 지식을 얼마나 깊이 이해하고 있느냐와 직결된다. 두 번째 예로는, 코드 자체가 다루는 로직이 추상화된 상위 레벨이 아니라 하드웨어에 가까운 하위 레벨인 경우이다. 이러한 경우에는 cpu의 레지스터, memory를 직접 다루는 경우가 많다. 마찬가지로 앞서 언급한 것과 동일한 이유다.
실제로 나는 현업에서 이러한 상황을 종종 겪어왔다. 야크셰이빙을 거쳐 끝내 해결한 문제도 있지만, 해결하지 못한 문제도 있었으며, 해결했음에도 여전히 의문으로 남아 있는 것들도 있다. 예를 들어, 일정 시간이 지나면 서버가 갑자기 먹통이 되는 문제, 서버 성능의 불균일성, AWS 비용 최적화, 동시성 처리를 위한 최적화된 로직 작성, 멀티 프로세스/스레드 환경에서의 소켓 세션 관리와 로드 밸런싱, 그리고 최적의 재시도 로직을 찾는 문제 등등 수없이 많다.
이러한 이슈들을 마주했을 때, 좌절하지 않고 비록 시간이 걸리더라도 수사망을 좁혀가며 정확하게 진단하고 해결하는 능력, 그리고 gdb와 같은 긴 디버깅 세션에서 길을 잃지 않는 방법을 바로 이곳 정글에서 본인의 한계를 시험, 노력 여하에 따라 정신적인 마개조도 가능할 수 있다.
P.S.
위 글을 뒷받침 해주는 링크 https://darkhamtory.tistory.com/3
pintos 의 project 2 부터는 평소에 마주했던 이슈들과 더 가까운 주제를 다룬다. project 1 이 커널상에서 동작하는 멀티쓰레드 환경에서의 스케줄링, 우선순위, 컨텍스트 스위칭, 하드웨어 인터럽트, 동기화 등을 다뤘다면, project 2 에서는 멀티프로세스 환경에서의 컨텍스트 스위칭, 소프트웨어 인터럽트, 트랩, 유저/커널 모드, executable 로드, cpu 레지스터, 페이지 폴트 등의 내용을 다룬다.
처음 user program을 pintos에 올리는 과정을 보면서, proxy-lab에서 cgi프로그램을 올리는 모습이 비슷하지 않을까 생각했다. 물론, 코드 레벨에서의 디테일 차이는 pintos와 비교할 수 없지만 말이다.
시작은 argument passing을 구현하는 것이었다. 매뉴얼을 참고하여 호출 규약을 확인한 뒤, CPU 레지스터를 사용해 인자로 전달된 문자열을 스택에 파싱해 쌓는 방식으로 구현을 완료했다. 그러나 테스트는 통과하지 못했는데, 테스트를 통과하려면 출력을 할 수 있어야 했고, 이를 위해 먼저 write() 시스템 콜을 구현해야 했기 때문이다. 이렇게 하나씩 필요한 시스템 콜이 생겼고, 이를 구현하면서 테스트 케이스를 하나씩 통과해 나갔다. 결국 fork() 시스템 콜과 관련된 테스트를 제외한 나머지 시스템 콜은 모두 성공적으로 통과했다.
구현 중 하나의 이슈를 꼽자면, exit() 시스템 콜이 있다. 이는 process termination message 를 출력하는 기능인데, 나는 출력 코드를 process_exit() 함수에 구현하고 테스트를 돌렸으나, 일부 테스트가 실패했다. 문제를 좀 더 깊이 파고들어 본 결과, 이 부분이 project 1의 테스트 케이스에도 영향을 미쳤다는 것을 발견했다. 문제는 process_exit() 함수에 출력 코드를 구현한 것이었다. process_exit() 함수는 project 1에서도 호출되기 때문에, 출력은 project 2 에서만 발생해야 했다. 따라서 출력 코드를 exit() 시스템 콜 내에 구현해야 했던 것이다.
항상 아쉬운 점은 project 수행에 주어지는 시간이다. 이번 project 2 는 1주가 주어졌다. 원래 계획은 1.5주 지만, 추석 연휴로인해 proxy-lab 주차에 1주가 아닌 1.5주가 주어졌기 때문이다. 특히 아쉬웠던 점은, 그 0.5주가 남은 구현을 마무리하기에 딱 적절한 기간이라는 생각이 강하게 들었기 때문이다.
또한, 편의를 위해 project 2 테스트 스크립트를 작성하는 데 시간을 보냈다거나, pintos 명령어에서 파일 복사 옵션을 누락해 시간을 낭비한 것들이 조금 아쉽다.
마음 같아서는 여유롭게 pintos 만 깊이 파고들어 보고 싶다.
'카이스트 정글' 카테고리의 다른 글
정글의 팀 결성 방법 (0) | 2024.11.08 |
---|---|
pintos project3: virtual memory (0) | 2024.10.23 |
pintos project1: threads (0) | 2024.10.01 |
Proxy Lab 그리고 ECF (0) | 2024.09.25 |
야크셰이빙 중독 (0) | 2024.09.21 |