본문 바로가기

Spring & Java

Blocking IO 와 Non-Blocking IO

반응형

Blocking I/O

Blocking I/O는 I/O 작업이 완료될 때까지 해당 스레드가 대기하는 방식입니다. 예를 들어, 파일에서 데이터를 읽는 작업을 수행하는 경우, 데이터 읽기가 완료될 때까지 스레드는 블록되어 다른 작업을 수행할 수 없게 됩니다.

스레드의 상태

Blocking I/O 작업 중에는 스레드가 "Blocked" 상태가 되며, 이 상태에서는 CPU가 해당 스레드를 실행하지 않습니다. 스레드는 I/O 작업이 완료될 때까지 대기합니다.

CPU의 상태

스레드가 블록된 동안 CPU는 다른 스레드나 프로세스의 작업을 실행할 수 있습니다. 만약 다른 실행 가능한 스레드가 없다면, CPU는 유휴 상태가 될 수 있습니다.

CPU 유휴 상태 방지

CPU의 유휴 상태를 방지하기 위해서는 Non-Blocking I/O를 사용하거나, 비동기 프로그래밍 모델을 사용할 수 있습니다. 이러한 방식을 사용하면 I/O 작업이 완료되기를 기다리는 동안 스레드가 다른 작업을 수행할 수 있게 됩니다.

Non-Blocking I/O

Non-Blocking I/O는 I/O 작업이 즉시 완료되지 않더라도 스레드가 대기하지 않고 즉시 반환되어 다른 작업을 계속 수행할 수 있는 방식입니다.

스레드의 상태

Non-Blocking I/O 작업 중에는 스레드가 계속해서 실행 상태를 유지하며, I/O 작업의 완료를 기다리지 않고 다른 작업을 수행할 수 있습니다.

CPU의 상태

스레드가 블록되지 않기 때문에, CPU는 계속해서 스레드의 작업을 실행할 수 있습니다.

스레드 증가시 단점

스레드를 무분별하게 늘리는 것은 메모리 사용량 증가, 컨텍스트 스위칭 오버헤드, 관리 복잡성 증가 등의 문제를 야기할 수 있습니다.

  1. 메모리 사용량 증가: 각 스레드는 자체 스택을 가지고 있으며, 스레드가 많아질수록 메모리 사용량이 크게 증가합니다.
  2. 컨텍스트 스위칭 오버헤드: 스레드 간의 컨텍스트 스위칭이 빈번하게 발생하면, 이로 인한 오버헤드가 성능을 저하시킬 수 있습니다.
  3. 관리 복잡성 증가: 스레드가 많아지면, 스레드 간의 동기화와 데이터 일관성을 유지하기 위한 복잡성이 증가합니다.

따라서 성능과 자원 사용 효율성을 고려하여 적절한 스레딩 모델과 I/O 처리 방식을 선택하는 것이 중요합니다.

반응형