리뷰/IT_책소개 / / 2022. 4. 23. 22:47

O'REILLY Concurrent Programming (동시성 프로그래밍) : 한빛미디어

반응형

 

O'REILLY Concurrent Programming

  O'REILLY Concurrent Programming

  동시성 프로그래밍

 

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

  다카노 유키 지음

  김모세 옮김

 

 

 

 

 

 

 

 

 

 

 

 

 

 

O'REILLY 의 Concurrent Programming 책은,

동시성 프로그래밍에서의 동시성이라는 것의 의미 그리고 필요성 등에 대해서 설명하고 있으며,

동시성 프로그리밍에 대한 이론과 Rust, C, Assembler 언어를 이용한 예시를 통하여 동시성 프로그래밍에 대해 쉽게 접근하고 실제 프로젝트에 응용할 수 있도록 기반을 다져주는 책이라는 생각이 듭니다.

 

* 대상 독자

대상 독자

책에서 제시하는 대상 독자는 프로그래밍을 할 줄 아는 사람을 대상으로 하고 있습니다.

실제, C나 Rust 언어에 대해서 프로그래밍을 할 줄 알아야 합니다.

대부분 예제는 Rust 언어로 되어 있으며, 일부 시스템 관련 부분 및 시스템 API 관련 부분을 설명하고자 할때 C 언어를 사용하고 있습니다.

C나 Rust 언어를 이용하여 구현 까지는 아니더라도 구현된 내용을 읽을 줄 알면 이 책을 학습하는데 크게 무리는 없을 것 같습니다.

 

* 각 CHAPTER 리뷰

CHAPTER 1 에서는 동시성이라는 것이 나오게된 이유와 그에 대한 필요성 등 개론 적인 부분을 주로 다루고 있습니다.

여기에서 동시성과 병렬성이 의미하는 바와 혼용해서 사용하는 부분에서 실제 동시성과 병렬성은 다른 의미라는 것을 

설명하고 있습니다.

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

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

또한, 동시성과 병렬성에 대해 각각의 정의와,

동시성 관련해서는 OS 와 프로세스 그리고 스레드 각각의 관계에서의 동시성 그리고 그 특징들에 대한 설명이 주로 있으며,

병렬성 관련해서는 하드웨어 (컴퓨터 아키텍처) 측면에서의 병렬성의 3가지 종류를 나열하고 ("테스크 병렬성", "데이터 병렬성", "인스트럭션 레벨 병렬성") 각각 의미와 그 구현 방법 등에 대해 주로 설명하고 있습니다.

동시 처리와 병렬 처리의 필요성 섹션에서는,

병렬 처리의 필요성 관련하여 하드웨어 측면에서의 한계점을 기반으로 소프트웨어 측면에서의 필요성을 설명 하고 있으며,

동시처리의 필요성 관련하여서는 동시 처리가 필요한 이유와 처리할 때의 문제점에 대해서 설명하고 있습니다.

여기에서, 동시 처리는 복잡성 (계산 경로 수의 급증 이라는 문제) 의 문제를 안고 있기 때문에, 기반 지식, 즉 동시성 프로그래밍의 작동 원리와 이론 모델에 대한 학습을 통하여 편리성을 유지하면서 문제점을 줄이고 병렬로 고속 작동하는 소프트웨어 구현하는 기술을 익혀야 한다고 기술하고 있습니다.

 

동시 처리, 병렬 처리에 대해 무조건 적인 적용은 예상하지 못한 결과를 가져올 수 있다는 것에 공감하며, 책에서 얘기하는데로 기반 기술에 대해 많은 공부가 필요 할 것 같습니다.

이는, 동시성 프로그래밍에 대한 구조적인 부분과 본질에 대한 이해도가 있어야 함을 의미 한다고 생각됩니다.

 

기본 적으로 이 책을 보려면 C 언어와 Rust 언어를 최소한 읽을 줄 알아야 합니다.

그래서, 책에서 제시하는 대상 동자 및 필요한 사전 지식 관련 (p9) 블럭에서도 명시하고 있듯이

       * C나 Rust 의 기본을 습득하고 본격적으로 소프트웨어 구현하는 단계에 있는 사람

       * 프로그래밍 경험이 어느 정도 있으며 동시성 프로그래밍에 대해 체계적으로 학습하고자 하는 사람

이렇게 정리되어 있으며, 프로그래밍 경험이 많지 않은 경우 C나 Rust 언어 관련 입문서를 먼저 학습한 뒤 이 책을 읽기를 권장하고 있습니다.

