1 분 소요

동기/비동기, 블로킹/논블로킹는 서로 비슷해 보이지만 이 둘을 구분하는 기준이 다르다. 동기/비동기는 각 작업(함수)들이 서로 시간을 맞춰서 실행되는지를 기준으로 나뉘고 블로킹/논블로킹은 한 작업을 처리하는 동안 다른 작업을 처리할 수 있는지를 기준으로 나눈다.

하나씩 살펴보자.

블로킹(Blocking) 과 논블로킹(Non-Blocking)

앞서 말한 것처럼 블로킹/논블로킹은 하나의 작업을 처리하고 있는 상태에서 다른 작업을 처리할 수 있는지를 따진다고 했다. 이는 다른 작업(함수)를 호출했을 때, 현재 작업(함수)가 실행이 차단되는지, 아닌지를 따진다는 것이다.

블로킹/논블로킹을 설명하는데 제어권, 결과값이라는 용어가 자주 사용된다.


제어권은 함수 내의 명령어를 실행할 수 있는 권한이고 결과값은 함수의 리턴값이다. 이제 이 2가지 개념을 통해서 블로킹과 논블로킹을 구분해보자.

블로킹 (Blocking)

블로킹은 함수를 호출할 때, 제어권을 호출된 함수로 넘긴다. 때문에 제어권을 상실한 호출한 쪽은 자신의 로직을 실행할 수 없고 호출된 함수가 제어권을 돌려줄 때까지 기다려야 한다.

논블로킹 (Non-Blocking)

논블로킹도 블로킹 방식과 마찬가지고 함수를 호출하면 제어권이 넘어가지만 곧바로 제어권이 다시 돌아온다. 때문에 실행이 블락되지 않고 자신의 로직을 계속 실행하게 된다.


동기(Synchronous) 와 비동기(Asynchronous)

동기와 비동기의 경우는 각 작업(함수)들이 서로 시간을 맞춰서 실행하는지를 따져서 구분한다.

동기 (Synchronous)

동기는 요청한 작업의 완료 여부를 따져서 처리한다. 이는 다른 말로 호출한 쪽에서 호출된 쪽을 계속 신경쓴다는 것이다.

예를 들어 함수 A가 함수 B를 호출했다면 함수A는 함수 B의 종료를 확인할 때까지 계속해서 함수 B의 상태를 확인한다.

동기의 경우 제어권과 결과값이 동시에 반환된다고 말할수도 있다. 호출된 함수가 결과값을 리턴하는 시점에 제어권이 호출하는 함수쪽으로 넘어가기 때문이다.

비동기 (Asynchronous)

비동기의 경우 요청한 작업의 완료 여부를 신경쓰지 않는다. 한번 호출하면 호출된 쪽의 상태를 신경쓰지 않는다.

예를 들어서 함수 A가 함수 B를 호출했을 때, 함수 A는 함수 B의 종료를 신경쓰지 않고 자신의 로직을 수행한다.

비동기의 경우는 제어권과 결과값이 따로 반환된다. 제어권은 호출하고 거의 바로 돌려 받지만 결과값은 호출된 함수가 종료되는 시점에 돌려주기 때문이다.

가능한 조합

img1

총 4가지 조합이 가능하며 주로 동기-블로킹, 비동기-논블로킹 조합을 구성한다. 여기서는 이 두가지 경우에 대해서만 자세히 알아보자.


동기 & 블로킹

img1

동기 & 블로킹 조합은 다른 작업이 수행되는 동안에 자신의 작업은 처리하지 않고 다른 작업의 종료 여부를 받아서 순차적으로 작업을 처리하는 방식이다. 이는 다른 작업이 자신의 작업에 영향을 줄 수 있는 경우에 사용할 수 있다.


비동기 & 논블로킹

img1

비동기 & 논블로킹 조합은 다른 작업을 수행할 때도 자신의 작업을 처리하고, 다른 작업의 결과를 기다리지 않는 방식이다. 다른 작업이 자신의 작업에 영향을 주지 않는 경우 사용할 수 있다.

참고