Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 유저모드
- 컨텍스트 스위칭
- 바이너리 세마포
- 컨디션 변수
- cpu
- 스핀락
- os 쓰레드
- Lock
- MAP
- HashMap
- OS
- 하드웨어 쓰레드
- 페이지 테이블
- 스케줄링
- cpu-bound
- list
- 쓰레드 덤프
- set
- linkedmap
- 자바
- 유저 쓰레드
- synchronizeation
- #list
- io-bound
- 쓰레드
- CPU 스케줄러
- Mutual exclusion
- 커널모드
- Java
- non-blocking
Archives
변수의 기록
(CS 운영체제)CPU-bound vs IO-bound :시스템 최적화를 위한 성능 특성 및 쓰레드 전략 정리 본문
CS지식/운영체제 (Operating System)
(CS 운영체제)CPU-bound vs IO-bound :시스템 최적화를 위한 성능 특성 및 쓰레드 전략 정리
불광동 물주먹 2025. 4. 6. 02:212025년 4월 6일
운영체제 bound 공부
CPU-bound vs IO-bound: 서버 성능 최적화를 위한 핵심 개념 정리
웹 개발이나 서버 운영을 하다 보면 "CPU를 많이 쓰는 작업", "IO 때문에 느린 작업"이라는 표현을 자주 듣는다.
이 글에서는 그 차이를 명확히 이해하고, 시스템 설계나 튜닝 시 어떤 선택을 해야 하는지 정리
✅ CPU-bound와 IO-bound란?
구분 | CPU-bound | IO-bound |
의미 | CPU 연산이 병목인 작업 | 입출력(IO)이 병목인 작업 |
예시 | 영상 인코딩, 머신러닝, 압축 | 웹서버, DB 조회, 파일 저장, 외부 API 호출 |
병목 위치 | 연산 처리 속도 | 네트워크/디스크 응답 지연 |
CPU 사용률 | 높다 | 낮고 대기가 많다 |
IO 대기 | 거의 없다 | 많다 |
🔄 CPU Burst vs IO Burst
- ✔️ Burst란?
어떤 현상이 짧은 시간에 몰려서 집중적으로 일어나는 것을 의미한다.
- ✔️ CPU Burst
프로세스가 CPU에서 실제로 연산을 수행하는 시간.
메모리에 올라온 프로세스가 CPU를 점유하고 있는 동안 실행되는 시간이다. - ✔️ IO Burst
디스크나 네트워크 IO 같은 외부 자원을 기다리는 시간이다.
📌 대부분의 프로세스는 CPU Burst와 IO Burst를 번갈아가며 실행된다.
보통 실행 흐름은 아래와 같다:일반적으로 8ms 이내라고 알려져 있다
위 사진 - 프로세스를 실행하면, CPU Burst, IO Burst가 교차로 실행
위 그래프를 보면, 대부분의 프로세스는 CPU Burst가 8ms 이내에 종료되며
프로세스에 따라, CPU Burst 시간이 높은지(= CPU Bound),
상대적으로 적은지(= IO Burst 시간이 많음 = IO Bound)에 따라 분류 됨
이 흐름을 잘 이해해야 쓰레드 운영이나 성능 최적화가 가능하다.
🧠 쓰레드 수는 어떻게 정해야 할까?
🎯 CPU-bound 작업일 때
- 쓰레드 수 ≈ CPU 코어 수
- CPU 연산이 병목이므로 스레드가 많으면 오히려 성능이 떨어진다
문제 - 듀얼 코어 CPU에서 동작할 CPU BOUND 프로그램을 구현한다면 몇 개의 스레드를 쓰는게 좋을까?
정답- 4코어 서버 → 4~5개 스레드가 적절하다 (코어당 1개 쓰레드)
🎯 IO-bound 작업일 때
- 쓰레드 수는 코어 수보다 많아야 한다
- 대부분 대기 상태이므로 많은 요청을 처리하려면 여러 스레드가 필요하다
경험 공식: 쓰레드 수 ≈ 코어 수 × (1 + IO 대기시간 / CPU 사용시간)
🧩 비동기 처리 vs Non-blocking 구조
✅ @Async (Spring에서 흔히 쓰는 방식)
- 새로운 스레드를 만들어 백그라운드에서 작업한다
- 작업이 끝날 때까지 스레드를 계속 점유하기 때문에
완전한 논블로킹은 아니라고 볼 수 있다
⚡ WebFlux / Netty (진짜 Non-blocking)
- 이벤트 루프 기반 구조를 사용한다
- IO 응답이 도착하면 콜백으로 처리한다
- 스레드를 점유하지 않고, 필요할 때만 짧게 실행한다
→ 수천 ~ 수만 요청도 소수의 스레드로 처리할 수 있다
📌 핵심 비교 요약
항목 | Spring MVC + @Async | WebFlux / Netty |
처리 방식 | 블로킹 기반 + 스레드 풀 | 논블로킹 이벤트 기반 |
스레드 점유 | 계속 점유함 | 점유하지 않음 |
동시성 처리 | 스레드 수에 따라 제한됨 | 수만 요청도 처리 가능함 |
개발 난이도 | 낮고 익숙하다 | 높고 학습 난이도가 있다 |
🛠 실무 적용 예시
서비스 종류 | 바운드 유형 | 추천 구조 |
이미지 처리 서버 | CPU-bound | 고성능 CPU + 스레드 제한을 추천한다 |
REST API 서버 | IO-bound | Spring MVC 기반 + 필요 시 @Async를 함께 사용한다 |
실시간 알림 서버 | IO-bound | WebFlux 또는 Netty를 사용하는 것이 적합하다 |
API Gateway | IO-bound | WebFlux + WebClient 비동기 호출 구조가 적합하다 |
관리자 페이지 | 혼합 | Spring MVC 구조로도 충분하다 |
🔚 마무리 요약
- CPU-bound는 CPU 코어 수에 맞춘 스레드 수 설정이 중요하며, 연산 최적화가 핵심이다
- IO-bound는 대기 시간이 많기 때문에 스레드를 많이 두거나, 논블로킹 구조로 전환하는 것이 효율적이다
- @Async는 간단한 비동기 처리를 할 수 있지만, 스레드를 점유하기 때문에 완전한 논블로킹은 아니다
- 진짜 Non-blocking 처리가 필요하다면 WebFlux나 Netty 같은 이벤트 기반 구조를 도입해야 한다
'CS지식 > 운영체제 (Operating System)' 카테고리의 다른 글
(CS 운영체제) 동기화 (기본) (0) | 2025.04.07 |
---|---|
(CS 운영체제) 동시성 - 스핀락(spinlock) 뮤텍스(mutex) 세마포(semaphore) 각각 특징과 차이 설명 java (0) | 2025.04.07 |
[CS ] 컨텍스트 스위칭 (프로세스 컨테스트 스위칭 <-> 스레드 컨텍스트 스위칭) (0) | 2025.04.05 |
가상 메모리(Virtual Memory)에 대한 개념 (TLB , 페이징 테이블 포함) (0) | 2025.04.04 |
운영체제와 프로그램 실행 원리 정리 (0) | 2025.04.02 |