Contents

블로킹, 논블로킹

블로킹(Blocking), 논블로킹(Non-blocking)은 프로그램의 제어 흐름과 작업 처리 방식에 관련된 개념이다.

블로킹/논블로킹은 작업을 요청했을 때, 작업이 즉시 완료되지 않더라도 제어권을 넘겨주는지 여부로 구분한다.

블로킹(Blocking)

  • 개념: 작업을 요청한 후, 그 작업이 완료될 때까지 제어권을 반환하지 않고 기다리는 방식.
  • 특징
    • 작업 스레드가 종료될 때가지 요청을 한 스레드는 차단된다.
    • 이러한 단점을 보완하기 위해 멀티 쓰레딩 기법을 통해 추가 쓰레드를 할당할 수 있다.
    • CPU 대비 많은 수의 쓰레드를 사용하는 것은 비효율적이다.
    • 컨텍스트 스위칭으로 인한 쓰레드 전환 비용 발생
    • 메모리 사용에 있어서 오버헤드 발생
    • 쓰레드 풀에서의 응답 지연 문제 발생
  • 예시
    • 전통적인 파일 I/O나 네트워크 I/O 작업.
    • Thread.sleep() 호출로 스레드를 멈추는 경우.

논블로킹(Non-blocking)

  • 개념: 작업을 요청했을 때, 작업이 즉시 완료되지 않더라도 다른 작업을 계속 수행할 수 있는 방식.
  • 특징
    • 작업 스레드의 종료와 상관없이 요청을 한 스레드는 차단되지 않는다.
    • 적은 수의 스레드를 사용하기 때문에 스레드 전환비용이 적게 발생한다. 따라서 CPU 대기 시간 및 사용량에 있어서도 효율적이다.
    • CPU를 많이 사용하는 작업이 포함되어 있을 경우에는 성능 향상에 악영향을 준다.
    • 또한 사용자 요청에서 응답까지의 과정에 Blocking I/O 요소가 포함되어 있을 경우 Non-Blocking의 이점을 발휘하기 힘들다.
  • 예시
    • 자바의 NIO (Non-blocking I/O)

비교

개념 제어 흐름 대기 시간 사용 예
블로킹 멈춤 있음 파일 I/O, 네트워크 I/O
논블로킹 멈추지 않음 없음 NIO, 소켓 프로그래밍

참고

https://velog.io/@leehyunho2001/%EB%8F%99%EA%B8%B0-%EB%B9%84%EB%8F%99%EA%B8%B0-%EB%B8%94%EB%9F%AD-%EB%84%8C%EB%B8%94%EB%9F%AD

https://www.inflearn.com/course/spring-reactive-web-application-reactor1%EB%B6%80