book

[BOOK] 동시성 프로그래밍

[BOOK] 동시성 프로그래밍 – 다카노 유키 지음 / 김모세 옮김

[BOOK] 並行プログラミング入門
[BOOK] 並行プログラミング入門

부제: “Rust, C, 어셈블리어로 구현하며 배우는 동시성 프로그래밍 A to Z”

요즘 개발자 채용 인터뷰에서 지원분야와 상관없이 꼭 물어보는 질문이 있다.
“동기/비동기 처리에 대한 경험이 있는가?”, “동기/비동기 처리 중에 겪은 어려움은 없었는가?”
질문에 대한 답변에는 deadlock, race condition, mutex, semaphore, event, callback, coroutine, async/await, Future, Promise 등의 키워드들이 포함된다.
이 책, ‘동시성 프로그래밍’을 통해 이런 키워드들이 무엇인지 배울 수 있다.

동시성 프로그래밍이 갖는 독특한 특징 (동기 처리, 레이스 컨디션, 락, 비동기 처리, IO 다중화, 멀티태스킹 등), 어셈블리 언어와 알고리즘, 계산 모델에 이르는 광범위한 주제를 담고 있으므로 오랫동안 옆에 두고 동시성 프로그래밍에 도전해볼 수 있을 것입니다. (p. 6) – 옮긴이의 말

역자의 이야기 처럼 이 책에서 다루는 내용은 상당히 광범위하고, 컴퓨터 사이언스(CS, Computer Science)에 대한 다소 깊은 지식을 다루고 있다.
가벼운(?) 마음으로 책을 펼치면 혼란스러운(?) 상태로 책을 덮을 수 있으니 약간의 각오(?)가 필요하다.

책을 읽기전에 아래 내용들을 얼마나 이해하고 있는지 체크해 보면 좋을 것 같다.
– 컴퓨터 아키텍처 : 특히 프로세스, 스레드, 메모리에 대한 이해
– 어셈블리, C, Rust 언어에 대한 기초적인 이해 : 코드 보고 대충 이런 뜻이겠구나 유추할 수 있는 정도
– C 언어의 포인터, Rust의 소유권 이해 : C와 Rust를 포기하는 이유라고 하던데…
– 자료구조 : 큐(queue), 스택(stack), 리스트(list), HashMap 등의 기초 개념

위 개념을 모른다고 책을 포기할 필요는 없다. 필요한 부분은 찾아가면서 읽으면 된다.
책을 통해 다시한번 기본적인 것들을 체크해보고, 좀 더 깊이있는 지식을 얻어가면 된다.
(저도 공부한지 너무 오래되어 가물가물한 것들이 많아 한 번 읽는 것도 오래 걸렸습니다.)

동시성 프로그래밍에 대한 예는 어셈블리, C, Rust 등의 저수준 언어를 통해 설명하고 있지만 설명하는 개념은 고수준 언어에서도 활용되고 있는 부분이다.
고수준 언어에서 잘 추상회되어 상대적으로 쉽게(?) 사용할 수 있지만 그 밑바닥에서 벌어지는 복잡하고 어려운 과정이 많은지 알 수 있다.
동시성 프로그래밍 키워드들의 의미, 동시성 프로그래밍의 문제점이나 어려움이 잘 설명되어 있어 동기/비동기 개발을 깊이있게 공부하고 싶은 개발자들은 공부해 볼 만하다.

중요한 내용들에 대한 정의를 잘 보이게 표시해두고, 코드에 대한 설명과 원리 등을 설명하고, 참고 문헌 정리도 잘 되어 있다.
단지, 책을 이해하기 위해 기본으로 알아야 하는 지식의 허들이 살짝(?) 높을 뿐이다. (세번은 더 읽어봐야 할 것 같다.)
백엔드, 프론트엔드, 어플리케이션, 데이터 등 대부분의 개발 분야에서 동시성에 대한 이해는 필수이다.
다소 어려운 이 책을 통해 실무에서 사용하는 동기/비동기 개발을 상대적으로 쉽게 이해할 수 있지 않을까 생각한다.

“한빛미디어 [나는 리뷰어다] 활동을 위해서 책을 제공받아 작성된 서평입니다.”

