🧩 BE
home

CPU

Date
2025/06/08
Category
Computer Science
Tag
Computer Architecture
Detail

레지스터

레지스터는 CPU 안에 있는 작은 임시 저장장치이다. CPU 안에는 다양한 레지스터가 있고, 각기 다른 이름과 역할이 있다.
프로그램 카운터(PC, Program Counter) : 메모리에서 다음으로 읽어 들일 명령어의 주소를 저장
명령어 레지스터(IR, Instruction Register) : 메모리에서 방금 읽어들인 명령어를 저장
범용 레지스터 : 일반적인 상황에서 자유롭게 사용할 수 있는 레지스터. 데이터, 명령어, 주소 모두 저장 가능
플래그 레지스터 : 연산의 결과나 플래그 값을 저장하는 레지스터
플래그(flag) : CPU가 명령어를 처리하는 과정에서 반드시 참조해야 할 상태정보를 의미하는 비트
스택 포인터 : 메모리 내 스택 영역의 최상단 스택 데이터 위치를 가리키는 레지스터

인터럽트

CPU가 수행중인 작업은 방해를 받아 잠시 중단될 수 있는데, 이 방해 신호를 인터럽트(interrupt)라고 한다.
동기 인터럽트(SW 인터럽트) : CPU에 의해 발생하는 인터럽트. ex) 프로그래밍 예외 처리할 때 예외 상황
비동기 인터럽트(HW 인터럽트) : 입출력장치에 의해 발생하는 인터럽트. ex) 프린트 요청 후 알림
CPU가 인터럽트를 처리하는 순서
1.
입출력장치는 CPU에게 신호를 보낸다.
2.
CPU는 실행 사이클이 끝나고 명령어 인출 전 인터럽트 여부를 확인한다.
3.
CPU는 인터럽트 플래그를 통해 현재 인터럽트를 받아들일 수 있는지 확인한다.
4.
인터럽트를 받아들일 수 있다면 CPU가 지금까지의 작업을 백업한다.
5.
CPU는 인터럽트 벡터를 참조하여 인터럽트 서비스 루틴을 실행한다.
6.
인터럽트 서비스 루틴이 끝나면 백업해둔 작업을 복구해서 실행을 재개한다.
인터럽트 벡터 : 인터럽트 루틴을 식별하기 위한 정보

예외

예외(동기 인터럽트)의 경우에는 폴트, 트랩, 중단, 소프트웨어 인터럽트 등이 있다.
폴트 : 예외 처리 직후 예외가 발생한 명령어부터 실행을 재개
트랩 : 예외 처리 직후 예외가 발생한 명령어의 다음 명령어부터 실행을 재개
중단 : CPU가 실행중인 프로그램을 강제로 중단시킬 수밖에 없는 심각한 오류의 경우
소프트웨어 인터럽트 : 시스템 콜이 발생했을 때 발생하는 예외

CPU 성능 향상을 위한 설계

클럭

클럭(clock) : 컴퓨터의 부품을 빠르게 움직일 수 있게 하는 시간의 단위
클럭 속도 : 헤르츠(Hz) 단위로 측정되는데 이는 클럭이 1초에 몇 번 반복되는지를 나타냄
클럭 속도가 높아지면 CPU는 명령어 사이클을 더 빠르게 반복하고, 다른 부품들도 그에 맞춰 더 빠르게 작동할 것이라 기대할 수 있다. 따라서 클럭 속도는 CPU의 속도 단위로 간주되기도 한다.

멀티 코어와 멀티 스레드

코어(core) : CPU 내에서 명령어를 읽어 들이고, 해석하고, 실행하는 부품
스레드(thread) : 실행 흐름의 단위
CPU 단위의 스레드와 프로그래밍에서의 스레드는 다르다.
하드웨어 스레드 : 하나의 코어가 동시에 처리하는 명령어의 단위
하나의 코어로 여러 명령어를 동시에 처리하는 CPU를 멀티스레드 프로세서 or 멀티스레드 CPU라고 함
소프트웨어 스레드 : 하나의 프로그램에서 독립적으로 실행되는 단위
메모리에 적재된 해당 프로그램을 구성하는 여러 부분이 동시에 실행될 수 있다~

병렬성과 동시성

하드웨어 스레드와 소프트웨어 스레드의 차이는 동시성과 병렬성의 키워드 차이를 통해 명확히 이해할 수 있다.
병렬성 : 작업을 물리적으로 동시에 처리하는 성질
하드웨어 스레드가 4개인 CPU가 4개의 명령어를 동시에 실행하는 경우
동시성 : 동시에 작업을 처리하는 것처럼 보이는 성질
하나의 CPU가 빠르게 작업을 번갈아가며 처리할 경우 사용자의 눈에는 동시에 처리되는 걸로 보임

파이프라이닝을 통한 명령어 병렬 처리

명령어 병렬 처리 기법(ILP, Instruction-Level Parallelism)은 여러 명령어를 동시에 처리하여 CPU를 한시도 쉬지 않고 작동시킴으로써 CPU의 성능을 높이는 기법을 말한다.
하나의 명령어가 처리되는 과정은 다음과 같이 나눌 수 있다.
1.
명령어 인출 (Instruction Fetch)
2.
명령어 해석 (Instruction Decode)
3.
명령어 실행 (Execute Instruction)
4.
결과 저장 (Write Back)
중요한 점은 같은 단계가 겹치지만 않는다면 CPU가 각 단계를 동시에 실행할 수 있다는 점이다. CPU는 하나의 명령어가 인출되는 동안 다른 명령어를 실행할 수 있고, 하나의 명령어가 실행되는 동안 연산의 결과를 저장할 수 있다.
이때 CPU가 이해하고 실행하는 명령어 집합 중 명령어 파이프라이닝을 비롯한 명령어 병렬 처리에 유리한 명령어 집합이 있고, 불리한 명령어 집합이 있다.
CISC(Complex Instruction Set Computer) : 다채로운 기능을 지원하는 복잡한 명령어들로 구성
Intel x86 or x86-64
RISC(Reduced Instruction Set Computer) : 짧고 규격화된, 1클럭 내로 실행되는 명령어들로 구성
Apple M1
CISC가 더 우월한 명령어 집합이라고 생각될 수 있지만, 실제로는 명령어가 너무 복잡하고 다양해서 명령어의 수행 시간이 길고 들쑥날쑥하기 때문에 파이프라이닝에 비효율적일 수 있다. RISC는 CISC에 비해 크기가 규격화되어 있고, 하나의 명령어가 1클럭 내외로 실행되기에 파이프라이닝에 최적화 되어있다.

파이프라이닝 위험

데이터 위험(data hazard) : 의존성이 있는 두 명령어를 겹쳐서 실행할 경우 발생
제어 위험(control hazard) : 프로그램 카운터의 갑작스러운 변화에 의해 발생
구조적 위험(structural hazard) : 서로 다른 명령어가 동시에 CPU 부품을 사용하려 할 때 발생