[JS] blocking과 sync는 다르다!
카테고리 없음

[JS] blocking과 sync는 다르다!

728x90

 

자바스크립트는 non-blocking single thread 언어라고들 한다.

 

싱글 스레드임에도 멈추지 않고 비동기 지원이 되기 때는데, 이때 이벤트루프를 통해 이를 해결한다.

 

그렇다면 blocking-sync , non-blocking-async 개념은 같다고 볼 수 있을까?

 

 

 

마냥 그렇다고는 할 수 없다.

 

차이점

빠르게 결론부터 알아보자.

 

Blocking

- A함수가 B함수를 호출한 경우 B 함수의 작업종료 전까지 A함수에게 제어권을 주지 않는 것

Non-blocking

- A함수가 B함수를 호출한 경우 B함수가 제어권을 A에게 바로 주어 A함수가 바로 일을 할 수 있는 것

Sync

- A함수가 B함수를 호출한 경우 B함수 결과를 A가 처리하는 것

Async

- A함수가 B함수를 호출한 경우 B함수 결과를 B가 처리하는 것

 

 

 

물론 Blocking - sync , non-blocking-async가 비슷한 개념이긴 하다. 익숙한 개념을 아래 그림을 통해서 이해해보자.

 

https://homoefficio.github.io/2017/02/19/Blocking-NonBlocking-Synchronous-Asynchronous/

 

 

해당 부분은 익숙한 경우일 것이다. 대부분의 케이스가 아래 두가지 케이스로 작동된다.

 

Blocking - sync

A함수가 B를 호출한 경우 Blocking 상태이기 때문에 A는 작업을 할 수 없다. 또한 Sync이기 때문에 B함수의 결과를 A가 처리해야 하기 때문에 반환이 일어난 후에 A는 B의 결과를 받아 작업을 이어나가게 된다.

 

Non-blocking - async

A함수가 B를 호출한 경우에도 Non-blocking 상태이기 때문에 A의 작업은 진행된다. 또한 B 함수의 결과는 B가 처리하기 때문에 A와 B가 별도로 진행되게 된다.

 

 

 

Non-Blocking - async

 

A함수에서 B를 호출한 경우 Non-blocking 상태이기 때문에 B가 호출되어도 A는 계속해서 진행된다. 다만 B의 결과를 A에서 처리해야 하기 때문에 위 그림처럼 B의 작업이 완료되었는지 확인하는 과정이 필요하다.

 

 

Blocking - async

마지막이다.  A가 B함수를 호출한 경우 Blocking 상태이기에 A의 작업은 멈추지만 B함수의 결과또한 B가 처리하기 때문에 그냥 B의 작업이 끝나면 A가 작동되는 경우이다.

 

구동 자체는 blocking-sync와도 유사해 보인다.

 

어쩌면 당연하지만 굳이 blocking-async 방식으로 프로그램을 설계할 필요는 없을 것 같다. 하지만 nonblcoking-async로 구현한 프로그램중에서 blocking으로 작동하는 함수가 하나라도 있다면 해당 부분에선 blocking-async으로 작동되는 경우가 있다.

 

 

 

 

결론

결론을 짓자면 blocking & non-blocking은 "제어권"까지 함수에게 넘기냐 안넘기냐가 중요한 포인트고

sync-async는 호출된 함수의 결과를 스스로 처리하는지 호출한 함수에서 처리하는지가 중요하다.

 

조금더 쉽게 이해하자면!

 

blocking - nonblocking : 요청에 대해 받은 쪽에서 처리가 끝나기 전에 리턴해주는가?

sync-async : 요청한 함수의 순서가 지켜지는가?

 

비슷한듯? 다른 용어였다.

 

 

 

 

728x90