프로그램이 무엇 때문에 시간을 쓰는가로 나눈 분류. 스레드를 몇 개 둘지가 여기서 갈리므로 실무에서 바로 쓰이는 구분이다.

CPU 버스트와 IO 버스트

버스트란 어떤 현상이 짧은 시간에 집중적으로 일어나는 것을 말한다. 프로세스가 CPU에서 한 번에 연속으로 실행되는 시간이 CPU 버스트이고, IO 작업을 요청해놓고 결과를 기다리는 시간이 IO 버스트다. 프로세스의 일생은 이 둘의 연속이다. 계산하다 기다리고, 기다리다 계산한다.

CPU 버스트 길이를 재보면 대부분의 프로세스가 8ms 안에 끝난다. 보통은 CPU를 길게 붙잡지 않고 짧게 쓰고 만다는 뜻이다.

CPU bound

CPU 버스트가 많은 쪽이다. 연산이 많은 프로그램으로 동영상 편집이나 머신러닝이 여기 해당한다.

스레드 수에는 답이 있다. Goetz가 권한 값은 CPU 개수에 하나를 더한 만큼이다. 듀얼 코어에 스레드를 4개 두면 컨텍스트 스위칭이 자주 일어나 오버헤드만 커진다. 어차피 CPU가 쉬지 않고 도는데 전환만 늘어나는 셈이다. 코어 수만큼 두면 전환이 거의 없어 CPU를 낭비하지 않고, 하나를 더 두는 것은 어떤 스레드가 잠깐 멈췄을 때 코어가 놀지 않게 하려는 여유분이다.

IO bound

IO 버스트가 많은 쪽이고, 일반적인 백엔드 API 서버가 여기 해당한다. HTTP 요청을 받아 DB나 캐시에 데이터를 요청하고, 받아서 가공한 뒤 응답한다. DB에 요청하는 부분이 네트워크를 타므로 CPU에서 명령어 몇십 개 처리하는 것보다 훨씬 오래 걸린다.

이쪽은 정해진 답이 없다. IO를 기다리는 동안 CPU가 놀기 때문에 코어 수보다 훨씬 많이 두는 것이 맞지만, 얼마나 많이 둘지는 상황을 봐야 한다. 서버의 하드웨어 스펙이 어느 정도인지, 애플리케이션의 IO 버스트 비중이 얼마나 되는지, 예상되는 트래픽 패턴이 어떤지를 함께 본다. 요청마다 스레드를 쓰는 방식이라면 미리 몇 개를 만들어둘지를 이 셋으로 판단한다.

관련

출처