
이번 주 목표
CSAPP 11장을 통해 네트워크 프로그래밍의 기초를 학습하고, 이를 바탕으로 echo_client와 echo_server, 그리고 웹 서버(tiny.c)를 직접 구현하는 것을 이번주 최소 핵심 목표이다.
추가로 가능하다면 CSAPP에 있는 숙제와 프록시 서버(proxy.c)까지 구현하는 것을 목표로 잡을 것이다.
수요코딩회는 미니 DBMS + API 서버를 연결하는 프로젝트를 진행할 것이다.
어디까지 어떻게 시도했는가?
📖 CSAPP 11장 학습 (11.4장까지)
소켓 프로그래밍 개념부터 시작해서 클라이언트-서버 모델, IP 주소와 포트 등까지 순서대로 진행하였다.
즉, 서버가 어떻게 요청을 받고 응답을 보내는지 전체 그림이 잡혔다. 처음에는 'socket()', 'bind()', 'listen()', 'accept()'가 각각 무슨 역할인지 머릿속에서 잘 정리되지 않았다. 그런데 11.4장을 훑어보면서 실제 서버 코드를 작성하면서 각 함수가 연결 수립 과정의 어느 단계에 대응하는지 눈에 들어오기 시작했다. 이론으로만 읽을 때와 직접 코드로 연결할 때의 이해도 차이가 확실히 있었다.
🔧 echo_client.c / echo_server.c 구현
서버가 클라이언트의 메시지를 그대로 돌려주는 에코 서버와 클라이언트를 구현했다. 소켓 생성부터 연결 수락, 읽기/쓰기, 연결 종료까지 전체 흐름을 직접 손으로 짰다.
구현하면서 가장 신경 쓴 부분은 RIO 함수 적용이었다. 연결이 처음 성공하고 터미널에서 데이터가 실제로 오가는 걸 확인했을 때, 지금까지 추상적으로만 알고 있던 네트워크 통신이 손에 잡히는 느낌이었다.
🌐 tiny.c 구현 (간이 웹 서버)
요청 파싱(read_requesthdrs, parse_uri), Content-Type 판별(get_filetype), 에러 응답(clienterror), 정적 파일 전송(serve_static - mmap으로 파일을 메모리에 매핑해 전송), CGI 기반 동적 콘텐츠 실행(serve_dynamic - fork + execve로 자식 프로세스를 CGI로 교체)까지 각 함수 단위로 완성했다.
다만 전체 트랜잭션을 조율하는 doit()은 구현하지 못했다. 각 부품은 다 만들었는데 조립을 못한 셈이라 아쉬움이 남았다.
그래도 HTTP 요청/응답 구조, mmap의 효율성, fork-exec 패턴을 함수 단위로 직접 구현하면서 웹 서버가 실제로 어떻게 동작하는지 몸에 익혔다. 특히 serve_static에서 mmap으로 파일을 메모리에 올려 전송하는 방식이, 단순히 파일을 읽어서 write하는 것과 어떻게 다른지 이해한 게 이번 구현의 가장 큰 수확이었다.
🗄️ 미니 DBMS - API 서버 연결
6주차와 7주차에 구현했던 미니 DBMS에 API 서버를 붙이는 작업을 진행했다. 클라이언트에서 HTTP 요청을 보내면 API 서버가 쿼리를 파싱해 DBMS에 전달하고, 결과를 응답으로 돌려주는 구조였다.
핵심은 rwlock을 적용한 동시성 처리였다. single thread와 multi thread 환경에서 각각 벤치마크를 측정했고, 연산 종류에 따라 결과가 확연히 갈렸다.
SELECT는 rwlock 덕분에 여러 스레드가 동시에 접근해도 서로 블로킹하지 않았다. 그 결과 multi thread가 single thread보다 훨씬 빠른 성능을 보였다. 반면 INSERT는 write lock 특성 상 한 thread가 작업 중이면 나머지는 전부 대기해야 했다. rwlock을 적용해도 multi thread와 single thread의 성능 차이가 거의 없었던 이유였다.
lock이 없는 경우엔 multithread 환경에서 INSERT 불일치가 발생했고, lock을 적용하면 불일치가 사라졌다. race condition을 수치로 직접 확인한 순간이었다.
😔 이번 주 아쉬웠던 점
tiny.c에서 doit()을 구현하지 못했다는 점과 proxy.c 구현을 못한 것에서 아쉬움을 느꼈다.
미니 DBMS + API 서버 연결에서도 완성이 너무 늦게 되어서 코드 리뷰를 꼼꼼하게 하지 못한 점이 아쉬웠다.
📅 다음 주 계획
다음 주는 Pintos PROJECT 1 — Threads 구현에 집중한다.
KAIST Pintos Assignment를 기반으로 팀원들과 함께 테스트 케이스를 통과하는 것이 목표다.
이번 주까지는 코드를 각자 짰지만, 이번 프로젝트부터는 팀 단위로 하나의 코드베이스를 관리하기 때문에 PR 리뷰와 브랜치 전략도 함께 챙겨야 한다. 이론으로만 접했던 스레드와 동기화 개념을 실제 OS 코드 레벨에서 구현해보는 만큼, 이번 주 학습한 rwlock과 동시성 처리 경험이 직접적으로 연결될 것 같다.
8주차 팀원 블로그
gunrein620 (슈퍼맨) / 작성글 - velog
velog.io
반추위 : 네이버 블로그
궤적을 붙잡아 둡니다
blog.naver.com
[Week8] WIL - 네트워크에 발 담그기
이번 주는 소켓 프로그래밍을 중심으로, 네트워크가 실제로 어떻게 동작하는지에 대해 공부하고 간단한 실습까지 진행했다.사실 이쪽은 그동안 “대충 이런 느낌이겠지” 정도로만 알고 있던
dev-ej.tistory.com
'Krafton-Jungle > WIL' 카테고리의 다른 글
| Week 10. 정글 끝까지(PintOS) - User Programs (0) | 2026.05.21 |
|---|---|
| Week 9. 정글 끝까지(PintOS) - Threads (0) | 2026.05.02 |
| Week 7. 탐험 준비 (0) | 2026.04.16 |
| Week 6. 탐험 준비 (0) | 2026.04.09 |
| Week 5. 컴퓨팅 사고로의 전환 (0) | 2026.04.02 |
