Posts 블로킹(Blocking)과 논블로킹(Non-blocking) 이해하기
Post
Cancel

블로킹(Blocking)과 논블로킹(Non-blocking) 이해하기

블로킹(Blocking)과 논블로킹(Non-blocking)이란?

서버의 동작 과정이나 I/O 작업에서 블로킹(Blocking)논블로킹(Non-blocking)은 호출된 함수가 호출한 함수에게 제어권을 바로 돌려주느냐 아니냐의 차이를 나타내는 개념이다.

이는 주로 대상의 제어권(Control)이 어디에 있는지를 기준으로 구분한다.

블로킹 (Blocking)

블로킹은 호출된 함수가 자신의 작업을 모두 마칠 때까지 호출한 함수에게 제어권을 넘겨주지 않고 대기하게 만드는 방식이다.

  • 동작 과정:
    1. A 함수가 B 함수를 호출
    2. 제어권이 B 함수로 넘어감
    3. B 함수는 자신의 작업을 수행하며, 그동안 A 함수는 작업을 멈추고 대기 (Block 상태)
    4. B 함수가 작업을 완료하고 리턴(Return)하면 제어권이 다시 A 함수에게 반환
    5. A 함수는 그제서야 다음 작업을 이어서 수행

논블로킹 (Non-blocking)

논블로킹은 호출된 함수가 자신의 작업 완료 여부와 상관없이 바로 제어권을 호출한 함수에게 돌려주어, 호출한 함수가 다른 작업을 계속할 수 있게 하는 방식이다.

  • 동작 과정:
    1. A 함수가 B 함수를 호출
    2. B 함수는 호출받자마자 제어권을 다시 A 함수에게 반환
    3. A 함수는 제어권을 가지고 자신의 다음 작업을 수행
    4. B 함수는 백그라운드에서 자신의 작업을 수행 (작업이 완료되지 않았더라도 A는 멈추지 않음)

블로킹 vs 논블로킹 비교

구분블로킹 (Blocking)논블로킹 (Non-blocking)
제어권 반환작업이 끝날 때까지 반환하지 않음호출 즉시 반환함
호출자 상태대기(Wait) 상태로 멈춤자신의 작업을 계속 수행함
시스템 효율I/O 작업 시 CPU가 노는 시간이 발생함I/O 대기 시간 동안 다른 작업 처리가 가능함
구현 난이도직관적이고 상대적으로 단순함흐름이 복잡해질 수 있음 (콜백 등 필요)

동기/비동기와의 결합

블로킹/논블로킹은 종종 동기(Synchronous)/비동기(Asynchronous)와 혼용되지만, 엄밀히 말하면 서로 다른 관점의 개념이다.

  • Sync/Async: 출력(결과)을 누가 처리하며, 언제 확인하느냐의 관점
  • Blocking/Non-blocking: 제어권을 누가 가지고 있느냐의 관점

이 두 개념이 결합되어 주로 4가지 모델이 나타난다.

1. Sync-Blocking (동기 + 블로킹)

가장 일반적인 모델로, 호출자가 결과를 기다리며(Sync), 제어권도 넘겨준 상태(Blocking)를 의미한다. 결과가 올 때까지 아무것도 못 하고 기다린다. (예: 일반적인 JDBC 작업)

2. Async-Blocking (비동기 + 블로킹)

호출자가 결과에 관심이 없는데(Async), 제어권은 넘겨준 상태(Blocking)이다. 주로 의도치 않게 발생하며(논블로킹으로 호출했는데 내부에서 블로킹 함수를 호출하는 경우 등), 성능상 이점이 없어 피해야 할 모델이다.

3. Sync-Non-blocking (동기 + 논블로킹)

제어권을 바로 돌려받아 다른 작업을 할 수 있지만(Non-blocking), 결과가 나왔는지 계속해서 확인하는(Sync) 모델이다. (예: 폴링(Polling) 방식)

4. Async-Non-blocking (비동기 + 논블로킹)

제어권을 바로 돌려받아 내 할 일을 하고(Non-blocking), 작업이 완료되면 알림이나 콜백을 통해 결과를 처리하는(Async) 모델이다. 고성능 서버 아키텍처에서 지향하는 모델이다. (예: Node.js, Spring WebFlux)


결론

블로킹과 논블로킹의 핵심은 “제어권의 즉시 반환 여부”에 있다. 서버 애플리케이션의 성능을 높이기 위해서는 I/O 작업과 같은 대기 시간이 발생하는 구간에서 논블로킹 방식을 적절히 활용하여 시스템 리소스(CPU, Thread)를 효율적으로 사용하는 것이 중요하다.


참고자료 :
This post is licensed under CC BY 4.0 by the author.

Contents

애플리케이션에서의 동시성 처리

-