더북(TheBook)

그러면 스레드 개수가 CPU 개수보다 적으면 어떻게 될까요?

예를 들어 CPU가 8코어인데 스레드가 6개 준비되어 있다고 칩시다. 많은 개수의 일이 들어오면 스레드를 최대 6개 병렬로 실행합니다. 각 스레드가 서로 다른 CPU에 배정된다 하더라도 CPU 8개 중 2개는 배정을 받지 못합니다. 결과적으로 컴퓨터의 최대 CPU 처리 능력의 6/8만 사용합니다.

스레드 개수가 CPU 개수보다 많으면 어떻게 될까요?

예를 들어 CPU가 8코어인데 스레드가 10개 준비되어 있다고 칩시다. 많은 개수의 일이 들어오면 스레드를 최대 10개 병렬로 실행하고, 각 스레드가 서로 다른 CPU에 배정됩니다. 스레드 10개 중 8개는 각각의 CPU에 배정됩니다. 그런데 아직 배정되지 않은 스레드 2개는 이미 일을 배정받은 CPU가 중복해서 배정받아야 합니다.

중복해서 일을 배정받는 CPU 입장에서 CPU는 하나인데 처리해야 하는 스레드는 2개인 상황이 되어 버렸습니다. 이러한 상황에서 CPU는 스레드 2개를 왔다 갔다 하며, 즉 컨텍스트 스위치를 하면서 두 스레드를 실행합니다. 컨텍스트 스위치는 운영체제 안에서 많은 연산이 필요하므로(1.4절 참고) 결과적으로 매우 나쁜 처리 속도를 내게 됩니다. 또 파일 액세스나 다른 컴퓨터에서 결과를 수신하는 등 스레드가 잠시 잠자는 상황인 디바이스 타임도 있을 수 있습니다.

// 서버에서 사용자 인증 요청을 처리하는 함수
void RequestLogin(userName, password)
{
  // 사용자 정보를 파일에서 불러온다.
  // 파일 액세스가 끝날 때까지는
  // 하드디스크가 바쁘고, CPU는 논다.
  string prof = File.GetUserProfile(userName);
  if (password = = prof.password)
  {
      // 사용자 인증 처리
  }
}
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.