왜 프론트엔드 개발자를 무시할까?
- 잘 모르기 때문에..
- 프로그래밍 모델, 컴퓨터 내부, 컴퓨터 사이언스 내용에 대한 부족
- 바깥에 표현하는거에 관심
- 중급 이상이 넘어가면 얘기가 안통한다고 생각하게 됨
Parallelism 병렬성
- 병렬성이 동시성을 이해하는 것보다 쉽다.
- Worker가 동시에 투입되고 일을 동시에 처리할 수 있다.
- 프론트엔드에서는 네트워크에 무언가 요청을 하면 네트워크 서버가 돌고 클라이언트에서 돌고있다.
- Task에 할당되는 worker가 별도로 존재해서 자기만의 속도와 스케줄로 일을 처리한다.
- 각각의 Task가 하나의 메모리를 동시에 같이 사용하면 문제가 생긴다.
- 하나의 Task가 메모리를 사용하고 있으면 나머지 Task를 Blocking을 하는 방법을 사용
- 자바스크립트는 병행성이 막혀있다(es2018 이전까지)
함수형은 프로그래밍
은 공유를 하지말고 특정 메모리만 쓰도록 한다객체지향 프로그래밍
은 공유하는 메모리를 인정할 수 밖에 없다 → 객체 식별을 새로 만들어진 값으로 하는게 아니라 포인터 참조로 되기 때문에 각각의 Task들이 하나의 메모리를 참조 할 수 있다
Concurrency 동시성
- 엄밀히 말하면 동시에 일어나지 않음
- 마치 동시에 일어나는 것처럼 보이는거임
- 메모리를 동시에 쓰는 경우가 없다
- 자바스크립트에서는 병행성이 없고 동시성만 있다
- 동시성과 병행성의 가장 큰 차이는 Worker가 몇명인지이다.
실제 세계의 Concurrency
- 한번에 하나만 하긴 하더라도 굉장히 복잡하게 많은 일을 한다
자바스크립트 Concurrency
engine work
- 브라우저는 렌더링을 포함한 수많은 엔진들이 하는 일들을 한다. (통신 준비, favicon 요청, console 초기화, 메모리 initialize 등등) → 멀티스레드로 수행한다.
- 자바스크립트 코드가 영향을받는 메모리 블럭을 수행할 때는 하나의 스레드를 사용한다.
- 자바스크립트 메모리에 영향을 주지않는다면 여러개의 스레드를 사용한다
- queue에 걸리는게 없다면 engine work가 할일을 계속 수행한다
- queue에 실행할 일이 생기면 run JS 실행한다
- 실행이 끝나면 다시 engine work 수행한다.
check queue
- 자바스크립트 명령을 적재해 둔게 있는지 없는지 검사한다.
- callback queue를 바라본다.
callback queue
- 브라우저 로딩에 들어가는 스크립트 callback queue
- 이벤트 리스너 callback queue
생산자 & 소비자 ⇒ 멀티 스레드 패턴
- 소비자가 하나의 스레드 메모리에서 읽기만 한다.
- 소비자가 하나만 두는 것을 파이프 패턴이라 한다.
- network, timer, message, dom event는 멀티스레드로 돌리더라도 synchronize 문제가 생기지 않는다.
- callback queue를 중심으로 동시성과 병행성이 나뉜다.
- 병행성에서는 생산만, 동시성에서는 소비만 하는 패턴
setTimer
1 | const Item = class{ |
const gene2 = function*(max, load, block) => {
let i = 0;
while(i < max){
yield new Promise(res => {
let curr = load;
while(curr– && i<max){
block();
i++;
}
console.log(i);
timeout(res, 0);
});
}
};
const nbFor = (max, load, block)=>{
const iterator = gene(max, load, block);
const next = ({value, done})=> done || value.then(v=>next(iiterator.next()));
next(iterator.next());
};
```
callback 스타일은 제어권을 잃는다
우리가 원하는 시간에 callback이 오면 좋겠다
서버 응답은 우리가 원하는데로 오지 않는다
제어권을 통제하기 위해서는 프로미스 객체를 가지고 있다가 내가 원할때 then을 호출 →반제어권
promise와 callback의 차이 → 내가 원할때 then을 호출할 수 있다
promise.then으로 쓰면 callback과 똑같다
generator와 promise를 섞어서 사용하면 외부제어에 일부를 개입할 수 있는 제어 역전을 결정할 수 잇따