P.S. 세 번째 서평작성인데 왜 자꾸 어려운 책만 걸리는 것 같은지? 하지만 이런 기회가 아니면 ‘게으름+귀차니즘’을 추구하는 내가 빠르게 읽지 못했겠지.


  1. 동시성 프로그래밍의 개념은 대부분 저수준 언어(어셈블리 등)에서 구현되므로 추상화된 고수준 언어에서는 크게 신경을 쓰지 않는 경향이 있다. (p. 6)
  2. 동시성 프로그래밍이 갖는 독특한 특징 (동기 처리, 레이스 컨디션, 락, 비동기 처리, IO 다중화, 멀티태스킹 등), 어셈블리 언어와 알고리즘, 계산 모델에 이르는 광범위한 주제를 담고 있으므로 오랫동안 옆에 두고 동시성 프로그래밍에 도전해볼 수 있을 것입니다. (p. 6)
  3. 고도로 추상화된 프로그래밍 언어를 이용하면 메모리 모델을 고려하지 않고도 동시성 프로그래밍을 할 수 있다고 생각하는 사람들이 있다. (p. 8)
  4. 사물은 공간상에서의 넓이를 갖지만 시간적인 넓이는 갖지 않는 것이며, 프로세스는 공간과 시간의 넓이를 모두 갖는 것이다. (p. 21)
  5. 동시성(concurrency)은 2개 이상의 프로세스가 동시에 계산을 진행하는 상태를 나타내는 용어다. (p. 23)
  6. 병렬성(parallelism)은 같은 시각에서 여러 프로세스가 동시에 계산을 실행하는 상태를 의미한다. (p. 26)
  7. 동시 처리가 중요한 이유는 효율적인 계산 리소스 활용, 공평성(공정성), 편리성의 세 가지를 들 수 있다. (p. 37)
  8. 동시 처리는 계산 경로 수의 급증이라는 문제를 안고 있다. (p. 38)
  9. 컴파일러에 의한 최적화도 동시성 프로그래밍을 어렵게 만드는 원인 중 하나다. (p. 49)
  10. 현대적인 CPU에서는 반드시 기계어 명령 순서대로 처리를 수행하지 않는 아웃 오브 오더(Out-Of-Order) 실행을 한다. (p. 168)
  11. 비동기 프로그래밍은 독립해서 발생하는 이벤트에 대한 처리를 기술하기 위한 동시성 프로그래밍 기법을 총칭한다. (p. 177)
  12. 멀티태스크 가능한 실행 환경이란 여러 프로세스를 실행할 수 있는 환경이다. 하지만 이런 실행 환경을 만드는 것은 잘 생각해보면 사실 어렵다. (p. 224)
  13. 컨텍스트(context)는 프로세스의 실행 상태에 관한 정보이며, 가장 중요한 정보는 레지스터 값이다. (p. 231)
  14. 액터 모델(Actor Model)은 액터(Actor)라 불리는 프로세스끼리 메시지를 교환하는 동시 계산 모델이다. (p. 249)
  15. STM(Software Transactional Memory)은 기존 락 기법과 달리 데드락이 발생하지 않는 동기 처리 기법이다. (p. 255)

BOOK Comment 1-2-3
1. 이런 깊이있는 내용을 다루는 책은 왜 대부분 일본 개발자들이 집필했을까?
2. 한 번 읽어서 이해되는 부분이 많지 않다. (시간을 많이 투자해야…)
3. 동기/비동기에 대해서 경험한 것이 많다면 밝아지는 느낌을 받을 수 있다.

BOOK Underline 1-2-3
1. 고도로 추상화된 프로그래밍 언어를 이용하면 메모리 모델을 고려하지 않고도 동시성 프로그래밍을 할 수 있다고 생각하는 사람들이 있다.
2. 사물은 공간상에서의 넓이를 갖지만 시간적인 넓이는 갖지 않는 것이며, 프로세스는 공간과 시간의 넓이를 모두 갖는 것이다.
3. 동시성은 2개 이상의 프로세스가 동시에 계산을 진행하는 상태를 나타내는 용어다.

Source Code (Github) : 번역서, 원서

BOOKSTORE : YES24, 알라딘

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d bloggers like this: