실용주의 프로그래머 (The Pragmatic Programmer)
2022.03.30
6장. 동시성
동시성 Concurrency
둘 이상의 코드 조각이 실행될 때 동시에 실행 중인 것처럼 행동하는 것
실행 중에 코드의 다른 부분으로 실행을 전환할 수 있는 환경에서 코드를 구동해야한다. 보통은 파이버나 스레드, 프로세스 등을 사용하여 동시성을 구현한다.
병렬성 Parallelism
실제로 동시에 실행되는 것
두가지 일을 동시에 할 수 있는 하드웨어가 필요하다. CPU 하나에 있는 여러 개의 코어일 수도 있고, 컴퓨터 한 대에 있는 여러 CPU이거나 아니면 네트워크로 연결된 여러 대의 컴퓨터일 수 도 있다.
(p.241)
동시성을 갖춘 애플리케이션을 구축하는 더 나은 방법들이 있다. '엑터 actor 모델'이 그 중에 하낟. 엑터 모델에서는 프로세스들이 독립적으로 수행되며 서로 데이터를 공유하지 않는다. 대신 채널을 통해 잘 정의된 단순한 의미론을 사용하여 의사소통한다. (p.243)
시간에는 우리가 신경써야 할 측면이 두 가지 있는데, 동시성(동시에 일어나는 일들)과 순서(시간의 흐름 속에서의 일들의 상대적인 위치)다.
(p.243)
많은 프로젝트에서 설계 과정의 일환으로 애플리케이션의 작업 흐름을 모델화하고 분석하는 작업이 필요하다. 우리는 동시에 일어나도 되는게 뭐고, 반드시 순서대로 일어나야 하는 건 어떤 것인지 찾아내길 원한다. '활동 다이어그램' 같은 표기법을 사용해서 작업 흐름을 기록하는 것이 한 방법이다. (p.244)
세마포어 Semaphore
단순히 한 번에 한 사람만이 가질 수 있는 무언가다. 여러분은 세마포어를 만들어서 다른 리소스의 사용을 제어하는데 쓸 수 있다.
(p.257)
엑터와 프로세스를 사용하면 공유 메모리 접근을 동기화하느라 고생할 필요없이 흥미로운 방식으로 동시성을 구현할 수 있다.
엑터는 자신만의 비공개 지역 상태를 가진 독립적인 가상 처리 장치다.
프로세스는 본래 더 일반적인 가상 처리기로, 마치 엑터처럼 동작하도록 관례를 만들어 제한적으로만 사용할 수 있다. (p.259)
엑터는
관리하는 것이 하나도 없다.
시스템이 저장하는 상태는 오직 메시지.
모든 메시지는 일방향이다.
한 번에 하나의 메시지만 처리한다.
-> 공유 상태 없는 동시성을 위하여 엑터를 사용하라
(p.260)
얼랭 Erlang 프로세스는 가볍기 때문에 컴퓨터 한 대에서 수백만 개를 실행시킬 수 있고, 프로세스끼리 메시지를 보내서 통신한다. 포르세스들은 각각 격리되어 있어서 상태를 공유하지 않는다.
이에 더하여 얼랭 런타임은 프로세스의 생애 주기를 관리하는 '슈퍼비전 Supervision' 시스템을 구현했다.
(p.265)
메시지 형식 및 API를 모아두는 중앙 저장소를 운영하면 도움이 될 것이다. 이 저장소에서 코드나 문서까지 생성해 준다면 더욱 좋다.
(p.270)
특정한 비즈니스 작업 처리를 시작할 때 고유한 '추적 아이디'를 만들어서 붙이는 것이다. 그리고 해당 작업에 관여하는 모든 엑터로 아이디를 전파하면, 나중에 로그 파일을 뒤져서 어떤 일이 일어났는지 재구성해볼 수 있을 것이다.
(p.271)
의존성과 결합도, 그 중의 시간 결합도 (Temporal coupling)
정말 중요하다.
이번 6장에 나온 코드들을 자바로 구현해볼 것!
260 페이지 이후의 엑터도 구현해볼 것!