책너두 (컴퓨터 밑바닥의 비밀) 25일차 CPU 코어 수와 스레드 수 사이의 관계는 무엇일까?

  • 레시피와 코드, 볶음 요리와 스레드
  • 요리사는 레시피에 따라 특정 작업을 실행하여 특정한 요리를 만듦.
    • ex) 레시피에 따라 돼지고기를 볶으면 돼지 두루치기 스레드가 됨.
  • CPU는 기계 명령어에 따라 프로세스와 스레드를 실행함.
    • 운영체제 입장에서, CPU가 사용자 상태에서 실행하는 명령어는 모두 특정 스레드에 속해있음.
  • 요리사 수는 CPU 코어 수에 비유할 수 있음.
    • 일정 시간 동안 볶을 수 있는 요리 수는 스레드 수에 비유할 수 있음.
  • ‘요리사 수’가 ‘동시에 얼마나 많은 요리를 할 수 있는지’ 여부와 관련이 없음.
    • CPU 코어 수와 스레드 수 사이에는 어떤 필연 관계도 없음.
    • CPU는 하드웨어, 스레드는 소프트웨어 개념(실행 흐름이자 작업)임.
      • 즉, 단일 코어 시스템에서도 많은 스레드를 생성할 수 있음. (메모리가 충분하고, 운영 체제에 제한이 없어야 가능)
  • CPU는 자신이 실행하는 명령어가 어떤 스레드에 속하는지 이해하지 못함. 이해할 필요도 없음.
    • 이를 이해하는건 운영 체제임.

 

  • 작업 분할과 블로킹 입출력
  • ex) 작업 A, 작업 B 작업 완료시간이 각 5분이라고 가정.
    • 두 작업을 순차적으로 실행하든, 병렬로 실행하든, 단일 코어 환경에서 두 작업을 완료하는데 필요한 시간은 동일하게 10분임.
      • 단일 코어 시스템에서 CPU는 일정 시간 동안 단 하나의 스레드만 실행할 수 있음.
      • 스레드 여러개가 번갈아 실행되기는 하지만 진정한 병렬 처리라고 할 수 없음.
  • 그렇다고 단일 코어에서 다중 스레드가 의미 없는건 아님.
    • 스레드는 프로그래머에게 매우 편리한 추상화 방법을 제공함.
    • ex) 작업 하나를 여러개로 분할하여 각 하위 작업을 별도의 스레드에 배치하면 운영 체제는 이를 스케줄링하고 실행할 수 있음. → 동시에 여러 작업을 실행할 수 있음.
    • ex) 그래픽 사용자 인터페이스에서 사용자 인터페이스 뒤에 대량의 계산이 수행된다면? → 계산 작업을 별도의 스레드에 넣어 계산을 수행하면 사용자 인터페이스가 멈추는 것을 방지할 수 있음.
  • 블로킹 호출이 실행되면 운영 체제가 전체 스레드를 일시 중지함 → 뒤에 있는 코드도 실행되지 않음.
    • 블로킹 입출력 코드를 별도의 스레드에서 실행하면 나머지 코드는 영향 없이 계속 실행될 수 있음.
      • 물론 이는 높은 동시성을 요구하지 않는 경우에 해당함 (높은 동시성이 요구된다면 다른 문제임 2.8절 참고)
  • 우리의 목적이 스레드가 특정 작업을 기다리지 않고 진행하는 것이라면 필요에 따라 스레드 여러 개를 생성하여 작업을 분할하여 실행해도 됨.
    • 이때는 근본적으로 시스템이 단일 코어인지 다중 코어인지 신경 쓸 필요가 없음.

 

  • 다중 코어와 다중 스레드
  • 더이상 단일 코어 성능을 끌어올리기 어렵기 때문에 다중 코어를 생산하기 시작함.
  • 다중 코어 리소스를 최대한 활용해야 할 때 프로그래머가 가장 선호하는 도구는 스레드임.
  • 다중 코어를 최대한 활용한다면 시스템에 코어가 몇 개 있는지 알고 있어야 함.
    • 일반적으로 생성되는 스레드 수는 코어 수와 일정한 선형 관계를 유지해야 함.
  • 스레드가 많다고 좋은 것은 아님.
    • 순수한 계산만 하고 입출력이나 동기화 작업이 없으면 코어당 스레드 하나가 가장 나은 선택임.
    • 그러나, 스레드에 일정한 입출력, 동기화 등이 필요하므로 이때는 스레드 수를 적당히 늘려 운영 체제가 CPU에 할당할 수 있는 충분한 스레드를 확보하면 시스템 성능을 향상시킬 수 있음.
    • 스레드 수가 한계에 달하면 운영 체제 성능이 떨어짐. → 스레드 전환 시 부담 증가하기 때문
    • 프로스램 상황에 따라 지속적으로 테스트 해야만 적당한 스레드 갯수를 수치화할 수 있음.

댓글

Designed by JB FACTORY