✍🏻study/🎸기타

Sync vs Async, blocking vs non-blocking

peacekim 2022. 4. 26. 02:05
반응형

잡아 놓고 가면 좋은 개념일 거 같아서 정리를 하려고 한다.

 

Sync, Async를 비교하고, blocking, non-blocking을 비교한 후, 

두 개의 조합에 대해서 비교를 하겠다.

 

알아보기 이전에 용어에 대해서 알아보면 좋을 거 같다.

 

1. 제어권

- 제어권은 자신의 코드를 실행할 권리 같은 것이다. 제어권을 가진 함수는 자신의 코드를 끝까지 실행한 후, 자신을 호출한 함수에게 돌려준다. blocking, non-blocking을 설명할 때 사용할 용어이다.

2. 결과값을 기다린다

- A 함수에서 B 함수를 호출했을 때, A 함수가 B 함수의 결과값을 기다리느냐의 여부를 의미한다.

 

Blocking과 Non-Blocking

A 함수가 B 함수를 호출했을 때, "제어권"을 어떻게 처리하느냐에 따라서, 블로킹과 논블록킹을 나눈다.

 

블로킹

블로킹의 경우에는 A 함수가 B 함수를 호출하면, 제어권을 A가 호출한 B 함수에 넘겨준다.

즉, A 함수는 제어권이 없기 때문에, 함수 실행을 잠시 멈추고, B 함수의 실행이 끝나면, 제어권을 다시 받아서, 실행을 이어간다.

 

논블로킹

논블로킹의 경우는 A 함수가 B 함수를 호출해도 제어권을 B 에게 넘겨주는 것이 아닌, 자신이 그대로 가지고 있는 것이다.

그래서 블로킹처럼 자신의 함수가 멈추는 것이 아닌, 계속 실행되는 것이다.

 

Sync와 Async

호출되는 함수의 작업 완료 여부를 신경쓰는지의 차이이다.

 

Sync

함수 A가 함수 B를 호출한 뒤, 함수 B의 리턴값을 계속 확인하는 것이 동기이다. 즉, 요청과 결과 동시에 일어나는 것이다. 요청을 하면, 시간이 얼마나 걸리던 그 자리에서 결과값을 받아야 된다.

 

Async

함수 A가 함수 B를 호출할 때, 콜백 함수를 함께 전달해서, 함수 B의 작업이 완료되면 함께 보낸 콜백 함수를 실행한다. 즉, 요청과 결과가 동시에 일어나지 않는다. 요청한 결과가 그 자리에서 바로 주어지지 않는다. 콜백 함수로 통해 전달된다.

바로 결과 값을 주지 않기 때문에, 함수 A는 함수 B의 작업 완료 여부에는 신경을 쓰지 않는다.

 

위 값들을 조합

Sync-Blokcing

함수 A는 함수 B의 리턴값이 있어야, 뒤에 코드를 실행할 수 있다.(동기) 그래서 제어권을 B에게 넘겨주고, B가 실행을 완료하여 결과값과 제어권을 돌려줄때까지 기다린다.(블로킹)

 

Sync-NonBlocking

이렇게 사용하는 경우가 있을지는 모르겠다.

A 함수가 제어권은 계속 가지고 있으면서, 값을 실행하고, B 함수에게 결과값을 계속 물어보는 식으로 작동을 한다,,,,근데 이런 조합으로 쓰는 것이 있을까 한다.

 

Async-NonBlocking

sync-blocking조합과 가장 많이 사용하는 조합이 아닐까 한다.  Nodejs도 이 방식으로 돌아가는 것으로 알고있다.

A 함수가 B함수를 호출했을 때, 제어권을 B에게 주는 것이 아닌, 자신이 가지고 있으면서 자신의 코드를 실행시키고, B 함수가 함수가 완료되면, 결과값을 콜백함수로 받는다. 그리고 A 함수는 해당 콜백함수를 실행한다.

 

nodejs경우에는 call stack과 event loop가 존재해서, call stack이 비동기 작업이 들어왔을 경우, 그 작업을 blocking형태로 block을 해놓은 후, 처리하는 것이 아니라, 다른 I/O작업을 처리하는 thread들이 처리한 후, callback queue에 callback함수를 넣어주어, call stack이 비어있을 때, event loop가 callback을 call stack에 보내, 처리한다.

 

Async-blocking

이것도 사용하지 않고, 잘 보지도 못한 조합이다.

A 함수가 B 함수의 리턴 값을 신경쓰지 않고, 나중에 콜백함수로 처리한다. 하지만, B 함수에게 자신의 제어권을 넘겨준다. 그렇기 때문에, 비동기여도 자신의 함수를 실행하지 못하고, B 작업이 끝날 때 까지 기다려야 된다,, 말만 들어도 비효율적이다.

 

 

 

Reference

https://velog.io/@nittre/%EB%B8%94%EB%A1%9C%ED%82%B9-Vs.-%EB%85%BC%EB%B8%94%EB%A1%9C%ED%82%B9-%EB%8F%99%EA%B8%B0-Vs.-%EB%B9%84%EB%8F%99%EA%B8%B0

반응형