블로킹, 논블로킹
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://www.inflearn.com/course/spring-reactive-web-application-reactor1%EB%B6%80