03. CPU/IO bound
유튜버 쉬운코드 님의 운영체제 강의를 정리한 내용
# CPU/IO bound
# 기초용어
CPU (Central Processing Unit)
- 명령어를 실행하는 연산 장치
- 프로세스의 명령어를 해석하고 실행하는 장치
IO (Input / Output)
- 파일을 읽고 쓰거나 네트워크의 어딘가와 데이터를 주고 받는 것
- 입출력 장치와 데이터를 주거나 받는 것
버스트 (Burst)
- 어떤 현상이 짧은 시간 안에 집중적으로 일어나는 일
CPU 버스트
- 프로세스가 CPU에서 한 번에 연속적으로 실행되는 시간
- 메모리에 올라가있는 프로세스가 자신의 차례가 되어서 CPU에서 실행됐을 때, 자신의 명령어들이 CPU에서 연속적으로 실행되는 시간을 의미
IO 버스트
- 프로세스가 IO 작업을 요청하고 결과를 기다리는 시간
프로세스의 인생은 CPU 버스트와 IO 버스트의 연속
CPU 버스트 길이에 따른 빈도
- 대부분의 프로세스들의 CPU 버스트가 8ms 안으로 끝나는 것을 볼 수 있음
- 보통의 프로세스는 CPU 작업을 수행할 때 길게하지 않고 짧게 끝낸다는 것을 의미
CPU bound 프로세스
- CPU burst가 많은 프로세스 (연산 작업이 많은)
- ex) 동영상 편집 프로그램, 머신러닝 프로그램
IO bound 프로세스
- IO burst가 많은 프로세스
- ex) (일반적인) 백엔드 API 서버
- 보통의 API 서버들은 HTTP 요청을 받으면 DB 서버나 캐시 서버에 데이터를 요청하고 요청한 데이터를 받아서 적당한 형태로 가공한 뒤에 HTTP 응답을 하는 것이 일반적인 형태이니까
- DB 서버나 캐시 서버에 요청하는 작업이 IO 작업
- 이 IO 작업은 네트워크를 타는 부분이라서 CPU에서 명령어가 몇 십개 처리되는 것보다 훨씬 오래걸림
# CPU bound 프로그램
Quiz) 듀얼 코어 CPU에서 동작할 CPU bound 프로그램을 구현한다면 몇 개의 스레드를 쓰는게 좋을까?
- ex) 10억 개의 사진을 읽어서 사진에 사람이 있는지 없는지 마킹하는 프로그램
- 무조건 스레드가 많으면 처리 속도가 빠를까?
Goetz (2002, 2006) recommends
CPU bound 프로그램에서 적절한 스레드 수는number of CPUs + 1
ex) 듀얼 코어 CPU에 스레드가 4개인 상황
- 컨택스트 스위칭이 많이 발생 → 오버헤드 커질 것
ex) 듀얼 코어 CPU에 코어 개수만큼만 스레드 2개인 상황
- 컨택스트 스위칭이 발생하지 않기 때문에 이로 인한 CPU 낭비 발생 ❌
- 그래서 스레드를 코어 개수 정도나, 코어 개수보다 1개 더 둔 정도로 추천한다는 의미
# IO bound 프로그램
Quiz) IO bound 프로그램은 스레드 몇 개로 구현해야 적절할까?
- 사실 CPU bound 프로그램과 다르게 적절한 가이드라인은 없음
- 여러 상황에 맞춰서 적절한 스레드 수를 찾아야 함
- 컴퓨터 스펙, 프로그램 특성 등등 …
ex) 만약 백엔드 API 서버가 thread per request 방식이라면?
- 몇 개의 스레드들을 미리 만들어 놓을지 여러 상황을 고려해서 결정하는 것이 필요
- API 서버의 하드웨어 스펙이 어느정도인지
- API 애플리케이션의 IO burst 비중이 대략적으로 어느 정도인지
- 예상되는 트래픽의 패턴은 어떤지