글을 시작하기전
function A(){
B();
C();
}
이처럼 A가 호출하는 함수 , 나머지가 호출된 함수라고 가정하자.
제어권
간단히 말하자면, A가 B에게제어권
을 주냐(Non-Blocking) 안주냐(Blocking) 차이이다.
B가 자신의 일을 다 할때까지 제어권
을 가진다. A는 기다려야함. 그동안 C로 넘어갈 수 없다.
B가 A에게 제어권을 바로 넘겨줘서 A가 자신의 일을 할 수 있다. C로 넘어갈 수 있다.
A는 B를 기다리면서 다른일을 한다
시간, 동시성
간단히 말하면, B의 종료를 A가 처리하느냐(Sync) 마느냐(Async) 차이
A는 B가 동작 하는 중에, 결과를 기다리면서 상태체크한다. 그리고 B끝나면, 전달받은 값으로 가지고 처리한다.
여기서 Blocking과 다른점이 , Blokcing은 그냥 기다리기만 하는데, Sync는 확인한다는 것이다.
Java에서 synchronized 키워드를 통해 쓰레드간 동기화를 할 수 있다 -> data의 thread-safe
Java는 block/sync , JS는 non-block/async 인것을 떠올리면 두개는 어느정도 이해가 될 것
이런 JAVA에서의 입출력 상황을 생각
이런 경우는 보통 개발자의 실수로 발생한다고 한다.
while문을 보면 while문으로 자기할일을 계속(Non-Block)하면서
ready를 확인 한다(Sync)
그리고 그결과를 바로처리한다.
예시를 들면,
치킨 시키고 다른일 하면서 치킨언제오는지 계속 확인하는것이다. 오면 바로 먹고
B가 진행되는 동안 A는 자기일을 계속한다. (Non-Block)
그리고 A는 B의 결과를 바로 처리하지 않아도 된다(신경x) (Async)
완전 따로따로 논다고 생각하면된다.
보통 JS에서 API 요청을 하고, 다른 작업을 하다가 콜백을 통해 추가적인 작업을 처리할 때 이렇게 한다.
4가지 중 가장 자원을 효율적으로 사용하는 케이스이다