generated from muhandojeon/study-template
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
1 changed file
with
96 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,96 @@ | ||
# 6장. 동시성 | ||
|
||
### 동시성 | ||
|
||
- 둘 이상의 코드 조각이 실행될 때 동시에 실행 중인 것처럼 행동하는 것 | ||
- 동시성을 얻으려면 실행 중에 코드의 다른 부분으로 실행을 전환할 수 있는 환경에서 코드를 구동해야 한다. | ||
- 보통은 파이버나 스레드, 프로세스 등을 사용하여 동시성을 구현한다. | ||
- 소프트웨어 동작 방식 | ||
|
||
### 병렬성 | ||
|
||
- 실제로 동시에 실행되는 것 | ||
- 병렬성을 얻으려면 두 가지 일을 동시에 할 수 있는 하드웨어가 필요하다. | ||
- 한 CPU에 있는 여러 코어 / 한 컴퓨터에 있는 여러 CPU / 네트워크로 연결된 여러 대의 컴퓨터 | ||
- 하드웨어가 하는 것 | ||
|
||
## Topic 33 시간적 결합 깨트리기 | ||
|
||
시간에는 우리가 신경 써야 할 측면이 두 가지 있다. | ||
|
||
- 동시성 (동시에 일어나는 일들) | ||
- 순서 (시간의 흐름 속에서 일들의 상대적인 위치) | ||
|
||
'A를 하고, 다음에 B를 하고' 이런 식으로 생각하다 보면 **시간적 결합**을 만들게 된다. | ||
동시성을 확보하기 위해서는 시간이나 순서에 의존하는 시간적 결합을 끊어야 힌다. | ||
|
||
### 동시성 찾기 | ||
|
||
동시에 일어나도 되는 것과 반드시 순서대로 일어나야 하는 것이 어떤 것인지 찾아내려면 | ||
**'활동 다이어그램(activity diagram)'** 같은 표기법을 사용해서 **작업 흐름을 기록**하면 된다. | ||
이 방법을 사용하면 **동시에 수행할 수 있는 부분을 찾아내서 병렬성을 극대화**할 수 있다. | ||
하지만 진짜로 동시에 하는 것이 좋은지는 알려주지 않기 때문에 설계가 필요하다. | ||
|
||
## Topic 34 공유 상태는 틀린 상태 | ||
|
||
동시 작업이나 병렬 작업을 하기 좋은 부분을 찾았다면, 어떻게 안전하게 구현할 수 있을까? | ||
|
||
### 세마포어(semaphore) | ||
|
||
세마포어는 단순히 한 번에 한 사람만이 가질 수 있는 무언가다. | ||
세마포어를 소유하고 있을 때만 리소스를 바꿀 수 있다는 규칙을 도입하면 된다. | ||
|
||
- 세마포어를 획득하는 작업 : P, lock, claim | ||
- 세마포어를 반환하는 작업 : V, unlock, release | ||
|
||
세마포어를 얻지 못한 쪽은 세마포어를 얻을 수 있을 때까지 멈춰 있는다. 즉, 기다린다. | ||
이 접근 방식의 문제점은 모든 사람이 세마포어를 사용해야만 제대로 동작한다는 것이다. | ||
다시 말해서 어떤 개발자가 약속을 지키지 않는 코드를 쓴다면 혼돈에 빠질 것이다. | ||
|
||
### 트랜잭션이 없는 갱신 | ||
|
||
공유 메모리뿐만 아니라 수정 가능한 리소스를 공유하는 애플리케이션 코드 어디에서나 동시성 문제가 발생할 수 있다. | ||
어떤 리소스에 동시에 접근할 수 있다면 잠재적인 문제를 안고 있는 것이다. | ||
가끔은 이런 리소스가 그다지 명백하지 않을 수도 있는데, 불규칙한 실패가 발생한다면 동시성 문제일 경우가 많다. | ||
|
||
### 그 밖의 독점적인 접근 | ||
|
||
대부분의 언어에는 공유 리소스에 독점적으로 접근할 수 있도록 도와주는 라이브러리가 있다. | ||
mutual exclusion을 의미하는 mutex라고 부르기도 하고, monitor나 semaphore라고 부르기도 한다. | ||
|
||
언어 자체에 동시성 지원이 들어 있는 언어도 있다. (Rust는 데이터의 소유권이라는 개념을 강제한다.) | ||
함수형 언어는 모든 데이터를 변경 불가능하게 만드는 경향이 있으므로 동시성 문제를 단순하게 만든다고 주장할 수도 있다. | ||
|
||
## Topic 35 액터와 프로세스 | ||
|
||
액터와 프로세스를 사용하면 공유 메모리 접근을 동기화하느라 고생할 필요 없이 흥미로운 방식으로 동시성을 구현할 수 있다. | ||
|
||
### 액터 | ||
|
||
- 액터는 자신만의 비공개 지역 상태를 가진 독립적인 가상 처리 장치다. | ||
- 우편함을 하나씩 보유하고 있다. | ||
- 잠자고 있을 때 우편함에 메시지가 도착하면 깨어나서 메시지를 처리하고, 우편함이 비어 있으면 다시 잠든다. | ||
- 메시지 처리 시 액터를 생성하거나, 다른 액터에게 메시지를 보내거나, 다음 메시지를 처리할 때의 상태를 생성할 수 있다. | ||
|
||
### 프로세스 | ||
|
||
- 프로세스는 더 일반적인 가상 처리기로, 운영 체제가 동시성을 지원하기 위하여 구현한다. | ||
- 프로세스를 사용할 때 마치 액터처럼 동작하도록 관례를 만들어 제한적으로만 사용할 수도 있다. | ||
|
||
액터들은 아무것도 공유하지 않으면서 비동기적으로 동시에 실행된다. | ||
액터 모델에서는 공유된 상태가 없기 때문에 동시성을 다루는 코드를 쓸 필요가 없다. | ||
동시에 실행되는 작업을 구현할 때 액터를 사용하라. | ||
|
||
## Topic 36 칠판 | ||
|
||
일종의 자유방임주의적 동시성이다. | ||
각 형사는 독립된 프로세스, 에이전트, 액터 등과 같다. | ||
누군가는 칠판에 수집한 사실을 붙이고, 누군가는 떼어 낸다. | ||
사실을 조합하거나 처리할 수도 있고 더 많은 정보를 덧붙일 수도 있다. | ||
칠판은 사람들이 서서히 결론에 도달하도록 돕는다. | ||
|
||
아키텍처에서 액터와 칠판, 마이크로서비스를 활용하면 동시성 문제를 예방할 수 있을 것이다. | ||
하지만 이런 접근 방식을 사용하면 많은 동작이 간접적으로 일어나므로 분석이 힘들다. | ||
메시지 형식 및 API를 모아두는 중앙 저장소를 운영하면 도움이 될 것이다. | ||
시스템에서 처리하는 메시지나 정보를 추적하기 위해 고유한 **추적 아이디**(trace id)를 붙이는 것을 추천한다. | ||
해당 작업에 관여하는 모든 액터로 아이디를 전파하면, 나중에 로그 파일을 뒤져서 어떤 일이 일어났는지 재구성할 수 있다. |