blocking과 synchronous는 다른 거라고?

Mando·2023년 4월 25일
1

Blocking과 non-blocking의 차이


호출자가 피호출자를 호출했을 때, 제어권이 피호출자에게 넘어가냐 넘어가지 않느냐로 구분할 수 있다.

  • blocking : 제어권이 피호출자에게 넘어간다. 따라서 호출자는 아무것도 하지 못한다.
  • non - blocking : 제어권이 피호출자에게 주어졌다가 바로 호출자로 넘어온다. 따라서 호출자도 자신의 일을 수행할 수 있다.

Blocking

호출자는 피호출자가 결과를 줄 때까지 호출자 스레드는 아무것도 하지 못하고 기다려야 한다.

Non - Blocking

호출자는 피호출자에게 특정 행동을 요청하면
호출자와 피호출자는 동시에 자신의 일을 수행할 수 있다.

여기까지 듣고나면 동기 == 블로킹 / 비동기 == 논블로킹 처럼 생각이 된다.
하지만, 동기/비동기와 블로킹/논블로킹은 서로 다른 영역에 대한 이야기이다.

Synchronous와 Asynchronous의 차이


호출자가 피호출자를 호출했을 때, 피호출자가 수행한 결과값에 관심이 있냐 없냐로 구분할 수 있다.

  • synchronous : 호출자는 피호출자의 결과에 관심이 있다. 따라서 완료 여부를 지속적으로 확인한다.
  • asynchronous : 호출자는 피호출자의 결과에 관심이 없다. 따라서 완료 여부를 확인하지 않는다.

Synchronous

호출자는 피호출자의 결과에 관심이 있다. 그래서 호출자는 자신의 일을 수행하면서 주기적으로 피호출자가 일을 다 수행했는지 물어본다.

Asynchronous

호출자는 피호출자의 결과에 관심이 없다. 따라서 피호출자가 자신의 일을 다 수행하면 callback 함수를 통해 이후 일을 수행한다.

Sync / Async + Blocking/Non - Blocking의 조합


Synchronous + Blocking

  • Blocking : 제어권이 피호출자에게 넘어간다. 따라서 호출자는 자신의 일을 수행하지 못하고 피호출자가 작업을 완료할 때까지 기다려야 한다.
  • Synchronous : 호출자는 피호출자의 결과에 관심이 있다. blocking 방식이기 때문에 피호출자가 작업을 완료하면 결과를 return 해준다.

Synchronous + Non - Blocking

  • Non - Blocking : 호출자가 피호출자에게 제어권을 넘겨주었지만, 바로 피호출자가 호출자에게 제어권을 다시 준다.
  • Synchronous : 호출자는 피호출자의 결과에 관심이 있다. 따라서 호출자는 본인의 일을 수행하면서 피호출자에게 지속적으로 결과 완료 여부를 물어본다.
    이후 피호출자가 자신의 일을 완료한 후에 호출자가 피호출자에게 완료 여부를 물어보면 그때 결과값을 return 해준다.

언제 사용할까?

자바에서 Future을 사용하는 경우
Future을 사용하여 필요한 외부 로직을 요청하고 내부에선 다른 로직을 수행하다가 어느 정도 작업이 마무리되면 외부에 호출된 결과값을 확인하여 기다리다 나머지 로직을 수행한다.

Asynchronous + Non - Blocking

  • Non - Blocking : 호출자가 피호출자에게 제어권을 넘겨주었지만, 바로 피호출자가 호출자에게 제어권을 다시 준다.
  • Asynchronous : 호출자는 피호출자의 결과에 관심이 없다.

위 경우는 non - blocking이기 때문에 제어권도 호출자에게 있다.
따라서 피호출자는 일을 다 수행하면 해당 결과를 호출자에게 넘겨줄 수도 없다.

그럼 해당 결과를 통해서 어떻게 이후 일을 수행할 수 있을까?
바로 호출자는 피호출자를 호출할 때 콜백 함수를 같이 전달한다.
피호출자는 자신의 일을 수행한 후에 결과가 나오면 이 콜백 함수를 통해서 이후 일을 수행한다.

콜백 함수는 어떤 스레드에서 실행시킬까?

콜백 함수는 피호출자 스레드에서 실행된다.

비동기 + 논블로킹으로 실행한 결과값을 다시 호출자로 넘겨줄 수는 없는가?

그것도 가능하다.
Asynchronous이기 때문에 우리는 호출자에게 Future 객체(미래에 완료될 객체)를 넘겨주었다.
비동기 + 논블로킹으로 실행한 후에 결과가 나왔으면 호출자 스레드에서 Future.get()을 실행시키면 된다.

하지만, 이때 피호출자가 아직 일을 다 수행하지 않았더라면 다시 블로킹 방식으로 실행하게 된다.
따라서,

Asynchronous + Blocking

  • Blocking : 호출자가 피호출자에게 제어권을 넘겨주었다. 따라서 호출자는 자신의 일을 수행하지 못한다.
  • Asynchronous : 호출자는 피호출자의 결과에 관심이 없다. 하지만 blocking 방식이기 때문에 피호출자가 자신의 일을 수행할 때까지 기다려야 한다.

언제 사용할까?

Node.js(비동기 + 논블로킹)와 Mysql(블로킹)을 사용하는 경우다.
Node.js언어로 Mysql의 데이터를 사용한 로직을 구현하다보면 비동기 + 블로킹 방식으로 동작하는 것을 볼 수 있다.

0개의 댓글