2022년 3월 29일 → 2022년 3월 30일

#pragmatic

오늘 읽은 범위

6장. 동시성

책에서 기억하고 싶은 내용을 써보세요.

‘동시성(concurrency), 병행성’은 둘 이상의 코드 조각이 실행될 때 동시에 실행 중인 것처럼 행동하는 것이다. 그리고 ‘병렬성(parellelism)’이란 실제로 동시에 실행되는 것이다. 동시성을 얻으려면 실행 중에 코드의 다른 부분으로 실행을 전환할 수 있는 환경에서 코드를 구동해야 한다.(fiber, thread, process) 병렬성을 얻으려면 두 가지 일을 동시에 할 수 있는 하드웨어가 필요하다. CPU 하나에 있는 여러 개의 코어일 수도 있고, 컴퓨터 한 대에 있는 여러 CPU이거나 아니면 네트워크로 연결된 여러 대의 컴퓨터일 수도 있다. (241p)

많은 프로젝트에서 설계 과정의 일환으로 애플리케이션의 작업 흐름을 모델화하고 분석하는 작업이 필요하다. 우리는 동시에 일어나도 되는 게 뭐고, 반드시 순서대로 일어나야 하는 건 어떤 것인지 찾아내길 원한다. (244p)

동시성은 소프트웨어 동작 방식이고, 병렬성은 하드웨어가 하는 것이다. (247p)

리소스를 공유하는 환경에서 동시성은 어렵다. (258p)

‘액터'는 자신만의 비공개 지역 상태를 가진 독립적인 가상 처리 장치다. 각 액터는 우편함을 하나씩 보유하고 있다. 액터가 잠자고 있을 때 우편함에 메시지가 도착하면 액터가 깨어나면서 메시지를 처리한다. 처리가 끝나고 우편함이 비어 있으면 다시 잠든다.

‘프로세스'는 본래 더 일반적인 가상 처리기로, 보통 운영 체제가 동시성을 지원하기 위하여 구현한다. 프로세스를 사용할 때 마치 액터처럼 동작하도록 관례를 만들어 제한적으로만 사용할 수도 있다. (259p)

액터는 언제나 동시성을 띤다. 액터에게 다음에 무엇을 하라고 계획을 세우거나, 입력 정보를 최종 결과로 바꾸는 과정을 조율하는 등 액터를 관리하는 것이 하나도 없다. 시스템이 저장하는 상태는 오직 메시지 그리고 각 액터의 지역 상태뿐이다. 모든 메시지는 일방향이며 답장이란 개념은 없다. 액터는 한 번에 하나의 메시지만 처리한다. 액터들은 아무것도 공유하지 않으면서 비동기적으로 동시에 실행된다. (260p)

액터 모델에서는 동시성을 다루는 코드를 쓸 필요가 없다. 공유된 상태가 없기 때문이다. 명시적으로 “이걸 한 다음 저걸 하라"는 코드를 쓸 필요도 없다. 액터가 수신하는 메시지에 따라서 알아서 실행되기 때문이다. (265p)

아키텍처에서 액터와 칠판, 마이크로서비스를 활용하면 애플리케이션에서 생길 수 있는 모든 종류의 동시성 문제를 예방할 수 있을 것이다. 메시지 형식 및 API를 모아두는 중앙 저장소를 운영하면 도움이 될 것이다. 이 저장소에서 코드나 문서까지 생성해 준다면 더욱 좋다. 특정한 비즈니스 작업 처리를 시작할 때 고유한 추적 아이디를 만들어서 붙이고 해당 작업에 관여하는 모든 액터로 아이디를 전파하면 추적이 용이할 것이다. (270p)

오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요.

파이썬에서 스레드를 활용하여 병렬적으로 프로그램이 작동하도록 작업해 본 경험이 있다. 하지만 딱 한 번 경험해 봤고, 그 때는 뭔지도 잘 모르면서 수행했다. 아직까지도 코드로 직접 동시성과 병렬성을 작업해보지 않아서, 완전히 이해하기는 어려운 것 같다. 이 장의 초반에서 읽었는데, 이것 다음에 이걸 수행해야 하고, 그 다음에는, ... 이런 방식의 순차적 사고를 많이 하게 되는데 유연하게 사고하려고 노력해야 할 것 같다. 뭔가가 비효율적인데 뭔지 잘 모르겠을 땐 결합을 깨뜨리기 위해 다이어그램을 그려가면서. 동시성(병행성)과 병렬성의 차이에 대해서도 처음 알게 되었다. 용어와 개념에 대해서 어느 정도 알 수 있어서 좋았다.

궁금한 내용이 있거나, 잘 이해되지 않는 내용이 있다면 적어보세요.