![[컴퓨터 구조] CPU 파헤치기](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fv3ynt%2FbtsLHNuEDYf%2F3XSuSD6qP6sGaApOHW9mZ1%2Fimg.png)
컴퓨터 공학을 전공하면서 지인들에게 자주 듣는 말 중 하나가 "노트북을 추천해줘"였습니다.
제가 아는 것은 코어 수가 많으면 좋다는 것뿐...
분명 전공 수업에서 각 개념이 무엇을 의미하는지 배웠지만, 시험이 끝나면서 기억의 저편으로...
코어 수가 많으면 좋다는 것은 컴퓨터 공학을 전공하지 않는 사람들도 아는 정보였고, 이에 부족함을 느껴 컴퓨터 구조 중 CPU를 이번 기회에 정리해보고자 합니다.
CPU(Central Processing Unit)
CPU는 흔히 컴퓨터에서 사람의 두뇌에 비유됩니다.
CPU는 컴퓨터에서 명령어를 실행하는 주체로서, 데이터와 명령어를 읽고 해석하며 실행하는 역할을 수행합니다.
CPU의 주요 구성 요소는 아래와 같습니다.
- 산술논리연산장치(ALU, Arithmetic and Logic Unit): 사칙 연산 및 논리 연산과 같은 연산을 수행하는 회로로 구성된 일종의 계산기
- 제어장치(CU, Control Unit): 명령어를 해석하여 부품을 동작시키기 위한 제어 신호라는 전기 신호를 내보내는 장치
- 레지스터(Register): CPU 내부에 위치한 작은 임시 저장장치로, 데이터와 명령어를 처리하는 과정에서 중간값을 저장
- 프로그램 카운터(PC): 메모리에서 다음으로 읽어 들일 명령어의 주소를 저장하는 레지스터
- 명령어 레지스터(IR): 메모리에서 방금 읽어 들인 명령어를 저장하는 레지스터
- 범용 레지스터: 데이터, 명령어, 주소 등을 저장할 수 있는 레지스터로 일반적인 상황에서 자유롭게 사용됨
- 플래그 레지스터: 연산의 결과나 CPU 상태에 대한 부가 정보를 저장하는 플래그 값을 보관하는 레지스터
- 스택 포인터: 메모리 내 스택 영역의 최상단 스택 데이터 위치를 가리키는 레지스터
워드(word): CPU가 한 번에 다루는 데이터의 단위로, 흔히 64비트 또는 32비트 프로세서라고 할 때, 이 64와 32가 해당 컴퓨터의 워드 크기를 나타낸다.
명령어 사이클(Instruction Cycle)
CPU가 하나의 명령어를 처리하는 과정에는 정해진 흐름이 있으며, CPU는 이 흐름을 반복하여 여러 명령어를 처리합니다.
즉, 명령어 사이클이란 CPU가 명령어를 처리하는 과정에서 프로그램 내 각 명령어가 일정 주기를 반복하며 실행되는 과정을 말합니다.
- 인출 사이클(Fetch Cycle): 메모리에 있는 명령어를 CPU로 가져오는 단계
- 실행 사이클(Execute Cycle): CPU로 가져온 명령어를 실행하는 단계
- 간접 사이클(Indirect Cycle): 명령어 실행을 위해 추가로 메모리에 접근하는 단계
- 인터럽트 사이클(Interrupt Cycle): 인터럽트를 처리하는 단계
인터럽트(Interrupt)
처리해야하는 우선순위 작업이 발생하여, 이를 처리하기 위한 CPU의 작업을 방해하는 신호를 인터럽트라고 합니다.
인터럽트는 크게 동기 인터럽트와 비동기 인터럽트가 있습니다.
- 동기 인터럽트(Synchronous Interrupt): CPU에 의해 자체적으로 발생하는 인터럽트로, 프로그래밍 오류와 같은 예외적인 상황을 마주쳤을 때 발생합니다. 예외(Exception)라고도 합니다.
- 비동기 인터럽트(Asynchronous Interrupt): 주로 입출력장치에 의해 발생하는 인터럽트로 작업을 끝낸 입출력장치가 CPU에게 완료 알림(인터럽트)를 보내거나 어떤 입력을 받았을 때, 이를 처리하기 위해 CPU에게 입력 알림(인터럽트)를 보냅니다. 하드웨어 인터럽트라고도 합니다.
비동기 인터럽트(하드웨어 인터럽트)
CPU의 속도는 입출력장치의 속도보다 훨씬 빠릅니다. CPU가 특정 입출력장치에 명령을 내린 경우, 입출력장치가 작업을 완료하는 데 시간이 걸리기 때문에 CPU는 바로 결과를 받지 못합니다. 이로 인해 입출력장치의 작업 완료 여부를 주기적으로 확인해야 하는 상황이 발생합니다.
하드웨어 인터럽트를 사용하면 CPU는 입출력장치의 작업 완료를 기다릴 필요 없이 다른 작업을 수행할 수 있습니다.
이렇게 함으로써 CPU 사이클 낭비를 최소화하고, 동시에 효율적으로 명령어를 처리할 수 있습니다.
폴링(Polling): 작업 완료 여부를 계속해서 확인하는 기법
CPU가 하드웨어 인터럽트를 처리하는 순서
- 입출력장치는 CPU에게 인터럽트 요청 신호를 보낸다.
- CPU는 실행 사이클이 끝나고 명령어를 인출하기 전 항상 인터럽트 여부를 확인한다.
- CPU는 인터럽트 요청을 확인하고, 인터럽트 플래그를 통해 현재 인터럽트를 받아들일 수 있는지 여부를 확인한다.
- 인터럽트를 받아들일 수 있다면 CPU가 현재 실행하던 프로그램으로 복귀할 때 필요한 정보(PC 등)를 메모리 내 스택에 백업한다.
- CPU는 인터럽트 벡터를 참조하여 인터럽트 서비스 루틴을 실행한다.
- 인터럽트 서비스 루틴 실행이 끝나면 4에서 백업해 둔 작업을 복구하여 실행을 재개한다.
인터럽트 플래그가 활성화되어 있지 않더라도 무조건 처리해야 하는 인터럽트도 있다.(정전, 하드웨어 고장 등)
동기 인터럽트(예외)
CPU는 예외가 발생하면 하던 일을 중단하고 해당 예외를 처리합니다.
예외의 종류에는 폴트, 트랩, 중단, 소프트웨어 인터럽트가 있습니다.
폴트(fault)
예외를 처리한 직후, 예외가 발생한 명령어부터 실행을 재개하는 예외입니다.
메모리에 필요한 데이터가 없다면, CPU는 폴트를 발생시킵니다. 이 경우 CPU는 보조 기억 장치에서 필요한 데이터를 메모리로 가져와서 저장합니다. 이후 CPU는 필요한 데이터를 메모리에 가져왔으므로, 폴트가 발생한 그 명령어부터 실행을 재개합니다. 이러한 상황을 페이지 폴트라고 합니다.
트랩(trap)
예외를 처리한 직후, 예외가 발생한 명령어의 다음 명령어부터 실행을 재개하는 예외입니다.
디버깅 시 브레이크 포인트를 지정하여 특정 코드가 실행되는 순간 프로그램을 중단시킬 수 있습니다. 프로그램이 중단된 후 디버깅이 끝나면(트랩을 처리한 후), CPU는 트랩이 발생한 그 다음 명령어부터 실행을 재개합니다.
중단(abort)
CPU가 실행 중인 프로그램을 강제로 중단시킬 수밖에 없는 심각한 오류를 발견했을 때 발생하는 예외입니다.
소프트웨어 인터럽트
시스템 콜이 발생했을 때 발생하는 예외입니다.
CPU 성능 향상 기법
아래 스펙은 LG 2024 그램의 CPU인 인텔사의 코어 i5 스펙입니다.
1. 클럭(Clock) 속도 높이기
클럭은 CPU의 속도를 나타내는 단위로, 컴퓨터에서 연산을 조정하는 타이밍 신호입니다.
클럭 주기에 맞춰 데이터가 레지스터 간 이동하고, ALU에서 연산이 수행되며, 명령어가 메모리에서 읽혀집니다.
그렇기에 클럭 속도가 높아지면 CPU 명령어 사이클이 빨라지고, 다른 부품도 더 빠르게 작동합니다.
그러나 클럭 속도가 너무 높으면 발열 문제가 발생할 수 있어, 성능 향상에 한계가 있습니다.
위의 스펙을 보면 최대 4.6GHz라고 적혀있습니다.
이는 1초에 클럭 주기가 최대 46억 번 반복되는 것을 의미합니다.
2. 멀티코어
코어(Core)란 CPU 내에서 명령어를 읽고, 해석하며, 실행하는 부품입니다.
예전에는 이를 CPU라고 했지만, 기술의 발전으로 하나의 CPU 안에 여러 개의 코어가 존재할 수 있게 되었습니다.
위 처럼 여러 코어를 포함하고 있는 CPU를 멀티코어 CPU 또는 멀티코어 프로세서라고 합니다.
코어 개수가 늘어날수록 동일 시간 동안 더 많은 양의 명령어를 처리할 수 있기에 성능이 좋아집니다.
물론, 코어마다 처리할 연산을 적절히 분배해야합니다.
12Core는 하나의 CPU 안에 코어가 12개가 있음을 의미합니다.
P-Core(Performance)는 부하량이 높은 고성능 작업을 담당합니다. 그렇기에 성능이 높고 전력 소모가 큽니다.
반면, E-Core(Efficient)는 부하량이 적은 저성능 작업을 담당합니다. P코어 대비 성능이 낮고 전력 소모가 적습니다.
참고로, E-Core는 인텔사의 CPU에만 있다고 합니다.
3. 멀티스레드
스레드는 아마 많이 들어보셨을 겁니다. 하지만 CPU에서 사용되는 스레드와 프로그램에서 사용되는 스레드는 차이가 있습니다.
하드웨어 스레드는 하나의 코어가 동시에 처리하는 명령어의 단위를 말합니다.
예를 들어, 1코어 2스레드의 경우 하나의 코어가 2개의 명령어를 동시에 실행할 수 있음을 의미합니다.
이렇게 하나의 코어에서 여러 명령어를 동시에 처리하는 CPU를 멀티스레드 CPU 또는 멀티스레드 프로세서라고 합니다.
위 처럼 하나의 코어에 2세트의 레지스터가 있으면, 두 개의 명령어를 처리하기 위한 정보들을 각각의 레지스터에 저장할 수 있어 동시에 실행할 수 있습니다.
프로그램의 입장에서 코어는 하나이지만, 명령어를 처리할 수 있는 CPU는 마치 두 개처럼 보이므로 하드웨어 스레드는 논리 프로세서라고 부르기도 합니다.
반면, 소프트웨어 스레드는 하나의 프로그램에서 독립적으로 실행되는 단위를 말합니다.
1코어 1스레드 CPU라도 소프트웨어적으로는 여러 개의 소프트웨어 스레드를 실행할 수 있습니다.
하드웨어 스레드와 소프트웨어 스레드의 차이는 동시성 vs 병렬성입니다.
- 동시성: 동시에 작업을 처리하는 것처럼 보이는 성질로, CPU가 빠르게 번갈아 가며 처리하는 것을 의미합니다. 물리적으로 같은 시점에 동시에 처리되는 것은 아닙니다.
- 병렬성: 물리적으로 동시에 처리하는 성질로, 하드웨어 스레드가 4개인 CPU는 같은 시점에 4개의 작업을 동시에 처리할 수 있습니다.
4. 명령어 파이프라이닝
명령어 병렬 처리 기법(ILP, Instruction-Level Parallelism)은 여러 명령어를 동시에 처리하여 CPU를 한시도 쉬지 않고 작동시킴으로써 CPU의 성능을 높이는 기법을 말합니다. 대표적으로 명령어 파이프라이닝이 있습니다.
명령어가 처리되는 과정은 다음과 같습니다.
- 명령어 인출(Instruction Fetch)
- 명령어 해석(Instruction Decode)
- 명령어 실행(Execute Instruction)
- 결과 저장(Write Back)
각 단계만 겹치지 않는다면 CPU가 각각의 단계를 동시에 실행할 수 있습니다.
위 처럼 CPU의 프로그램 처리 속도를 높이기 위해 CPU 내부 하드웨어를 여러 단계로 나누어 동시에 처리하는 기술을 명령어 파이프라이닝(Instruction Pipelining)이라고 합니다.
명령어 파이프라이닝을 비롯한 명령어 병렬 처리에 유리한 명령어 집합이 있고, 불리한 명령어 집합이 있습니다.
대표적으로 CISC와 RISC가 있습니다.
CISC(Complex Instruction Set Computing)
- 장점: 다양한 기능을 지원하는 복잡한 명령어들로 구성되어 있어, 적은 수의 명령어로도 프로그램을 실행할 수 있다.
- 단점: 명령어가 복잡하고 다양한 기능을 제공하기 때문에, 명령어의 크기와 실행 시간이 일정하지 않으며, 하나의 명령어 실행에 여러 클럭 주기가 필요하다. 이로 인해 파이프라이닝에 비효율적일 수 있다.
RISC(Reduced Instruction Set Computing)
- 장점: 명령어 크기가 규격화되어 있고, 대부분의 명령어가 1클럭 내외로 실행되기 때문에 파이프라이닝에 최적화되어 있다.
- 단점: CISC에 비해 활용 가능한 명령어의 종류가 적다. 짧고 규격화된 명령어를 사용하며, 대부분 1클럭 내외로 실행되도록 설계되어 있어 같은 프로그램이라도 RISC에서는 CISC보다 더 많은 명령어가 필요합니다.
CISC에는 Intel 사의 x86가 있고, RISC에는 Apple 사의 M1가 있다.
물론 파이프라이닝을 한다고 해서 무조건 CPU 성능이 향상되는 것은 아닙니다.
성능 향상이 이루어지지 않는 상황을 파이프라이닝 위험(Pipeline Hazard)라고 부릅니다.
해저드의 종류는 아래와 같습니다.
- 구조적 해저드(Structural Hazard): 자원은 하나인데 여러 명령이 동시에 수행되려고 할 때 발생
- 데이터 해저드(Data Hazard): 한 명령어가 다른 명령어가 사용하는 데이터를 필요로 할 때, 이 데이터가 아직 준비되지 않은 경우에 발생
- 제어 해저드(Control Hazard): 분기 명령어(조건문, 루프)가 실행될 때, 다음에 실행할 명령어가 결정되지 않아 발생
P.S.
이번에 CPU를 공부하면서 동작방식과 각 용어들이 무엇을 의미하는지 알 수 있었습니다. 이제는 자신있게 지인들에게 노트북을 스펙을 보고 추천할 수 있게 되었습니다.ㅎㅎ
참고
강민철. 『 이것이 취업을 위한 컴퓨터 과학이다 』
'컴퓨터 구조' 카테고리의 다른 글
[컴퓨터 구조] 캐시 메모리 파헤치기 (0) | 2025.01.12 |
---|---|
[컴퓨터 구조] 메인 메모리(RAM) 파헤치기 (0) | 2025.01.11 |
느리더라도 단단하게 성장하고자 합니다!
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!