Blocking I/O Vs. Non-Blocking I/O
✏️ Blocking I/O 방식
- 작업 쓰레드가 종료될 때 까지 요청을 한 쓰레드는 차단된다.
- 이러한 단점을 보완하기 위해 멀티 쓰레딩 기법으로 추가 쓰레드를 할당 할 수 있다.
📍 Blocking I/O 방식의 단점
- CPU 대비 많은 수의 쓰레드를 사용하면 비효율 적이 된다.
- 컨텍스트 스위칭으로 인한 쓰레드 전환 비용 발생
- 메모리 사용에 있어서 오버헤드 발생
- 쓰레드 풀에서의 응답 지연 문제 발생
⚠️ 컨텍스트 스위칭 비용 발생
- 프로세스간의 컨텍스트 스위칭시 CPU 는 실행중이던 프로세스를 PCB 에 저장하고, 실행할 프로세스를 PCB 에서 불러오는 추가시간이 발생한다.
- 따라서 실행 시점과 유휴 시점이 딱 들어맞지 않게된다.
- 결국 컨텍스트 스위칭이 잦을수록 CPU 의 전체 대기 시간이 늘어나 성능이 저하된다.
✏️ Non-Blocking I/O 방식
- 기본적으로 요청을 처리하는 중 쓰레드가 차단되지 않기 때문에 클라이언트로부터 복수의 요청을 받고 외부 API 로 요청을 할 수 있다.
📍 특징
- 작업 쓰레드의 종료와 상관없이 요청을 한 쓰레드는 차단되지 않는다.
- 적은 수의 쓰레드를 사용하기 때문에 쓰레드 전환 비용이 적게 발생한다.
- CPU 대기 시간 및 사용량에 있어서 효율적임
📍 단점
- CPU 를 많이 사용하는 작업이 표함 되어 있을 경우 성능 향상에 악영향을 준다.
- 이러한 단점을 보완하기 위해 외부시스템에 작업을 위임하는 방식이 사용된다.
- 만약 사용자의 요청 ~ 응답 까지의 과정중 하나라도 Blocking I/O 요소가 포함되어 있을 경우 이점을 발위하기 힘들다.