요즘 멀티스레딩 관련 공부를 하다가 문득 궁금한 점이 생겼다.

"내 컴퓨터에 박혀 있는 CPU 코어 및 스레드의 수는 정해져 있는데, 소프트웨어 상에서 어떻게 스레드 수를 100개, 200개 씩 설정할 수 있는걸까?"

언뜻 보면 굉장히 바보 같은 질문일 수 있지만, 나는 이 질문에 명확히 답하지 못했고 그래서 검색을 통해 스레드에 대해 알아보았다.

CPU 스레드

물리적 스레드는 CPU 코어와도 관련이 깊다. CPU 코어는 익히 알고 있듯이 intruction을 하나씩 해석하여 연산을 실행하는 유닛을 뜻한다. 스레드란 물리적인 코어 개수와는 별개로 '논리적인' 코어 개수를 뜻하며 통상적으로는 1코어에 1스레드를 돌리는게 일반적이었지만, 코어 사용률을 높여 1코어당 여러 개의 스레드를 동시에 돌리는 하이퍼스레딩 기법이 비교적 최근에 등장하였다.
말이 좀 헷갈리는데 내 방식대로 정리해 보자면, 스레드는 코어 안에서 Fetch, Decode, Execute, Memory Access, Write 등의 instruction 세부 작업들이 실행되는 series라고 보면 될 것 같다. 보통은 이 작업들이 실행되는 instance가 코어 내에 하나만 존재하는데, 하이퍼 스레딩을 할 시에 여러 개의 instance가 동시에 돌아간다고 생각하면 될 것 같다.

소프트웨어 스레드

소프트웨어적인 관점에서 말하는 스레드란 하나의 프로세스가 실행되는 세부 작업들의 단위를 말한다. 운영체제가 스케줄링을 할 때 동시에 실행 가능한 스레드 수(CPU 스레드)는 정해져 있다. 하지만 메모리가 허용하는 소프트웨어적 스레드 수는 얼마든지 많을 수 있다. 이들 중 운영체제에 의해 실행되지 않는 스레드는 잠들어 있을 수도 있으며 운영체제는 이들 중 물리적 스레드가 허용 가능한 만큼의 스레드를 할당하여 동시에 실행시킨다.


설명들이 상당히 헷갈리고 복잡하지만, 둘 사이에 기본적인 차이 정도는 이해가 된 것 같고, 소프트웨어 상에서 수많은 스레드를 프로세스에 할당하여 작업을 처리하는 멀티스레딩 방식에 대해 조금 더 깊은 이해가 생긴 것 같다.