1️⃣ 클럭
클럭(clock)이란 CPU의 속도를 나타내는 단위이다. 클럭은 1초 동안 파장이 한 번 움직이는 시간을 의미하는데, 이 시간 동안 처리하는 데이터 양에 따라 CPU의 속도가 달라지게 된다.
앞선 명령어 사이클 글에서
1) 컴퓨터 부품들은 '클럭 신호'에 맞춰 일사불란하게 움직인다.
2) CPU는 '명령어 사이클'이라는 정해진 흐름에 맞춰 명령어들을 실행한다고 정리했다.
클럭 신호가 빠르게 반복되면 CPU를 비롯한 컴퓨터 부품들은 그만큼 빠른 박자에 맞춰 움직인다.
클럭 속도가 높아지면 CPU는 명령어 사이클을 더 빠르게 반복할 것이고, 다른 부품들도 그에 발맞춰 더 빠르게 작동할 것이다. 실제로 클럭 속도가 높은 CPU는 일반적으로 성능이 좋다. 그래서 클럭 속도는 CPU 속도 단위로 간주되기도 한다.
과거, CPU의 성능을 높이는 가장 편리한 방법은 클럭(동작 주파수)을 올리는 것이었다. 하지만 클럭이 높아질수록 발열량과 소비 전력이 커지는 문제가 발생하였다. 따라서 최근에는 클럭을 일정 수준으로 유지하는 대신, ‘멀티 코어’나 ‘멀티 스레드’ 같은 방식으로 CPU 성능을 높이고 있다. 이를 통해 하나의 CPU로 동시에 처리할 수 있는 연산 개수를 늘려 연산 능력 향상을 꾀하는 것이다. 멀티 코어나 멀티 스레드에 관한 것은 이 뒤에 설명하도록 하자.
클럭 속도는 헤르츠(Hz) 단위로 측정한다. 이는 1초에 한번 클럭이 몇 번 반복되는지를 나타낸다.
예를 들어 1초에 한 번 반복되면 CPU 클럭 속도는 1Hz인 것이고, 클럭이 1초에 100번 반복되면 CPU 클럭 속도는 100Hz인 것이다.
✅ 클럭 속도는 일정하지 않다
기본 클럭 속도(Base)와 최대 클럭 속도(Max)로 나뉜다. 이처럼 CPU는 계속 일정한 클럭 속도를 유지하기보다는 고성능을 요하는 순간에는 순간적으로 클럭 속도를 높이고, 그렇지 않을 때에는 유연하게 클럭 속도를 낮추기도 한다. 최대 클럭 속도를 강제로 더 끌어올릴 수도 있는데, 이런 기법을 오버클럭킹(overclocking)이라고 한다.
2️⃣ 코어와 멀티코어
앞선 인용에서 클럭이 높아질수록 발열량과 소비 전력이 커지는 문제가 발생했다고 했다. 이를 해결하는 대표적인 방법이 CPU의 코어와 스레드 수를 늘리는 방법이 있다.
CPU에서 코어(core)는 연산 작업을 수행하는 핵심적인 부분이며, CPU의 성능을 판단하는 기준 중 하나가 바로 ‘코어의 수’이다. CPU에 코어가 많아지면 연산을 여러 개의 코어가 처리하기 때문에 훨씬 빠른 일 처리가 가능해진다.
일단 지금까지 CPU의 정의로 알고 있었던 '명령어를 실행하는 부품'은 오늘날 코어(core)라는 용어로 사용된다. 오늘날의 CPU는 단순히 '명령어를 실행하는 부품'에서 '명령어를 실행하는 부품을 여러 개 포함하는 부품'으로 명칭의 범위가 확장되었다.
코어를 여러 개 포함하고 있는 CPU를 멀티코어(multi-core) CPU 또는 멀티코어 프로세서라고 부른다. 이는 CPU 내에 명령어를 처리하는 일꾼이 여러 명이 있는 것과 같다. 이는 2.4GHz 싱글 코어 CPU와 1.9GHz인 멀티코어 CPU를 비교하면 후자의 성능이 더 좋다는 것이다.
✅ 그렇다면 코어를 두 개, 세 개, 100개로 늘리면 연산 처리 속도가 두 배, 세 배, 100배로 빨라질까?
CPU의 연산 속도는 꼭 코어 수에 비례하여 증가하진 않는다.
예를 들면 학교에서 4인 1조로 조별 과제를 수행한다고 치면 모두 똑같이 참여하여 한 사람이 낼 수 있는 생산성의 네 배에 가까운 결과물을 만들어 내는 경우도 있으나, 그렇지 않은 경우도 많다. 이처럼 업무가 균등하게 분배되지 않거나 한 두 사람만 열심히 참여하면 결과적으로 한 두 사람만의 생산성만큼 결과물이 나오게 된다. 이처럼 코어마다 처리할 연산이 적절히 분배되지 않는다면 코어 수에 비례하여 연산 속도가 증가하지 않는다.
또한, 처리하고자 하는 작업량보다 코어 수가 지나치게 많아도 성능에는 크게 영향이 없다.
예를 들어 100인분의 도시락은 한 명의 요리사가 만드는 것보다 열 명의 요리사가 만드는 것이 열 배가량 빠르겠지만, 4인분의 도시락은 열 명의 요리사가 만드는 게 다섯 명의 요리사가 만드는 것보다 특별하게 빠르지 않은 것과 같다.
중요한 것은 코어마다 처리할 명령어들을 얼마나 적절하게 분배하느냐이고 그에 따라서 연산 속도가 달라진다.
3️⃣ 스레드와 멀티스레드
CPU의 멀티스레드 기술을 이해하려면 우선 '스레드'라는 용어를 정확하게 이해해야 한다.
스레드(thread)의 사전적인 의미는 '실행 흐름의 단위'이다. 하지만 이는 CPU에서 사용되는 스레드와 프로그래밍에서 사용되는 스레드는 용례가 다르기 때문에 엄밀하게 이해해야 한다.
스레드는 CPU에서 사용되는 하드웨어적 스레드가 있고, 프로그램에서 사용되는 소프트웨어적 스레드가 있다.
1) 하드웨어적 스레드
스레드를 하드웨어적으로 정의하면 '하나의 코어가 동시에 처리하는 명령어 단위'를 의미한다.
CPU에서 사용하는 스레드라는 용어는 보통 CPU 입장에서 정의된 하드웨어적 스레드를 의미한다. 지금까지의 CPU는 1코어 1스레드 CPU를 이야기했다. 이것은 명령어를 실행하는 부품이 하나 있고, 한 번에 하나씩 명령어를 실행하는 CPU를 가정한 것이다.
하지만 여러 스레드를 지원하는 CPU는 하나의 코어로도 여러 개의 명령어를 동시에 실행할 수 있다. 예를 들면 2코어 4스레드 CPU는 명령어를 실행하는 부품을 두 개 포함하고, 한 번에 네 개의 명령어를 실행할 수 있는 CPU를 의미한다.
하나의 코어로 여러 명령어를 동시에 처리하는 CPU를 멀티스레드(multi-thread) 프로세서 또는 멀티스레드 CPU라고 한다.
여기서 하이퍼스레딩(hyper-threading)라는 용어도 있다. 이는 인텔의 멀티스레드 기술을 이야기한다. 인텔이 자신들의 멀티스레드 기술에 하이퍼스레딩이라는 명칭을 부여했다.
2) 소프트웨어적 스레드
소프트웨어적으로 정의된 스레드는 '하나의 프로그램에서 독립적으로 실행되는 단위'를 의미한다.
프로그래밍 언어나 운영체제를 학습할 때 접하는 스레드는 보통 소프트웨어적으로 정의된 스레드를 의미한다.
하나의 프로그램은 실행되는 과정에서 한 부분만 실행될 수도 있지만, 프로그램의 여러 부분이 동시에 실행될 수도 있다.
예를 들어 워드 프로세서 프로그램을 개발한다고 가정할 때, 아래의 기능이 수행되길 원한다고 하자
1) 사용자로부터 입력받은 내용을 화면에 보여주는 기능
2) 사용자가 입력한 내용이 맞춤법에 맞는지 검사하는 기능
3) 사용자가 입력한 내용을 수시로 저장하는 기능
이 기능들을 작동시키는 코드를 각각 스레드로 만들면 동시에 실행할 수 있다.
정리하면, 스레드는 하드웨어적 정의로는 '하나의 코어가 동시에 처리하는 명령어 단위'를 의미하고
소프트웨어적 정의로는 '하나의 프로그램에서 독립적으로 실행되는 단위'를 의미한다.
한 번에 하나씩 명령어를 처리하는 1코어 1스레드 CPU도 소프트웨어적으로 스레드를 수십 개 실행할 수 있고 1코어 1스레드 CPU로도 프로그램의 여러 부분을 동시에 실행할 수 있다.
만약 스레드의 사전적 정의(실행 흐름의 단위)만을 암기하면 '1코어 1스레드 CPU가 여러 스레드로 만들어진 프로그램을 실행할 수 있다'라는 말은 이해하기 어렵다. 따라서 스레드는 하드웨어적 소프트웨어적 스레드로 구별하여서 기억하자.
참고자료 -
'CS' 카테고리의 다른 글
[CS] CISC와 RISC (0) | 2023.02.21 |
---|---|
[CS] 명령어 병렬 처리 기법 (0) | 2023.02.16 |
[CS] 하드웨어 인터럽트 (0) | 2023.02.09 |
[CS] 명령어 사이클과 인터럽트 (0) | 2023.02.07 |
[CS] 레지스터 (0) | 2023.02.02 |