Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[변수미] 6장: 동시성 #60

Merged
merged 1 commit into from
Nov 16, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
76 changes: 76 additions & 0 deletions 6장/변수미.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
**동시성** : 둘 이상의 코드 조각이 실행 될 때 동시 에 실행 중인 것처 럼 행동하는 것

- 실행중에 코드의 다른 부분으로 실행을 전환할 수 있는 환경에서 코드를 구동
- -> 파이버, 스레드, 프로세스 등을 사용하여 동시성 구현
- **소프트웨어의 동작 방식**
**병렬성** : 실제로 동시에 실행되는 것
- 두가지 일을 동시에 할수있는 하드웨어가 필요
- **하드웨어**

### Topic 33 시간적 결합 깨트리기

시간에는 우리가 신경써야할 측면이 두가지가 있다 -> 시간적 결합

- 동시성 : 동시에 일어나는 일들
- 순서 : 시간의 흐름 속에서 일들의 상대적인 위치

우리는 동시성을 확보하고, 시간이나 순서에 의존하는 시간적 결합을 끊는 방법을 생각해야한다.
-> 유연성 확보, 시간과 관련된 의존성을 줄일 수 있다.
-> 이를 통해 더 안정적인 시스템을 만들 수 있다.

#### 동시성 찾기

우리는 동시에 일어나야하는일, 순서대로 일어나야하는 일이 무엇인지 찾아야한다.
이를 위한 방법으로 "활동 다이어그램"과 같은 표기법이 있다.
![[스크린샷 2024-08-27 오후 9.22.25.png]]

활동 다이어그램을 이용하여 동시에 수행할 수 있는데, 동시에 실행하고 있지 않은 활동들을 찾아내고, 병렬성을 극대화할 수 있다.

### Topic 34 공유 상태는 틀린 상태

공유상태가 존재할 때, 어느 프로세스도 자신이 보는 메모리가 일관되어 있음을 보장할 수 없다.
-> 공유상태를 가져오고 갱신하는 동작이 원자적이지 않기 때문이다. 실제 값이 그사이에 바뀔 수 있다.

어떻게 원자적으로 바꿀수 있을까?

#### 세마포어

세마포어는 단순히 한 번에 한 사람만이 가질 수 있는 무언가다.
세마포어를 만들어서 다른 리소스의 사용을 제어하는 데 쓸 수 있다

하지만, 모든사람이 세마포어를 빠짐없이 사용하여야만 제대로 동작한다는 문제가 있다.

#### 리소스를 트랜잭션으로 관리하라

제어를 중앙으로 집중시켜, 공유 상태 사용을 보호하는 책임을 사용하는 사람이 가지고 있으면 안된다.

#### 트랜잭션이 없는 갱신

ex) 병렬로 처리할 때는 한 스레드가 작업 디렉터리를 바꿔서 임시 작업 디렉터리에 있는 도중에 다른 스레드가 작동을 시작할 수 있었다. 이 스레드는 작업 디렉터리가 원래 디렉터리일 것 이라고 가정했지만, 스레드들은 현재 작업 디렉터리 값을 공유하므로 그 가정이 어긋나게 되었다.

> TIP: 불규칙한 실패는 동시성 문제인 경우가 많다.

### Topic 35 액터와 프로세스

액터와 프로세스를 사용하면 흥미로운 방식으로 동시성을 구현할 수 있다.
공유 메모리 접근을 동기화하느라 고생할 필요도 없다.

액터 모델에서는 동시성을 다루는 코드를 쓸 필요가 없다. **공유된 상태가 없기 때문**이다

### Topic 36 칠판

각 형사는 독립된 프로세스, 에이전트, 액터 등과 같다.
누군가는 칠판에 수집한 사실을 붙이고, 누군가는 떼어 낸다. 사실을 조합하거나 처리할 수도 있고 더 많은 정보를 덧붙일 수도 있다.
**칠판은 사람들이 서서히 결론에 도달하도록 돕는다.**

#### 하지만 그렇게 간단하지 않다......

아키텍처에서 액터와 칠판, 마이크로서비스를 활용하면 애플리케이션에서 생길 수 있는 모든 종류의 동시성 문제를 예방할 수 있을 것이다.

하지만 거기에는 비용이 따른다.
이런 접근 방식을 사용하면 많은 동작이 간접적으로 일어나므로 분석이 더 힘들다.
메시지 형식 및 API를 모아두는 중앙 저장소를 운영하면 도움이 될 것이다.
이 저장소에서 코드나 문서까지 생성해 준다 면 더욱 좋다. 시스템에서 처리하는 메시지나 정보를 추적할 수 있는 좋은 도구도 필요할 것이다. (고유한 추적 아이 디

이런 종류의 시스템은 맞춰야 하는 구성 요소 수가 더 많기 때 문에 배포하고 관리하기 더 까다롭다.
하지만 그 결과 시스템 이 더 잘게 쪼개지고, 전체 시스템이 아니라 개별 액터만 교체하여 시스템을 업데이트할 수 있다는 면에서 어느 정도 보상 받는다.
Loading