카테고리 없음

저수준(어셈블리어)에서 고수준(러스트)까지 확실하게 배우는 동시성 프로그래밍

legend59 2022. 4. 24. 12:24
국내에 러스트(Rust)관련 서적이 2권밖에 출간되지 않은 상황에서 '동시성 프로그래밍 - Rust, C, 어셈블리어로 구현하며 배우는 동시성 프로그래밍 A to Z'의 출간 소식은 반가움을 넘어선 무언가 설레임을 가져다 주었다. 일본어를 하나도 모르기에 오레일리 재팬에서 이 책의 원서(https://www.oreilly.co.jp/books/9784873119595/)가 출간된지도 몰랐었다. 역자 '김모세'님의 발빠른 번역으로 원서 출간일(21년 8월)과 큰 차이 없이 한국어 번역판이 출간하였고 그 책이 지금 내 손에 쥐어지게 되었다.
 
 <국내 출간된 러스트 서적>
 * 러스트 핵심 노트(한빛미디어) https://www.hanbit.co.kr/store/books/look.php?p_code=E2088508957
 * 러스트 프로그래밍 공식 가이드(The Rust Programmming Language, 제이펍) https://jpub.tistory.com/987

 

이 책은 책의 부제목에서 명시한 것처럼 동시성 프로그래밍의 A부터 Z까지를 알려주는 것이 목적이다. 타 언어에 비해서 러스트(Rust)는 러닝 커브가 높아 초보자가 배우기에 쉽지 않은 언어이다. 여타의 다른 러스트 서적에서도 어느 정도의 C, C++, Python, Java 등의 언어 경험이 있는 상태에서의 학습을 요구하는 것이 일반적이다. 그리고 다른 러스트 서적에서는 하나의 챕터(절)만을 할애해서 동시성 프로그래밍에 대해서 짧은 소개만을 할 뿐이지만 이 책은 동시성 프로그래밍의 정의에서 부터 필요성 그리고 어셈블리와 C에서의 경험을 바탕으로 차근차근 동시성 프로그래밍에 대해서 접근을 한다.

 

한빛미디어의 '7가지 동시성 모델 - 프로그래머라면 알아야 할 미래를 품은 7가지 동시성 모델'

 

에서의 접근과는 사뭇 다른 방식으로 동시성 프로그래밍을 설명한다.

 

저자는 이 책을 올바르게 이해하기 위해서는 어셈블리, 러스트에 대한 경험은 없더라도 C언어는 어느 정도 익숙함을 전제로 하고 있다.

 

요구언어 숙련도

 

어셈블리와 C로 저수준에서 설명하고 똑같은 내용을 러스트로 간결하고 편리하게 구현할 수 방법을 설명해 주고 있다.

 

1장>
동시성 프로그래밍에 한 챕터만을 할애할 경우 동시성과 병렬성을 명확히 구분하지 않고 하나로 간주하고 설명을 진행하는 경우가 많은데, 이 책에서는 동시성과 병렬성을 명확히 구분지으는 것으로 시작한다.

 

동시성 : 2개 이상의 프로세스가 동시에 계산을 진행하는 상태

병렬성 : 같은 시각에서 여러 프로세스가 동시에 계산을 실행하는 상태

 

동시 처리와 병렬 처리가 중요한 이유는 성능 향상에 있고 효율적인 계산 리소스 활용, 공평성(공정성), 편리성을 내세우며 동시 처리가 필요함을 설명하며, 이는 복잡성을 안고 있음을 설명하며 챕터를 마무리 한다.

 

2장>
군더더기 없이 어셈블리 언어의 기초에 대해 짧지만 최대한 쉽게 설명을 해주고 있다.
레지스터를 다루는 방법, volatile 그리고 POSIX Pthreads 라이브러리를 이용한 스레드의 생성/종료 그리고 스택과 힙을 구분지어 상세히 설명하고 있다. C언어는 이미 익숙한 독자를 대상으로 하고 있으므로 복습하는 차원에서 무리 없이 읽을 수 있다.
러스트 언어에 약 30페이지를 할애하고 있다. 러스트 미경험자도 독자 대상에 두고 있으므로 상대적으로 할애한 분량이 많다. 타 러스트 서적에 비교하여 꼭 필요한 부분을 잘 간추려 최대한 간단히 설명한다. 소유권, 클로저, 참조, 라이프타임, 차용, 트레이트 등 굵직굵직한 내용들을 간결히 설명하고 있다. 짧은 설명에 러스트에 매료되었길 바란다.

 

3장>
동기 처리가 필요한 이유(레이스 컨디션)를 설명하고 CPU 지원의 아토믹(Atomic) 명령을 이용한 처리를 학습한다.
동기 처리의 기본인 뮤텍스, 세마포터, 조건 변수를 설명하고 이어서 배리어 동기(Barrier Sync), Readers-Writer락, Pthread(러스트의 동기 처리 라이브러리 내부에서 사용)를 설명한다.
설명이 간결할 뿐만 아니라 여러 용어들을 설명하기 위해 일상 생활에서의 예를 적절히 사용하여, 동기 처리 관련 용어에 익숙하지 않은 독자에게 쉬운 이해를 돕는 것이 인상적이다.
앞서와 마찬가지로 이러한 것들을 C와 어셈블리로 설명하고 이어서 러스트로 전환시켜 모던 동기화 라이브러리를 사용한 모던 동기 처리 기법을 다시한번 살펴본다.
단순히 라이브러리로의 전환히 아닌 원천적으로 실수를 방지하기 위해 러스트에서 제공하는 타입 시스템을 이용하도록 안내한다.

 

마무리는 CPU에서 아토믹 명령을 지원하지 않을 경우 활용 가능한 베이커리 알고리즘으로 마무리 하고 있는데, 단순히 아모믹(Atomic) 명령으로 일일히 처리하지 않고 알고리즘 차원에서의 지원에 대해 살펴본다.

 

4장>
익숙한 동시성 프로그래밍에서의 문제점인 데드락으로 시작한다. 특히, RwLock을 러스트에서 사용할 경우 발생할 수 있는 데드락을 피하기 위해 러스트의 _(언더바)를 사용하여 손쉽게 변수를 파기 시켜 데드락 발생을 피할 수 있는 방법을 설명한다.
3장에 이어 고급 주제를 다룬다. 재귀 락(Recusive Lock), 의사 각성(Spurious Wakeup), 시그널(멀티스레드와 궁합이 좋지 않지만 필요하면 사용이 용이한 signal_hook 크레이트에 대한 안내를 해주고 있다) 등은 당장에는 필요가 없어 보일지 몰라도 나중에 필요에 의해 쉽게 찾아서 도움이 될 수 있을 것 같다.
마지막으로 러스트에서 atomic을 사용할 때 Ordering 타입을 왜 지정하고 어떻게 사용할 수 있는지를 어셈블리 레벨에서 메모리 배리어(또는 메모리 펜스) 명령 부터 차근 차근 설명해 주고 있다. 어셈블리 레벨에서의 설명으로 명확히 Ordering 타입 지정에 대한 상세한 내용을 알 수 있다.

 

5장>
다른 모던 언어를 사용해보았을 경우 익숙한 Future 및 async/awit를 설명한다. 러스트에서는 언어차원에서 코루틴을 지원하지 않지만 Futures 트레이트를 사용하여 좀 더 추상적인 비동기 프로그래밍이 가능함을 확인하고 함수의 중단과 재개를 수행할 수 있는 코루틴을 구현할 수 있음을 소개 한다.
이어서 러스트에서 실질적으로 표준이 되버린 Tokio 크레이트를 사용하여 await를 추가하여 일반적으로 사용하던 라이브러리와 유사한 형태로 비동기 프로그래밍이 가능함을 보여준다. Tokio에 대해 자세히 알 수 있는 기회는 아니지만 Tokio의 편리함과 강력함을 알 수 있게 해주며, 여기서의 맛(?)을 기억하여 좀 더 다양하게 이용할 수 있도록 공식 문서를 참고하도록 안내하고 있다.

 

6장>
비선점적 멀티태스킹과 선점적 멀티태스킹을 명확히 구분하고, 비선점적 멀티태스킹에서 무한 루프가능성이 있음을 알려준다. 애플리케이션 구현입장에서는 크게 신경을 쓰지 않아도 될 수 있지만 선점적 멀티태스킹에 비해 비선점적 멀티태스킹은 컨텍스트 스위칭을 덜 일어나므로 성능에서 약간의 이득을 얻을 수 있다.

 

(3절의 액터 모델(Actor Model)은 모든 것을 액터로 다루고 멀티 프로세스끼리 메시지를 교환하는 동시 계산 모델로 필요한 경우 별도로 찾아 이용할 수 있을 것이다.)

 

7장>
챕터의 제목 '동기 처리2'에서 알 수 있듯이 3장 '동기 처리1'에 이어 공평성이나 데드락 같은 문제를 해결하기 위한 좀 더 발전된 동기 처리 주제를 다룬다. STM(Software Transactional Memory)은 기존 락 기법과 달리 데드락이 발생하지 않는 동기 처리 기법이다. 마지막으로 여러 프로세스에서 동시에 접근 가능한 데이터 구조인 락프리(Lockfree, 배타락을 이용하지 않고 처리를 수행하는 데이터 구조 및 그에 대한 조작 알고리즘을 총칭) 데이터 구조를 설명하고 있다.

 

8장>
1장에서 '동시성과 병렬성'에 대해 정의하였고 저자는 그것이 매우 추상적이었다고 간주하며, 대표적인 동시 계산 모델인 액터 모델(채널을 이용하지 않고 모든 것을 액터(프로세스)를 사용해 직접 통신을 수행)과 ∏ 계산(프로세스 사이의 데이터 교환을 채널을 이용해서 수행)을 사용하여 동시 처리에 관해 형식적으로 정의한다. 수식이 많아 다소 거부감이 들 수 있을 수 있지만 ML에 익숙해 져야 하는 시점(?)에서 좀더 수학적, 학문적으로 접근해 볼 수 있는 기회를 주고 있다.

 

요약>
쉽게 발견되는 오타가 간간히 눈에 띄지만 학습에 있어 크게 방해가 될 정도는 아니다. 다만 아직 러스트 관련 용어가 확실히 자리잡지 않은 상태에서 몇몇 용어가 '영어 -> 일본어 -> 한국어'로 전환되는 과정에서 어색한 부분이 있는 점은 다소 아쉬운 점이다.
원저자가 대학 교수여서 그런지 강의 경험이 많아서인지 몰라도 매 챕터의 시작마다 적절한 비유를 통한 설명이 인상적이었다.
이 책을 통해서, 동시성 프로그래밍의 깊이 있는 이해 그리고 동시성, 비동기 프로그래밍에서의 러스트의 강력함을 경험하고 국내 러스트 사용자이 많아지는 계기가 되었으면 한다.
 
"한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다."