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는 계속해서 스레드의 작업을 실행할 수 있습니다.
스레드 증가시 단점
스레드를 무분별하게 늘리는 것은 메모리 사용량 증가, 컨텍스트 스위칭 오버헤드, 관리 복잡성 증가 등의 문제를 야기할 수 있습니다.
- 메모리 사용량 증가: 각 스레드는 자체 스택을 가지고 있으며, 스레드가 많아질수록 메모리 사용량이 크게 증가합니다.
- 컨텍스트 스위칭 오버헤드: 스레드 간의 컨텍스트 스위칭이 빈번하게 발생하면, 이로 인한 오버헤드가 성능을 저하시킬 수 있습니다.
- 관리 복잡성 증가: 스레드가 많아지면, 스레드 간의 동기화와 데이터 일관성을 유지하기 위한 복잡성이 증가합니다.
따라서 성능과 자원 사용 효율성을 고려하여 적절한 스레딩 모델과 I/O 처리 방식을 선택하는 것이 중요합니다.
'SpringBoot' 카테고리의 다른 글
Spring Batch를 이용한 클러스터링과 분산 처리 설정 및 구현 방법 (0) | 2023.12.26 |
---|---|
Quartz를 이용한 클러스터링 설정과 구현 방법 (0) | 2023.12.26 |
Java OOM 발생 시퀀스 (0) | 2023.10.29 |
Java Heap 메모리 할당 과정 시퀀스 (0) | 2023.10.29 |
JMX (Java Management Extensions) 이해하기 및 모니터링 도구 (0) | 2023.10.29 |