이번주는 두 명 팀이었다. 정신없이 지나갔던 한 주였던 것 같다. 공부도 진짜 많이 했고.
요즘 운동을 다시 열심히 하기 시작했다. 머슬 메모리가 있어서 그런가, 몸이 금방 올라와서 보람차다. 정글 수료하고 나면 운동 제대로 이것저것 해볼 생각이다.
밥은 여전히 맛있다. 오늘 고기국수는 정글 식당의 GOAT다. 맨날 나왔으면 좋겠다. 사진이 없어서 아쉽네.
본격적으로 이번 주차 공부 내용 이야기를 해보려고 한다. 첫날부터 우리 팀은 코어타임 때 빡세게 해서 네트워크 이해하고 정복하기를 목표로 달려보자고 했다.
전공 공부하면서 OSI 7계층, TCP/IP, 패킷, 3way-handshake 등등… 많은 지식들이 머리에 있긴 한데 그냥 뭔지도 잘 모르겠고 파편화된 채 이어지지 않은 옵시디언 문서처럼 남아있던 것 같다.
이번 기회에 모든 개념을 연결시키고, 짧은 기간이지만 앞으로 네트워크를 어떻게 공부하면 좋을지 갈피를 잡기 위해 3일간은 열심히 책, 유튜브, 강의를 통해 관련 지식을 습득했다.
하다 보니 느낀 점은, 네트워크 직무가 따로 있는 이유가 있구나. 이 세계, 정말 방대하다. 하지만 인류의 역사를 담고 있는 기술이구나를 정말 많이 느꼈다.
CSAPP에서도 설명을 하다가도 특정 내용이 나오면 “이 책의 범위를 벗어난다”라고 설명을 덧붙이고 있다. 진짜 무서운 말이다. 1200페이지짜리 책에도 담지 못해 분량 밖이라는 내용은 대체 어떤 녀석일까. 심지어 텍스트 자간도 빽빽하게 꽉꽉 채워 쓴 고봉밥 책이면서.
찾다 보니 나중에도 도움이 정말 많이 될 것 같고, 내가 알던 기술에도 많이 접목해서 쓰고 있는 것들이 많아 약간은 범위 밖까지 공부해본 것 같다. 때문에 이번 주 목표였던 프록시 서버 구현이 조금 미뤄졌다.
둘째 날까지 tiny서버 코드 치기는 끝났고, 숙제 문제도 하루 날 잡아서 일요일 오전까지 끝냈었다. 일요일 오후에는 끝낸 기념으로 노래방 갔던 기억이 난다.
일요일 저녁에는 항상 하던 306호 분들과의 코어타임? 만남?을 진행했다. 앞선 WIL에 빠졌던 내용인데, 아마 내 기억엔 RBTree 주차부터 만남을 진행했던 것 같다.
처음에는 상연님과 같이 면접을 봤던 태우님이 인사하고 지내다가, 306호랑 302호도 결국 정글 동기인데 너무 모르고 지내고 만나면 쌩 지나가는 게 너무 정없다고 느꼈는지 다 같이 만나서 안면 트고 인사하고 지내기 위한 자리를 간단하게 만들어보자는 취지였던 것 같다.
예전의 나 같으면 안 갔을 텐데, 8년간 알바를 하면서 성격이 많이 변했는지 이제는 사람이 조금 좋은 것 같다. 새로운 사람을 만나면 흥미롭고 그 사람이 어떨지 궁금하다. 때문에 흔쾌히 모임에 참여하게 되었고, 비슷한 성향의 사람을 반기는 사람들이 모인지라 대화가 잘 통하고 정기적으로 일요일마다 만나게 되었다.
사실 일요일이 정글의 유일한 공식 휴일이지만, 일요일을 통으로 쉬기에는 마음이 편하지 않기도 하고 내 자신이 너무 나태해지는 것 같아 싫었는데, 일요일도 그때나마 가볍게 공부를 하고 스케줄이 생기니 삶에 탄력이 조금 생기는 것 같아 마음에 든다. 그래서 별일 없으면 매주 가고 있다. 지금까진 개근이고.
다시 돌아와서, 이때 tiny 구현 및 코드 이해를 하고 306호 분들과의 대화에서도 많이 배워서 tiny는 완벽히 끝낸 것 같다. Tiny 서버는 기본적으로 클라이언트 요청을 하나씩 순차적으로 처리하는 간단한 HTTP 서버다. 즉, 멀티스레드도, 캐시도 없는 가장 단순한 구조의 웹 서버다. 이번 주 Proxy Lab은 바로 이 Tiny 서버를 확장해서 동시성 제어, 캐시, 스레드 처리를 추가하는 게 핵심이었다.
월요일부터는 프록시 구현에 매달렸는데, 과제는 3개였다.
- 순차 요청 처리
- 동시성 제어
- 캐시 사용
그래서 “월, 화, 수 하나씩 하면 되겠는데?” 라고 스케줄을 잡았는데 생각보다 어려웠다. 처음엔 엄청 헤매다가 책에 있는 걸 보고, 내가 이해한 내용이 맞는지 GPT랑 맞춰보는 과정에서 이해가 돼서 조금 도움받고 구현에 성공했다.
화요일도 무난하게 구현에 성공하고 룰루랄라 저녁 먹으러 갔는데, 같은 팀인 익화님이 동시성 제어 어떻게 했냐고 여쭤보셔서 답변해드렸는데 의아해하셨다.
동시성 제어하는데 malloc으로 해도 되냐 그래서, 파일 디스크립터를 주소공간으로 분리해서 받기만 하면 개별로 처리되니까 파일 디스크립터를 덮어써서 값이 오염될 일은 없다고 설명했다. 그땐 내가 맞다고 확신했는데, 밥 먹고 돌아와서 조사해보니 결국 세 번째 과제를 해결하려면 동시성 제어 부분도 수정이 필요했다.
전역으로 선언된 값을 여러 스레드가 건드리기 시작하면,
그 영역에 읽기/쓰기를 시도할 때 **뮤텍스 락(Mutex lock)**이나 세마포어(Semaphore) 를 걸어야 했다.
그게 없으면 데이터 레이스가 발생하고, 캐시나 로그 같은 전역 자원이 엉망이 된다.
즉, malloc은 단순히 “스레드 안전한 메모리 할당 함수”일 뿐이지,
스레드 간의 동시 접근 자체를 제어해주는 도구는 아니다.
결국 핵심은
“공유 자원에는 반드시 락을 걸어라.” 였다.
그래서 코어타임 때 서로 궁금했던 부분들을 해결했고, 락 구조까지 다시 설계해서 안정적으로 돌아가게 만들었다.
그래서 오늘(수요일) 캐시를 이용한 구현에 아침부터 매달렸다. 결국 성공은 했고, 하면서 같이 발표 준비도 끝내고 새벽 1시까지 밀린 TIL도 쓰고 있다. 이번 주 진짜 바쁘게 지냈다.
자기 전에 항상 《사피엔스》 50p 읽기를 3일째 시도하고 있다. 아직까진 한 번도 성공하지 못했다. 이틀은 새벽 4시까지 공부하다 들어가서 쓰러져 잤기 때문이지.
아침마다 교육동 와서 내 자리에 앉으면 하루에 할 일들을 Todoist로 작성하는 습관을 들이고 있다. 뉴스레터도 3개 구독해서 아침마다 메일 확인하고 뉴스 읽으며 옵시디언에 오늘의 이슈들을 정리하고, 쟁점이 되었던 부분이나 내 생각을 덧붙일 만한 기사는 따로 밑에 글을 작성하고 있다.
하루에 계획한 일을 모두 끝내는 날이 많았으면 좋겠다. 보통 항상 못 하는 것이 우선순위에서 밀리는 운동이나 책 읽기가 되는 것 같다. 어떻게든 p1(최고 우선순위)의 작업들은 끝내고 자려고 발버둥치고 있다. 보통은 p1은 정글의 로드맵에 따른 그 주차의 공부이고, 이번 주는 정보처리기사 실기가 추가되었다.
이제 핀토스 시작이다. 반드시 이겨낸다.
정리하자면
- Tiny 서버는 순차 처리만 가능한 단일 서버였고
- Proxy Lab은 거기에 멀티스레딩 + 캐시 + 동시성 제어를 추가한 과제였다.
malloc은 스레드 안전하지만, 전역 자원 접근엔 락이 필요하다.- 공유 메모리, 캐시, 파일 디스크립터 같은 전역 구조체를 다룰 땐 반드시 Mutex/Semaphore 로 감싸야 한다.
이제부터 핀토스 시작이다! 반드시 이겨낸다.