TIL(사전캠프)

리액티브.(2024-07-04)

note994 2024. 7. 4. 23:23

1. Non-Blocking I/O

Non-Blocking I/O, Blocking I/O와 반대로 스레드가 차단되지 않는다.

그림1

그림3-3 Non-Blocking I/O

 

[그림 3-3]은 Non-Blocking I/O를 설명하기 위한 예시입니다.

 

[그림 3-1]과 마찬가지로 클라이언트 PC에 본사 API 서버로 도서 정보 조회를 위한 요청을 보낸다. 그리고 본사 API 서버에서는 마찬가지로 클라이언트 PC의 요청에 맞는 도서 데이터를 제공하기 위해 지점 API 서버에 추가 요청을 보낸다.

 

그리고 이번에는 하나의 지점 API 서버가 아니라 A 지점 API 서버와 B 지점 API 서버 이렇게 두 개의 API 서버로 구성되어 있다. 만약에 [그림 3-1]과 같이 Blocking I/O 방식이라면 A 지점 API 서버의 요청을 처리하는 동안에는 스레드가 차단되기 때문에 A 지점 API 서버의 요청 처리가 끝날 때까지 B 지점 API 서버로 요청을 보내지 못할 것이다.

 

하지만 [그림 3-3]의 경우 A 지점 API 서버로의 요청을 처리하는 동안 스레드가 차단되지 않기 때문에 대기 없이 B 지점 API 서버로 요청을 즉시 보낼 수 있다.

 

이처럼 Non-Blocking I/O 방식의 경우, 작업 스레드의 종료 여부와 관계없이 요청한 스레드는 차단되지 않는다. 

 

Non-Blocking I/O 방식의 경우 스레드가 차단되지 않기 때문에 하나의 스레드로 많은 수의 요청을 처리할 수 있다.

 

즉, Blocking I/O 방식보다 더 적은 수의 스레드를 사용하기 때문에 Blocking I/O에 멀티스레딩 기법을 사용할 때 발생한 문제점들이 생기지 않는다. 따라서 CPU 대기 시간 및 사용량에 있어서도 대단히 효율적이다.

 

하지만 Blocking I/O 방식보다 뛰어난 성능을 보이는 Non-Blocking I/O 방식에도 단점은 존재한다.

 

1. 만약 스레드 내부에 CPU를 많이 사용하는 작업이 포함된 경우에는 성능에 악영향을 준다

 

2. 사용자의 요청에서 응답까지의 전체 과정에 Blocking I/O 요소가 포함된 경우에는 Non-Blocking의 이점을 발휘하기 힘들다

 

'TIL(사전캠프)' 카테고리의 다른 글

리액티브. (2024-07-08)  (0) 2024.07.08
Java. 배운거 기록하기(2024-07-05)  (0) 2024.07.05
리액티브. (2024-07-03)  (0) 2024.07.03
리액티브. (2024-07-02)  (0) 2024.07.02
리액티브. (2024-06-28)  (0) 2024.06.28