C나 Rust 언어에 대한 기반 지식을 학습 하였다면, 이 책을 시작 할 수 있습니다.

이 책에서는 기반 지식을 가지고 있다고 하여도, 동시성 프로그래밍을 할 시에 기본 적으로 필요한 언어적인 내용에 대해 정리하고 있습니다.

 

CHAPTER 2 에서는 "프로그래밍 기본" 이라는 제목에서 나타내는 것처럼 프로그래밍 언어에 대한 전반적인 부분을 다루지는 않습니다.

주로, 동시성 프로그래밍과 관련된 C , Rust, Assembly 언어에 대한 설명을 다루고 있습니다.

책에서는 C 언어와 Rust 언어에 대해 알고 있다면 넘어가도 된다고 되어 있지만, 한번 리프레쉬 하는 생각으로 읽어 보면 좋을 것 같습니다.

책에서는 Rust 와 Assembly 언어를 사용하고 있지만, OS와의 인터페이스나 표준 API를 설명하기 위해 C 언어를 이용한다고 합니다.

책에서 명시된 것 처럼 C 언어와 Rust 언어에 대한 모든 문법 및 기능을 설명하지 않기 때문에 다른 서적이나 공식 문서를 참고 하여야 합니다.

C 언어에 대해서는 thread, volatile, memory (stack, heap) 에 대해서만 일부 정리되어 있고,

Rust 언어에 대해서는 책 예제 대부분이 Rust 언어를 사용하고 있어서 인지, 기본 문법부터 좀 많은 페이지를 할애하여 설명 하고 있습니다. (문법에 대해서 정리되어 있지만 따로 Rust 언어에 대한 학습은 필요할 것 같습니다.)

 

Assembly 언어를 설명하는 이유는 동시성 프로그래밍 원리를 알고 컴퓨터의 본질을 이해하는데 도움이 되기 때문이라고 설명하고 있으며 AArch64와 x86-64 Assembly 를 이용합니다.

     cf) AArch64 (Arm 64bit Architecture CPU), x86-64 (AMD or Intel Architecture CPU)

Assembly 에 대한 명령 구조에 대한 기초 설명이며, 자세한 내용은 명령어를 사용할 때 정리되어 있습니다.

Appendix 섹션을 할당하여 각 Architecture 에 대해서 추가로 설명 하고 있습니다.

  (Appendix A : AArch64, Appendix B : x86-64)

 

CHAPTER 3 에서는 동기 처리에 대해 다루고 있습니다.

흔히 C 언어로 프로그래밍 공부할 때 Process 및 Thread 동기에 처리 관련한 내용에 늘 포함되어 있는 Atomic, Mutex, Semaphore, 조건 변수, barrier sync, readers-writer lock 에 대해 설명하고 있으며, C 언어 와 Rust 언어 구분하여 설명 하고 있습니다.

그리고, 여러 동기처리 알고리즘 중에서 레슬리 램포트의 "베이커리 알고리즘"에 대해 설명 하고 있는데,

CPU에서 Atomic 명령을 이용한 동기처리 방식을 지원하지 않는 경우를 위한 알고리즘으로 알아두면 좋을 것 같습니다.

 

CHAPTER 4 에서는 동시성 프로그래밍의 특유의 버그와 문제점에 대해서 다루고 있습니다.

흔히 들어 봄 직한 "deadlock, livelock, starvation" 등 동기 처리에서의 기본적인 문제점 및 재귀락, 의사 각성과 같은 고급 동기 처리에 관한 문제를 설명하고 있습니다.

각각에 대한 문제점이 발생하는 코드 예시와 함께 그림을 이용한 설명 그리고, 문제가 발생하지 않는 코드를 보여주며 비교 설명 하고 있습니다.

코드에 대한 설명은 모든 라인에 대해서 하는 것은 아니며, 각각에 대해 필요한 부분에 대해서만 숫자 태그를 붙여서 설명 하고 있습니다.

CHAPTER 4는 필히 숙지하고 넘어가야할 부분이라 생각됩니다.

관련 문제점들에 대해서 고려하지 않고 프로그래밍 하게 되면 논리적 오류 뿐만 아니라 프로그램 동작시에 심각한 버그를 생산하게 될 수도 있습니다.

 

CHAPTER 5 에서는 비동기 프로그래밍에 대해서 다루고 있습니다.

비동기 프로그래밍에 대한 간략한 소개와 함께 구현 방법에 대해 Rust 를 이용하여 실제 예제와 함께 설명하고 있습니다.

