평소에 개발을 하다보면 마주치는 다양한 이슈들이 있다. 특히 내 관심사인 데브옵스와 관련해서 더욱 그렇다. 주로 네트워크, 운영체제, 시스템 최적화와 같은 초기 시스템 디자인시 고민해야하는 것들이다. 나는 초기 설계에 꽤 시간을 들여 고민하는 편이다. 이전에 겪어보지 못한 이슈를 만날 때 마다 야크셰이빙을 통해 새로운 지식을 습득하는 편인데, 설계 단계에서 발생하는 이슈들은 거의 대부분 CS 지식을 필요로 했고 이는 오히려 내 지식의 빈 자리를 채워주곤 했다.
정글 6주차 과제인 Proxy Lab 도 그러했다. 프록시는 데브옵스라면 뗄래야 뗼수없는 관계다. 현업에서 항상 봐왔지만 이를 상세히 다뤄보진 못했는데 마침 이번 기회에 정글에서 다뤄볼 수 있게 되었다. 더욱이 모든 것을 c언어로 구현해야 했기에 처음 생각했던 것 보다 더욱 깊이있게 다룰 수 있었다.
그중에서도 내가 가장 몰입하여 흥미롭게 살펴본 파트는 "동시성" 이다. 동시성 또한 서버를 다루는 프로그래머라면 폭넓은 이해는 필수이다. 데브옵스나 백엔드와 같은 서버 개발자라면 동시성과 최적화에 대해 고민을 해본적이 있을 것이다. 학습 교재인 CS:APP 에서는 프록시 서버를 멀티프로세싱, I/O 멀티플렉싱, 멀티쓰레딩 방식의 동시성 프로그래밍을 안내하고 있다.
CS:APP 은 컴퓨터 구조론의 바이블이라 불린다. 사실 전공자로서 동시성에 대한 내용은 어느 정도 알고 있었지만. 확실히 이 책이 다루는 내용의 범위와 깊이에서 내 지식과 꽤 차이가 났다. 예를 들어, 프록시를 구현하기 위해서 예외적인 흐름 처리 (ECF), 시스템 수준 입출력 (Unix I/O), 네트워크 프로그래밍 (Socket), 동시성 프로그래밍에 대한 사전지식이 필요한 식이다. 이러한 내용 모두 CS:APP 에 포함되어 있다.
프록시를 구현하면서 좋았던 점은, 운영체제(OS) 수준의 핵심 개념들에 대해 좀 더 폭넓은 이해를 할 수 있었다는 것이다. 평소 고수준 프로그래밍에서는 접하기 어려운 인터럽트와 시스템 콜과 같은 ECF(Exceptional Control Flow) 개념을 학습할 수 있었기 때문이다. 기본 제공되는 tiny server 에서 특정 케이스에서 발생하는 SIGPIPE 에러를 처음 만났을 때의 기억이 아직도 남아있다. 단순히 에러 발생 자체는 낯설지 않았지만, 시그널을 수신하고 처리하는 과정에서 새로운 개념을 배우게 되어 매우 인상적이었다.
지금까지의 커리큘럼 중 이번 과제를 가장 즐겁게 한 것 같다. 평소에 한 번쯤 구현해 보고 싶은 주제였기 때문이기도 하고, 내가 부족했던 운영체제(OS) 레벨에서의 ECF(Exceptional Control Flow) 개념 또한 익힐 수 있었기 때문이다. 이외에도, 브라우저를 통해 결과를 시각적으로 확인할 수 있었던 점과, 직접 작성한 스크립트를 사용하여 동시성 테스트를 진행해본 경험도 유익했던 것 같다.
P.S.
Node.js 의 이벤트 루프에 영감을 받아, 프록시 서버의 동시성 처리를 I/O 멀티플렉싱으로 구현하려 시도를 했었다. 그러나 동시성 테스트를 통과하지 못했는데. nop server 요청에 프록시 서버가 blocking 되어 실패한 것이었다. 이 문제를 해결하기 위해 non-blocking I/O 를 고려해 보았지만 책의 범위를 넘어서는 관계로, 결국 prethreading 방식으로 전환하여 구현했다.
언젠가 기회가 된다면 non-blocking I/O 으로 구현하는 것이 목표다.
'카이스트 정글' 카테고리의 다른 글
pintos project2: user programs (0) | 2024.10.09 |
---|---|
pintos project1: threads (0) | 2024.10.01 |
야크셰이빙 중독 (0) | 2024.09.21 |
Malloc Lab 그리고 CS:APP (0) | 2024.09.13 |
레드-블랙 트리 그리고 C언어 (0) | 2024.09.12 |