note title

Bound

CPU, O Bound 에 대해서 알기 전에 Bound가 무엇일까?

Bound는 “제한, 얽매이다” 라는 뜻이다. 즉 이를 보면

  • CPU Bound
    • 프로그램 수행 속도가 CPU의 연산 능력에 의해 제한되는 상황
  • I/O Bound
    • 프로그램 수행 속도가 입출력 작업 때문에 느려지는 상황

어떤 자원이 속도를 결정 짓는 병목, BottleNeck이 되는 지를 설명하는 것이다. 어떤 자원이 “발목을 잡는가”가 바로 핵심이다.

따라서 CPU Bound, I/O Bound는 성능 분석, 비동기 프로그래밍, 멀티 스레딩 등을 설계할 때 중요한 개념으로 자리 잡는다.

CPU Bound

CPU가 너무 바빠서 일이 느린 상황

특징

  • CPU가 계속 연산을 수행하므로 다른 작업을 기다릴 수 없음
  • 멀티코어 CPU라도 코드가 병렬화되어 있지 않으면 CPU 사용률이 한 코어에 몰림
  • 시스템 모니터로 보면 CPU 사용률 100%
  • I/O 사용률은 낮다 (빠르게 끝남)

원인

  • 복잡한 수학/과학 계산
  • CPU 중심의 작업
  • 비효율적인 알고리즘 활용

예시

  • 1억 개의 숫자 소수 판별
  • 머신러닝 모델 학습 및 추론
  • 복잡한 수학 시뮬레이션
  • 해시 연산, 암호화/복호화
def is_prime(n):
	for i in range(2, int(n**0.5) + 1):
		if n % i == 0:
			return False
	return True
 
primes = [x for x in range(100_000) if is_prime(x)]

해결 방안

전략설명
Multi Processing병렬 연산으로 CPU 활용을 극대화
GPU병렬 연산에 강한 GPU로 오프로드
알고리즘 개선연산량을 줄이는 알고리즘으로 변경
Cython, Numpy연산에 최적화된 라이브러리 사용

I/O Bound

CPU는 한가한데 데이터를 못 받아서 일을 하지 못함

특징

  • CPU는 일이 바쁜데 I/O(입출력) 때문에 기다리게 됨.
  • 시스템 모니터를 보면 CPU 사용률은 낮음
  • 디스크/네트워크 대기가 많음

원인

  • 느린 디스크 접근 (HDD, 대용량 파일 처리)
  • 느린 네트워크 (API, 웹 크롤링)
  • 외부 시스템 호출 지연
  • 사용자 입력 대기

예시

  • 웹 서버에서 클라이언트 요청을 받고 DB에 조회 후 응답
  • 대용량 CSV 파일 로드하여 처리
  • API를 호출하고 응답을 기다리는 작업
  • 사용자의 키 입력을 기다리는 GUI 앱
import requests
 
urls = ["https://example.com" for _ in range(100)]
 
for url in urls:
    response = requests.get(url)  # 네트워크 응답을 기다리는 중
    print(response.status_code)

해결 방안

전략수행
비동기 프로그래밍async/await, aiohttp, asyncio등으로 기다리는 동안 다른 작업 수행
멀티스레딩한 스레드가 대기 중일 때 다른 스레드가 일함
캐싱자주 쓰는 데이터를 메모리에 저장, I/O 요청 줄이기
빠른 장비 도입SSD, 고속 네트워크, 고성능 하드웨어 개선

결론

CPU Bound와 I/O Bound는 개념적으로 병목의 종류를 설명하는 용어다. 하지만 실제 시스템에서는 상호작용하며 교차하고, 병목 원인이 바뀔 수 있는 유기적인 관계를 가진다.




참고자료