[Programming] Sync / Async & Blocking / Non-Blocking

Bik_Kyun·2022년 5월 11일
0
post-thumbnail

1. Blocking vs Non-Blocking

다른 주체가 작업을 할 때 자신의 제어권이 있는지 없는지가 관심사.

참고
제어권

  • 자신의 코드를 실행할 권리와 같은 것.
  • 제어권을 가진 함수는 자신의 코드를 끝까지 실행하고 자신을 호출한 함수에게 돌려준다.

Blocking

작업을 진행하다가 다른 주체의 작업이 시작되면 그 작업이 끝날 때까지 기다렸다가 자신의 작업을 다시 시작하는 것. 제어권이 없다.

  • 함수 B (호출된 함수)가 자신의 작업이 모두 마칠 때까지 함수 A (호출한 함수)에게 제어권을 넘겨주지 않고 대기하게 한다.

Non-Blocking

다른 주체의 작업과 상관없이 자신의 작업을 하는 것. 제어권을 가진다.

  • 함수 B (호출된 함수)가 바로 리턴을 해서 함수 A (호출한 함수)에게 제어권을 넘겨주고 A가 다른 일을 할 수 있게 해준다.

2. Synchronous vs Asynchronous

호출되는 함수의 작업 완료 여부를 신경쓰냐에 따라 함수 실행-리턴의 순차적인 흐름을 따르냐 안따르냐가 관심사.

Synchronous

작업을 동시에 수행하거나, 동시에 끝나거나, 끝나는 동시에 시작.

  • 함수 A (호출하는 함수)가 함수 B (호출되는 함수)의 작업이 끝난 후 리턴을 기다리거나, B로부터 바로 리턴을 받아도 작업의 완료 여부를 계속 확인한다. (A가 B를 호출한 뒤 B의 리턴값을 계속 확인하면서 신경쓴다.)

Asynchronous

시작과 종료가 일치하지 않으며, 끝나는 동시에 시작하지 않음.

  • 함수 A (호출하는 함수)가 함수 B (호출되는 함수)에게 callback을 전달해, B의 작업이 완료되면 전달받은 callback을 실행하고, A는 작업 완료 여부를 신경쓰지 않는다.

3. Blocking/Non-Blocking 과 Sync/Async의 조합

1) Sync & Blocking

함수 A는 함수 B의 리턴값을 필요로하기 때문에(Sync), B를 호출 후 B에게 제어권을 넘겨주고, B가 실행을 완료하고 리턴값과 제어권을 돌려줄때까지 기다린다.(Blocking).

ex) C or Java 코드 실행 후 커맨드에서 입력을 받는 경우, 제어권이 시스템에서 사용자로 넘어가고, 리턴값이 필요해서 사용자가 입력할 때까지 기다린다.

2) Sync & Non-blocking

A가 B를 호출한 후 제어권을 넘기지 않고 자신의 코드를 실행한다.(Non-blocking) A는 B의 리턴값이 필요하기 때문에 계속해서 B에게 함수 실행 완료 여부를 묻는다.(Sync).

ex) 게임 데이터 로드율

3) Async & Non-blocking

A가 B를 호출했을 때 제어권을 넘기지 않고 계속해서 자신의 코드를 실행한다(Non-blocking). 또한 B를 호출할 때 callback 함수를 같이 전달해, B 함수는 작업이 끝나면 A에게서 받은 callback 함수를 실행한다(Async).

ex) JavaScript 비동기 callback. 프론트에서 서버로 api 요청을 하고 응답을 기다리지 않고 자신의 일을 계속해서 실행.

4) Async & Blocking

A는 B의 리턴에 신경쓰지 않고 callback 함수를 보내는데(Async), B의 작업에 관심이 없음에도 불구하고 A는 B에게 제어권을 넘긴다 (Blocking). 따라서 A는 관련 없는 B의 작업이 끝날 때까지 기다린다.

  • Async & Blocking의 경우 Sync & Blocking과 성능 차이가 거의 없기 때문에 사용하는 경우가 많지 않다.
  • Non-blocking을 하려다가 실수로 발생하는 경우 또는 의도치 않게 사용되는 경우가 있다.
profile
비진

0개의 댓글