2022. 6. 8. 13:54ㆍ카테고리 없음
병렬처리에 대한 이슈.
중급/고급 개발로 갈 때 마주치는 문제들..
병렬 처리 & 병행 처리
병렬: 하나의 task를 한 명이 처리 하다 두명 , 세명등으로 나누는.
병행: 하나의 task는 하나의 프로세스가 처리
## why?
node.js는 single thread. single thread성능 한계.
대부분 cpu가 멀티 코어로 나오고 있고, 이렇게 멀티 코어로 나온 코어를 동시에 활용하는 게 성능이 더 높다
## 장점만있나
1. cpu 숫자에 따라서 어떻게 처리를 할 지 선택을 해야함
ex) cpu core숫자에 * 2 해서 처리하도록 개발자가 주는게 적절. 너무 많으면 너무 큰 오버헤드를 발생
* 함수형 프로그래밍이 이런 병렬 처리를 하는 데 적합하게 됨
2. 공유 자원의 접급 문제
병렬적으로 동시에 공유자원에 접근할 때 원하는 값을 받을 거라는 확신을 받을 수 없음.
사실 공유 자원에 서로 접근하지 않는게 best! 하지만 그런 경우 쉽지 않고, 예기치 않게 공유 자원에 접근하는 경우가 빈번..
-> 하나의 실행만 한 명만 실행하게 하자(상호배제)
상호배제를 위한 수단: Lock or Atomic Operation
* Lock의 종류
- 뮤텍스
: 한 놈 들어오면 끝
- 세마포어
: 방에 4명 들어올 수 있는데 그거 까지만 받겠음.
- etc
* Atomic Operation
실행되고 있는 동안에 다른 실행이 들어오지 못하도록.
## Lock으로 해결이 다 되냐?
-> Nope... 100명이 동시에 들어왔는데 그걸 lock으로 하나씩 처리? 당연히 성능적 한계.
-> Dead lock : key를 누군가 가지고 있어야 되는데 죽는 경우 누구도 그 집을 들어갈 수 없음.
## Lock 문제를 어케 해결?
single thread에서 처리
->병렬처리 지금 쭉 얘기했는데 그냥 쓰지 말자? 그게 아니라 공유자원 접근하는 부분은 single-thread로
-> 이런 부분에서는 병행 처리를 사용해서 처리를 하자 (https://nesoy.github.io/articles/2018-09/OS-Concurrency-Parallelism)
* 사실 JS는 single-thread여서 이런 문제가 크게 발생하지는 않음.
-> 아키텍처 부분에서 해결하는 방법?
: lock을 안잡게 하도록 아키텍처로 잡는 방법. 쉽지는 않음.
immutable로 ? 함수형 언어가 병렬처리에 좋은 이유.
함수형 언어는 불변성을 되게 따짐.
공유자원 문제가 언제 발생? 바꿀때 발생! 그래서 못바꾸게 하자
var balance: number = 100;
function draw(amount: number) {
if (balance <= amount) {
throw "잔액이 충분하지 않습니다.";
}
let newBalance = balance - amount;
balance = newBalance;
}
/*
draw(10), draw(11)을 동시에 발생하면
*/
--> 불변성을 적용해서
balance를 불변으로 잡아주고 계산만 하도록
[100 , -10, -11]