티스토리 뷰
목차
도서 정보
그로킹 동시성 | 키릴 보브로프 - 교보문고
그로킹 동시성 | grokking concurrency! 복잡한 수식과 전문 용어를 몰라도 괜찮다! 읽기만 해도 동시성을 이해할 수 있다!동시성은 프로그램을 독립적으로 실행하도록 분리해 동시에 처리하는 방식이
product.kyobobook.co.kr
배경
팀원의 추천으로 읽게되었는데, 내용이 너무 만족스러웠다. 하드웨어를 비롯해 컴퓨터구조와 운영체제 레벨에서 작업을 처리하는 기초적인 원리부터 웹 서버에서 수백~수천만의 요청을 처리하는 방식, 전통적인 스레드 풀 기반 처리와 논블로킹 I/O, 코루틴을 활용한 처리 방식까지 모두 다루고 있어 소프트웨어를 개발하는데 필요한 시야를 넓힐 수 있었다.
내용
제목에서 알 수 있듯이 대규모 작업의 처리량(Throughput)을 높이기 위해 동시성과 병렬성을 도입하는데 필요한 과정을 설명하고 있다. 그 과정은 기본적인 개념과 용어 설명부터 동시성을 도입하는데 고려할 포인트, 예제 코드와 상황을 통해 이뤄진다.
먼저 첫번째 파트에서는 동시성과 병렬성의 차이를 비롯한 기본적인 개념을 설명한다. 이 설명은 프로세서, CPU, TLB, L1, L2 Cache와 같은 컴퓨터 구조 레벨에서 요청을 처리하는 과정을 포함한다. (오랜 시간 잊고있었던 개념인데 이 책을 통해 다시 떠올릴 수 있어서 너무 좋았다.) 작업을 처리하는 기본 개념인 프로세스와 스레드를 비롯해서 SIMD, MIMD 등 하드웨어 관점과 접목하여 데이터를 동시 처리하는 구조와 CPU, GPU에 대한 설명도 다룬다. 예시와 함꼐 설명하고 있어 더욱 흥미를 느낄 수 있었다.
기본적인 개념을 다뤘던 첫번째 파트에 이어 두번째 파트는 본격적으로 동시성을 다루는 예제를 다룬다. 이때 작업을 바라보는 관점을 CPU 중심과 입출력 중심으로 구분지어 설명하는데, 이 개념은 책을 이해하는 것을 떠나 실무에서 문제 해결을 하는데 좋은 인사이트를 얻을 수 있었다. 가령 CPU 작업보다는 입출력 중심의 작업(주요 CPU 사이클이 입출력을 대기하는데 소모되는 작업)이 Spring Webflux나 Node.js와 같은 논블로킹 I/O 기반 프레임워크를 도입할 때 보다 높은 성능 향상을 이룰 수 있다는 것이다.
동시성을 다루는 과정은 단계적으로 어떻게 수행해야 적절한지 설명한다. 먼저 작업간 의존 관계를 구분하여 동시 처리할 수 있는 작업을 선정해야한다. 그 후 작업간 데이터 송수신이 필요한지, 필요하다면 어떠한 방식으로 수행하는게 적절할지(프로세스간 통신이라면 IPC, 네트워크를 통해 다른 PC와 통신해야한다면 소켓이 적절할 것이다.) 설명한다. 물론 동시성을 다루면서 임계 영역에 접근할 때 발생하는 경쟁 조건과, 이러한 경쟁 조건을 다루는 개념인 락(Lock)에 대한 설명도 포함된다.
마지막 파트는 논블로킹 I/O를 비롯한 본격적인 동시성 처리 방식을 다룬다. 개인적으로 논블로킹 I/O가 어떤 상황에서, 어떤 원리로 성능 향상을 이루는지 이해를 잘 못하고 있었다. 하지만 이 책을 통해 운영체제 레벨에서 스레드 수준의 컨텍스트 스위칭을 방지함으로써, 단일 스레드에서 요청을 이벤트 큐 기반으로 처리하여 적은 리소스로 높은 처리량을 달성할 수 있다는 것을 배울 수 있었다. 이러한 관점에서 입출력 연산이 많은 작업일 경우 논블로킹 I/O로 문제를 해결하는게 적절하다는 것을 익힐 수 있었다.
또한 논블로킹 I/O는 블로킹 연산과 함께 사용하면 안되는데, 기본적으로 단일 스레드로 수백~수천만의 작업을 처리하자는 아이디어이기 때문이다. 한 요청을 처리하다가 시스템 콜을 호출하거나 I/O를 기다리면서 블로킹이 되어버리면 다른 요청도 처리할 수 없기 때문이다. 이를 통해 Spring Webflux와 JDBC 기반 DB 접근 기술의 궁합이 좋지 않다는 말을 이해할 수 있었다.
논블로킹 I/O 뿐만 아니라 이벤트 기반 동시성과 코루틴(Coroutine)을 통한 협동적 멀티태스킹을 다룬다. 최근 몇년간 EDA와 코루틴이 화두로 떠오르고 있는데, 왜 이러한 개념이 최근 많은 논쟁거리가 되는지를 이해할 수 있었다. 또한 내가 만약 이러한 기술을 사용한다면 혹은 누군가가 사용하고 있거나 사용하자고 얘기할 때 그것이 적절한 문제 해결 방식인지 고민할 수 있는 기본적인 배경 지식을 배울 수 있었다.
Python으로 예제 코드와 함께 설명하는데, 이 코드의 한 줄 마다 작성한 의미를 이해하면서 분석하는 과정 또한 흥미로웠다. 특히 이벤트 기반 동시성과 Python의 코루틴으로 예제 코드를 설명하다가 마지막에 이 모든 과정이 파이썬의 asyncio 라이브러리의 구현 방식을 차용한 코드라는 것을 이해한 순간 짜릿했던게 기억에 남는다. 예제 코드는 모두 출판사의 깃허브 리포지토리에 기재되어 있다. 책을 읽으면서 참고한다면 내용을 이해하는데 더욱 도움이 될 것이다.
후기
팀원의 추천 덕분에 나 또한 너무 좋은 책을 읽을 수 있었다. CS 지식 중에서도 중요한 개념인 컴퓨터 구조와 운영체제의 기본 지식을 상기할 수 있었다. Spring MVC를 통해 전통적인 스레드 풀을 통한 서블릿 기반의 서버 개발을 주로 하고 있는데, 이 책 덕분에 논블로킹 IO와 이벤트 기반 구조 더 나아가 EDA에 대한 개념까지 사고를 확장할 수 있었다. 추후 기회가 된다면 코틀린의 코루틴을 활용하는 프로젝트(혹은 사이드 프로젝트)를 진행해보면 좋을 것 같다.
최근 유사한 문제를 유사한 방식으로 반복 해결하는 과정 속에서 회의를 느꼈는데, 이 책 덕분에 사고를 확장할 수 있었다. 특히 1~3년차의 주니어 개발자일수록 읽을 것을 권고한다.
'리뷰' 카테고리의 다른 글
[강의] TDD, 클린 코드 with Kotlin 8기 수강 후기 (0) | 2025.01.05 |
---|---|
[세미나] 2024 MongoDB.local 후기 (11) | 2024.09.14 |
[도서리뷰] 요즘 개발자 (2) | 2024.03.24 |
[도서리뷰] 이것이 자바다 (1) | 2023.12.23 |
[도서리뷰] 가상 면접 사례로 배우는 대규모 시스템 설계 기초 (2) | 2023.08.23 |