diff --git "a/6\354\236\245/\353\263\200\354\210\230\353\257\270.md" "b/6\354\236\245/\353\263\200\354\210\230\353\257\270.md" new file mode 100644 index 0000000..2af254c --- /dev/null +++ "b/6\354\236\245/\353\263\200\354\210\230\353\257\270.md" @@ -0,0 +1,76 @@ +**동시성** : 둘 이상의 코드 조각이 실행 될 때 동시 에 실행 중인 것처 럼 행동하는 것 + +- 실행중에 코드의 다른 부분으로 실행을 전환할 수 있는 환경에서 코드를 구동 +- -> 파이버, 스레드, 프로세스 등을 사용하여 동시성 구현 +- **소프트웨어의 동작 방식** + **병렬성** : 실제로 동시에 실행되는 것 +- 두가지 일을 동시에 할수있는 하드웨어가 필요 +- **하드웨어** + +### Topic 33 시간적 결합 깨트리기 + +시간에는 우리가 신경써야할 측면이 두가지가 있다 -> 시간적 결합 + +- 동시성 : 동시에 일어나는 일들 +- 순서 : 시간의 흐름 속에서 일들의 상대적인 위치 + +우리는 동시성을 확보하고, 시간이나 순서에 의존하는 시간적 결합을 끊는 방법을 생각해야한다. +-> 유연성 확보, 시간과 관련된 의존성을 줄일 수 있다. +-> 이를 통해 더 안정적인 시스템을 만들 수 있다. + +#### 동시성 찾기 + +우리는 동시에 일어나야하는일, 순서대로 일어나야하는 일이 무엇인지 찾아야한다. +이를 위한 방법으로 "활동 다이어그램"과 같은 표기법이 있다. +![[스크린샷 2024-08-27 오후 9.22.25.png]] + +활동 다이어그램을 이용하여 동시에 수행할 수 있는데, 동시에 실행하고 있지 않은 활동들을 찾아내고, 병렬성을 극대화할 수 있다. + +### Topic 34 공유 상태는 틀린 상태 + +공유상태가 존재할 때, 어느 프로세스도 자신이 보는 메모리가 일관되어 있음을 보장할 수 없다. +-> 공유상태를 가져오고 갱신하는 동작이 원자적이지 않기 때문이다. 실제 값이 그사이에 바뀔 수 있다. + +어떻게 원자적으로 바꿀수 있을까? + +#### 세마포어 + +세마포어는 단순히 한 번에 한 사람만이 가질 수 있는 무언가다. +세마포어를 만들어서 다른 리소스의 사용을 제어하는 데 쓸 수 있다 + +하지만, 모든사람이 세마포어를 빠짐없이 사용하여야만 제대로 동작한다는 문제가 있다. + +#### 리소스를 트랜잭션으로 관리하라 + +제어를 중앙으로 집중시켜, 공유 상태 사용을 보호하는 책임을 사용하는 사람이 가지고 있으면 안된다. + +#### 트랜잭션이 없는 갱신 + +ex) 병렬로 처리할 때는 한 스레드가 작업 디렉터리를 바꿔서 임시 작업 디렉터리에 있는 도중에 다른 스레드가 작동을 시작할 수 있었다. 이 스레드는 작업 디렉터리가 원래 디렉터리일 것 이라고 가정했지만, 스레드들은 현재 작업 디렉터리 값을 공유하므로 그 가정이 어긋나게 되었다. + +> TIP: 불규칙한 실패는 동시성 문제인 경우가 많다. + +### Topic 35 액터와 프로세스 + +액터와 프로세스를 사용하면 흥미로운 방식으로 동시성을 구현할 수 있다. +공유 메모리 접근을 동기화하느라 고생할 필요도 없다. + +액터 모델에서는 동시성을 다루는 코드를 쓸 필요가 없다. **공유된 상태가 없기 때문**이다 + +### Topic 36 칠판 + +각 형사는 독립된 프로세스, 에이전트, 액터 등과 같다. +누군가는 칠판에 수집한 사실을 붙이고, 누군가는 떼어 낸다. 사실을 조합하거나 처리할 수도 있고 더 많은 정보를 덧붙일 수도 있다. +**칠판은 사람들이 서서히 결론에 도달하도록 돕는다.** + +#### 하지만 그렇게 간단하지 않다...... + +아키텍처에서 액터와 칠판, 마이크로서비스를 활용하면 애플리케이션에서 생길 수 있는 모든 종류의 동시성 문제를 예방할 수 있을 것이다. + +하지만 거기에는 비용이 따른다. +이런 접근 방식을 사용하면 많은 동작이 간접적으로 일어나므로 분석이 더 힘들다. +메시지 형식 및 API를 모아두는 중앙 저장소를 운영하면 도움이 될 것이다. +이 저장소에서 코드나 문서까지 생성해 준다 면 더욱 좋다. 시스템에서 처리하는 메시지나 정보를 추적할 수 있는 좋은 도구도 필요할 것이다. (고유한 추적 아이 디 + +이런 종류의 시스템은 맞춰야 하는 구성 요소 수가 더 많기 때 문에 배포하고 관리하기 더 까다롭다. +하지만 그 결과 시스템 이 더 잘게 쪼개지고, 전체 시스템이 아니라 개별 액터만 교체하여 시스템을 업데이트할 수 있다는 면에서 어느 정도 보상 받는다.