Rust 의 async/await 를 이용한 비동기 프로그래밍 예제를 보여주고 Rust 의 비동기 라이브러리인 Tokio를 이용한 비동기 프로그래밍에 대해서 설명하고 있습니다.

 

CHAPTER 6 에서는 멀티태스크에 대해서 다루고 있습니다.

멀티태스크와 멀티태스킹의 개념적인 의미를 설명하고 멀티태스크 관련 용어에 대해 설명하고 있습니다.

책에서는 단일 CPU상에서 여러 프로세스를 동시에 작동시키기 위한 기술을 나타내는 것으로 설명하고 있으며,

그와 관련하여 6.1.1 서브 섹션에서 "지킬 박사와 하이드"라는 소설을 예로 들어서 멀티태스크에 대해서 설명하고 있습니다.

그리고 멀티태스크의 종류와 각각의 장단점을 설명하며 각각에 대한 구현 예시를 보여주고 있습니다.

 

CHAPTER 7 에서는 이전에 다루었던 "CHAPTER 3 동기처리"에서의 확장하여 좀더 향상된 동기 기법에 대해서 다룹니다.

"공평성을 보장하는 락, 소프트웨어 트랜잭셔널 메모리" 에 대해서 다루고 실제 구현한 소스와 알고리즘에 대해서 설명하고 있습니다. (공평성이나 데드락 같은 문제를 해결하는 발전적 동기 처리 기법)

 

CHAPTER 8 에서는 동시성 프로그래밍에 대해 계산 모델 측면에서 다루고 있습니다.

여기서 제시하는 "액터모델" 과 "∏ 계산" 의 두 가지의 계산 모델을 제시하고 있습니다.

음, 해당 CHAPTER 는 수학 기호로 대부분 표기 되어 있고 각 수식 및 변환 등에 대해서는 자세한 설명이 부족 하기 때문에 수식을 읽어 가는데 좀 많은 시간이 소요될 것 같습니다.

수식 읽는 것에 익숙 하지 않더라도 천천히 본다면 무리 없이 학습할 수 있을 것 같습니다.

 

* 책의 구성에 대해 ....

"NOTE" 통하여 중간 중간 추가로 필요한 내용들을 정리 하고 있습니다.

 

"정의" 라는 블럭을 두어 설명중 알아야 할 용어나 구문등에 대한 추가 설명을 해주고 있습니다.

 

예제 설명 중에 간혹 Rust 와 C 언어의 문법상의 차이를 설명하고 있습니다.

 

설명 중간중간에 표나 그림들을 적절하게 넣어서 설명에 대한 이해를 높이고 있습니다.

 

소스에 대해서는 전체 구문에 대한 설명 보다는 각각에 필요한 부분에 대해서 숫자를 표기하여 설명하고 있습니다.

 

* 결론

책 구성이나 전체적인 내용으로 보면 많은 것을 알려주고자 노력한 것 같습니다.

다만, 간혹 이미 알고 있다는 전제를 두어서 인지 설명에 대한 할애가 부족한 부분들이 있긴 합니다.

소스코드에 대해서도 설명을 보기전에 코드를 하나씩 읽으면서 구성 및 의미하는 바를 우선 파악 해본 후 설명을 읽어 보는것이 좋은 것 같습니다.

전체적인 구성에서는 예제 위주로 설명이 되어 있기에 하나씩 따라가며 학습하면 충분히 이해하는데 무리는 없을 것으로 보여집니다.

어려운 부분들에 대해서도 최대한 풀어서 설명을 하고 이해를 돕기위한 노력이 보입니다.

동시성 프로그래밍에 대해서 실제 많은 프로그래머들이 자신도 모르게 사용하고 있는 경우가 많을 것이라 생각됩니다.

이 책은 동시성 프로그래밍에 대해 이미 익숙한 사람이거나 프로그래밍을 시작한지 얼마되지 않은 분들 모두 정독 해보면 많은 도움이 될 것 같습니다.

그리고, 예제로 되어 있는 코드들에 대해서 자신이 자신있는 언어로 변경하면서 공부 해보면 좋을 것 같습니다.

 

 

https://www.hanbit.co.kr/store/books/look.php?p_code=B9078925849 

 

동시성 프로그래밍

Rust 언어를 중심으로 어셈블리어, C 언어를 사용해 CPU 아토믹 처리, 소프트웨어 트랜잭셔널 메모리, async/await 등 동시성 프로그래밍과 관련된 이론적 배경부터 구현까지 설계자 입장에서 살펴본

www.hanbit.co.kr

 

"한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다."
반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유