05장 - 1 : 빠른 CPU를 위한 설계 기법
목표 : 클럭과 코어, 스레드라는 개념의 학습을 통해 빠른 CPU를 만드는 설계 기법인 멀티코어와 멀티스레드를 이해
클럭
컴퓨터 부품들은 '클럭 신호'에 맞춰서 움직이고, CPU는 '명령어 사이클'이라는 정해진 흐름에 맞춰 명령어를 실행한다.
따라서, 클럭 신호가 빨라진다면 CPU는 명령어 사이클을 더 빠르게 반복할 것이고, 다른 부품들도 그에 맞춰 빠르게 작동될 것이므로 컴퓨터 성능/속도가 빨라지게 된다.
클럭 속도는 헤르츠(Hz) 단위로 측정한다
헤르츠는 1초에 클럭이 몇 번 반복되는지를 나타낸다. 예를 들어 1초에 한 번 반복이라면 1Hz, 1초에 백번이라면 100Hz다.
내 컴퓨터의 CPU 속도를 보면
기본 속도가 3.70GHz인 것을 볼 수 있다. 이는 1초에 클럭이 기본적으로 37억번 반복된다는 것을 나타낸다.
다만, 클럭 속도를 계속해서 높인다고 해서 CPU가 무조건 빨라지는 것은 아니다.
클럭 속도를 계속 높이면 발열 문제가 발생할 뿐만 아니라, 전력 소모가 증가하고 트랜지스터의 물리적 한계로 인해
신호 전송이 어려워진다. 또한 CPU 내부에서 연산을 담당하는 ALU나 명령어 디코더 등의 처리 속도가 클럭 속도 증가를
따라가지 못하면 병목 현상이 발생하여 성능 향상이 제한된다.
코어와 멀티코어
CPU의 코어와 스레드 수를 늘려서 CPU의 성능을 높일 수 있다 .
앞서, CPU를 "명령어를 해석하는 부품"이라고 정리했다. 컴퓨터가 등장하고 긴 기간동안 "명령어를 실행하는 부품"은
하나만 존재했지만, 오늘날에는 기술적인 발전으로 CPU 내부에 "명령어를 실행하는 부품"을 여러개 만들 수 있게 되었다.
그래서 "명령어를 실행하는 부품"이라는 정의는 오늘날 코어(Core)라는 용어로 사용된다.
다시 말해, CPU는 "명령어를 실행하는 부품을 여러 개 포함하는 부품"으로 명칭의 범위가 확장되었다.
코어를 여러 개 포함하고 있는 CPU를 멀티코어 CPU 혹은, 멀티코어 프로세서라고 부른다.
클럭과 마찬가지로 코어의 수와 CPU의 성능이 비례해서 증가하지는 않는다.
처리할 연산이 균등하게 분배되지 않거나, 처리하고자 하는 작업량보다 코어의 수가 지나치게 많다면 성능에 영향이 없다.
중요한 것은 코어마다 처리할 명령어를 얼마나 적절하게 분배하느냐에 따라 연산 속도가 크게 달라진다.
멀티코어 CPU가 성능을 제대로 발휘하려면 프로그램이 여러 개의 코어를 활용할 수 있도록 병렬 처리가 가능해야 한다.
예를 들어, 영상 편집 프로그램이나 3D 렌더링 소프트웨어는 여러 개의 코어를 사용하여 작업을 나누지만,
단순한 워드 프로세서나 웹 브라우징 같은 작업은 한두 개의 코어만을 사용하기 때문에 성능 차이가 크지 않다.
스레드와 멀티스레드
스레드의 사전적 의미는 '실행 흐름의 단위'이다.
다만 CPU에서 사용되는 '스레드'라는 용어와, 프로그래밍에서 사용되는 '스레드'라는 말의 용례는 조금 다르다.
따라서, 앞으로는 하드웨어적 스레드 (CPU에서 사용) , 소프트웨어적 스레드(프로그래밍에서 사용)로 나누어 설명한다.
하드웨어적 스레드
- 하나의 코어가 동시에 처리하는 명령어 단위
- 지금까지 배운 CPU는 명령어를 실행하는 부품 하나가 한 번에 하나씩 명령어를 실행하는 CPU를 가정
- 반면, 여러 스레드를 지원하는 CPU는 하나의 코어로 여러 개의 명령어를 거의 동시에 실행할 수 있음
- 하나의 코어로 여러 명령어를 동시에 처리하는 CPU를 멀티스레드 프로세서 / 멀티스레드 CPU 라고 함
* 하이퍼 스레딩 : 인텔의 멀티스레드 기술
멀티스레드 프로세서는 어떻게 하나의 코어로 여러가지 명령어를 처리할까 ?
핵심은 '레지스터'이다. 명령어를 처리하는데 꼭 필요한 PC, SP, MBR, MAR와 같이 핵심 레지스터들을 세트로 만들어
하나의 코어에 여러 개 포함시킴으로 여러 개의 명령어를 거의 동시에 처리할 수 있다.
'거의 동시에' 라고 표현한 이유는 완전히 동시에 실행하는 것이 아니라 매우 빠르게 스레드를 전환하면서 실행하는 방식이기 때문이다. 이를 시분할(time-sharing) 방식이라고 하며, 하드웨어적으로 각 스레드마다 필요한 레지스터를 따로 할당하여 문맥 전환(Context Switching) 시간을 최소화 한다.
여러 개의 레지스터 세트들이 존재하지만, 여전히 연산 유닛(ALU, FPU) 등은 하나이다.
다만, 메모리 속 프로그램 입장에서는 하드웨어 스레드는 '한 번에 하나의 명령을 처리하는 스레드'와 다르지 않다.
2코어 4스레드 CPU는 한 번에 4개의 명령어를 처리할 수 있는데, 이는 한 번에 하나의 명령어를 처리하는 CPU가 4개 있는것 과 똑같다 ( 메모리 속 프로그램 입장 ) . 그래서 하드웨어 스레드를 논리 프로세서라고 부르기도 한다.
소프트웨어적 스레드
- 하나의 프로그램에서 독립적으로 실행되는 단위
- 하나의 프로그램은 실행되는 과정에서 한 부분만 실행될 수도 있지만, 여러 부분이 동시에 실행 될 수 있음
예를 들어 한글과 컴퓨터 프로그램을 실행할 때, 수시로 저장하는 기능과 맞춤법 검사 기능이 있다고 하면
이 둘이 서로 동시에 수행될 수 있다. 메모리에 올려진 프로그램 중, 서로 다른 부분을 동시에 읽는다면 가능하다. - 한 번에 하나의 명령어를 처리하는 1코어 1스레드 CPU도 소프트웨어적 스레드를 수십개 실행할 수 있다.
간단 정리
코어 : 명령어를 실행할 수 있는 '하드웨어 부품' , 여러 개의 스레드를 포함할 수 있다.
스레드 : '명령어를 실행하는 단위'
멀티코어 프로세서 : 명령어를 실행할 수 있는 하드웨어 부품이 CPU안에 두 개 이상 있는 CPU ,물리 적인 코어 수를 늘려
동시 작업 처리 능력을 향상시킨다.
멀티스레드 프로세서 : 하나의 코어로 여러 개의 명령어를 동시에 실행할 수 있는 CPU, 하나의 코어가 여러 개의 논리적인 스레드를 처리하여 작업의 효율성을 높인다.
질문 : 하드웨어 스레드가 논리 프로세서라고 불리는 이유는 무엇인가 ?
운영체제는 하드웨어 스레드를 독립적인 CPU처럼 인식한다. 하지만 논리 프로세서는 실제로 물리적인 연산 장치(ALU, FPU 등)가 추가된 것이 아니라, 스레드의 빠른 전환을 통해 여러 개의 CPU처럼 동작하도록 보이게 만든 것이다. 따라서 CPU의 물리적인 코어 수보다 더 많은 연산을 처리할 수 있는 가상의 CPU 개념으로, 논리적인 CPU라는 의미에서 '논리 프로세서'라고 부른다.
질문 : 하드웨어적, 소프트웨어적 스레드의 '시분할 방식'
내가 정확하게 이해한 것 같지 않아서, 추가적인 자료를 찾아봤다.
하드웨어적 스레드와 , 소프트웨어적 스레드에서 말하는 시분할 방식의 차이에 대해 한번 더 정리해보자면
1) 하드웨어적 스레드에서의 시분할 방식 ( CPU 내부의 멀티스레딩)
멀티스레드 CPU에서는 하나의 코어가 두 개 이상의 하드웨어적 스레드를 처리할 수 있다.
각 논리 프로세서(하드웨어 스레드)는 별도의 레지스터 세트를 갖고 있어, 명령어를 동시에 실행하는 효과를 낼 수 있다.
하지만, ALU(연산 장치), FPU(부동소수점 연산 장치) 등은 공유되므로, 두 개의 물리적 코어가 있는 것만큼의 성능을 내지는 못한다.
하드웨어 스레드 간 전환이 매우 빠르게 이루어지기 때문에, 사용자 입장에서는 동시에 실행되는 것처럼 보인다.
2) 소프트웨어적 스레드에서의 시분할 방식 (운영체제의 CPU 스케줄링)
운영체제는 여러 개의 소프트웨어적 스레드를 실행할 때, CPU의 한정된 자원을 효율적으로 분배해야 한다.
이를 위해 운영체제는 CPU 스케줄링 기법(예: 라운드 로빈, 우선순위 스케줄링 등)을 사용하여, 스레드들이 번갈아가며 실행될 수 있도록 한다. 이러한 방식 덕분에, 사용자는 마치 여러 프로그램이 동시에 실행되는 것처럼 느끼게 된다.
소프트웨어적 스레드에 관한 자세한 내용은 운영체제 할 때 배운다고 했으니까... 나중에 또 봐야지 !