Blocking/Non-Blocking (추가 내용)

smj_716·2025년 3월 8일

Java-study / live-study

목록 보기
13/16

IO와 NIO의 차이점을 다루면서 Blocking과 Non-Blocking에 대해 간단히 알아보았다. 하지만 동기와 비동기의 개념과 혼동되어 4가지에 대해 정리해보려고 한다.

호출한 함수 : caller -> A
호출된 함수 : callee -> B

1. Blocking vs Non-Blocking

A 함수가 B 함수를 호출했을 때, A가 실행을 멈추고 기다리는가?
즉, 제어권(Control)을 넘기는가? 에 따라 구분된다.
제어권
코드를 실행할 권리라고 생각하면 된다. 제어권을 가진 함수는 자신의 코드를 끝까지 실행한 후, 자신을 호출한 함수에게 돌려준다.

👉 Blocking

  • 블록킹은 A 함수가 B 함수를 호출할 때 B 함수에게 제어권을 주는 것이다.
  • 제어권을 넘겨주면 A 함수는 실행을 잠시 멈추고, B 함수가 실행이 완료되어 제어권을 다시 돌려주면 실행할 수 있다.

ex) 택배로 예시를 들자면 현관 앞에서 택배를 계속 기다리는 것이다.

👉 Non-Blocking

  • 논블록킹은 A 함수가 B 함수를 호출해도 제어권은 그대로 가지고 있는 것이다.
  • A 함수는 B 함수를 호출한 후에도 자신의 코드를 계속 실행한다.

ex) 택배 주문 후 다른 일을 하는 것이다.


2. Synchronous vs Asynchronous

A가 B의 작업 완료 여부를 계속 확인하는가?
즉, 작업 완료 여부를 신경 쓰는가? 에 따라 구분된다.

👉 동기

A 함수가 B 함수를 호출 한 뒤, 함수 B의 리턴값을 계속 확인하면서 신경쓰는 것이다.

ex) 현관문을 열어서 택배가 왔는지 계속 확인하는 것이다.

👉 비동기

A 함수가 B 함수를 호출할 때 콜백 함수를 함께 전달해서 함수 B의 작업이 완료되면 함께 보낸 콜백 함수를 실행한다.
A 함수는 B 함수를 호출한 후로 함수 B의 작업 완료 여부에는 신경쓰지 않는다.

ex) 택배가 도착했다는 문자 알림을 받으면 그때 확인하는 것이다.


3. 4가지 조합

🌟 Sync-Blocking

  • A 함수는 B 함수의 리턴값을 필요로 한다. (동기)
  • 그래서 제어권을 B 함수에게 넘겨주고, B 함수가 실행을 완료하여 리턴값과 제어권을 돌려줄 때까지 기다린다. (블록킹)

상사 : 이것좀 부탁해요~
나 : 네 바로 끝나니까 기다려주세요
싱사 : (아무것도 안하고 기다림, 언제끝나는지 궁금)
나 : (타닥타닥..)
상사 : (지켜보는중)
상사 : 오 끝났네요!

🌟 Sync-Nonblocking

  • A 함수가 B 함수를 호출할 때 제어권을 주지 않고 자신의 코드를 계속 실행한다. (논블로킹)
  • 그런데 A 함수는 B 함수의 리턴값이 필요하기 때문에 계속 B 함수에게 실행을 완료했는지 물어본다. (동기)

상사 : 이것좀 부탁해요~
나 : 넵 (타닥타닥..)
상사 : (할거 하다가) 다하셨나요?
나 : 잠시만요
상사 : (할거 하다가) 다하셨나요?
나 : 네 여기요~

🌟 Async-Nonblocking

  • A 함수가 B 함수를 호출할 때 제어권을 B 함수에게 주지 않아 자신의 함수를 계속 실행한다. (논블록킹)
  • B 함수를 호출할 때 콜백함수를 함께 준다. B 함수는 자신의 작업이 끝나면 함수 A가 준 콜백 함수를 실행시킨다. (비동기)

선배 : 이것좀 부탁해요~
나 : 넵 다하고 말씀드릴게요! (타닥타닥..)
선배 : (할일 하는 중)
나 : 끝났어요 여기요!

🌟 Async-blocking

  • 이 경우는 잘 일어나지 않는다고 한다.
    함수 A는 함수 B의 리턴 값에 신경쓰지 않고 콜백 함수를 보낸다. (비동기)
  • 함수 A가 B의 작업에 관심이 없음에도 불구하고, 제어권을 넘긴다. 즉 자신과 관련이 없는 B 함수의 작업이 끝날 때까지 기다려야한다. (블로킹)

상사 : 이것좀 부탁해요~
나 : 네 바로 끝나니까 기다려주세요
상사 : (아무것도 안하고 기다림, 언제끝나는지 관심없음)
나 : (타닥타닥..)
나 : 끝났어요!

0개의 댓글