중앙처리장치 (CPU)
중앙처리장치(CPU)는 컴퓨터에서 명령어를 수행하고 데이터를 처리하는 장치로, 컴퓨터 시스템에서 프로그램이 수행하는 전반적인 과정을 제어한다. 중앙처리장치는 처리장치와 제어장치, 두 부분으로 나뉘고 조금 더 자세하게 CPU의 내부구조를 살펴보면 다음과 같다.
- `산술/논리 연산장치`: CPU에서 연산장치를 말하며 산술 마이크로연산과 논리 마이크로연산 등을 수행한다.
- `레지스터 세트`: CPU 내부의 레지스터 집합을 말한다.
- `제어장치`: 장치로부터 제어신호를 받아 다음에 처리할 작업을 제어하는 역할을 수행한다.
- `내부 버스`: 산술/논리 연산장치와 레지스터 간의 데이터 전송과 제어신호를 다루는 역할을 수행한다.
레지스터 (Registers)
레지스터는 CPU에서 주기억장치나 산술/논리 연산장치로부터 읽어 온 명령어와 데이터를 임시적으로 보관하는 저장장치이다. CPU의 레지스터는 목적에 따라 범용 레지스터와 특수 레지스터로 구분된다.
범용 레지스터
범용 레지스터는 여러 가지 연산을 위해 데이터 저장과 같은 일반적인 목적으로 사용되는 레지스터를 말한다. 데이터를 연산할 때 메모리로부터 데이터를 인출하면 호출시간이 꽤나 걸리기에 CPU 내부의 레지스터에 데이터를 일시적으로 기억시키고 연산한다.
특수 레지스터
특수 레지스터는 사용 목적이 정해져 있는 레지스터로 다음의 레지스터들이 존재한다.
주소를 기억하는 레지스터
- `프로그램 카운터 (PC: Program Counter)`: 다음에 실행할 명령어의 주소를 기억하는 레지스터로, 현재 처리하는 데이터를 인출한 후에는 자동적으로 1을 증가하여 다음에 수행할 명령어가 저장된 기억장치주소를 지정한다.
- `기억장치주소 레지스터 (MAR: Memory Address Register)`: 메인 메모리에 읽기/쓰기를 하는 주소를 저장하는 레지스터로, 프로그램 카운터에 들어있는 내용이 일시적으로 저장되는 주소 레지스터이다.
- `스택 포인터(SP: Stack Pointer)`: 스택 주소지정방식에서 사용되며, CPU 내부에 있는 레지스터로 스택 영역의 번지를 지정해주는 포인터이다.
- `인덱스 레지스터 (XR:indeX Register)`: 인덱스된 주소지정방식에서 프로그램에서 반복 연산의 횟수나 인덱싱을 위하여 사용되는 레지스터이다.
- `베이스 레지스터 (BR: Base Register)`: 간접 주소 지정 방식에서 주소의 시작 번지를 기억하는 레지스터
명령어를 기억하는 레지스터
- `명령어 레지스터 (IR: Instruction Register)`: 현재 실행 중인 명령어를 기억하는 레지스터이다.
데이터를 기억하는 레지스터
- `누산기 (AC: Accumulator)`: 연산 결과를 일시적으로 저장하는 레지스터
- `기억장치 버퍼 레지스터 (MBR: Memory Buffer Register)`: 메인 메모리에 읽기/쓰기를 하는 데이터를 저장하는 레지스터이다.
명령어 사이클 (Instruction Cycle)
CPU는 기억장치에 기억되어 있는 프로그램을 실행하는 역할을 담당하는데, 이때, 프로그램은 명령어로 구성되어 있다. CPU에서 명령어 수행과정은 다음과 같다.
- `명령어 인출`: 기억장치로부터 명령어를 가져오는 과정으로, 인출될 명령어는 프로그램 카운터(PC)에 있고 인출된 명령어는 명령어 레지스터(IR)로 옮겨진다.
- `명령어 해석`: 인출된 명령어가 무엇을 수행하라고 지시하는지를 알기 위하여 명령어를 해독하는 과정으로, 명령어의 종류에 따라 필요한 경우 오퍼랜드의 인출이 발생한다.
- `명령어 실행`: 지정된 연산을 수행하는 과정이다.
- `저장`: 실행 단계에서 수행된 연산 결과가 레지스터나 기억장치에 쓰여지는 과정이다.
- `인터럽트 처리`: 명령어 실행 도중에 입출력장치와 같은 다른 장치에 의해 인터럽트가 발생하면, 현재 프로세서의 상태를 저장하고 해당 인터럽트 서브루틴이 수행되도록 하는 과정이다.
명령어 1개를 CPU에서 수행하는데 필요한 전체 수행과정을 명령어 사이클(Instruction Cycle)이라고 하며, 크게 인출 사이클(Fetch Cycle)과 실행 사이클(Execute Cycle)로 나눌 수 있다.
명령어 파이프라이닝 (Pipelining)
컴퓨터 시스템의 계산속도 향상을 위해 동시에 데이터 처리기능을 하는 기술이 "병렬 처리(Parallel Processing)"이다. 병렬 처리 방법 중 "파이프라인 처리"는 하나의 프로세스를 서로 다른 기능을 가진 여러 개의 서브프로세스로 나누어 각 서브프로세스가 동시에 서로 다른 데이터를 취급하도록 하는 방식이다.
명령어 파이프라이닝은 CPU의 처리속도를 향상시키는 방법으로, CPU의 내부 하드웨어를 여러 단계로 나누어 처리하는 기술이다. 하나의 처리기를 여러 부처리기로 나누어 각각의 처리기가 동시에 서로 다른 데이터를 처리하는 구조이다. 명령어 수행 사이클에 명령어 파이프라이닝 기법을 적용하면 여러 개의 명령어가 중첩되어 실행되도록 구현한다.
단계별 명령어 파이프라이닝
명령어 파이프라이닝은 수행 단계별로 2단계, 4단계, 6단계 명령어 파이프라이닝이 있다.
- `2단계 명령어 파이프라인`: 명령어가 수행되는 컴퓨터 사이클을 "명령어 인출 단계", "명령어 실행 단계"라는 2개의 독립적인 파이프라인 모듈로 분리하여 수행하는 방법
- `4단계 명령어 파이프라인`: 명령어가 수행되는 컴퓨터 사이클을 "명령어 인출 단계", "명령어 해독 단계", "오퍼랜드 인출", "명령어 실행 단계" 4개의 독립적인 파이프라인 모듈로 분리하여 수행하는 방법
- `6단계 명령어 파이프라인`: 명령어가 수행되는 컴퓨터 사이클을 "명령어 인출 단계", "명령어 해독 단계", "오퍼랜드 계산 단계", "오퍼랜드 인출 단계", "명령어 실행 단계", "결과 오퍼랜드 저장 단계" 6개의 독립적인 파이프라인 모듈로 분리하여 수행하는 방법
파이프라인에 의한 속도 향상
명령어 파이프라인 사용 시, 얼마만큼의 속도 향상이 이루어지는지를 볼 때, 파이프라인 단계의 수를 $K$로, 실행할 명령어의 수를 $N$으로, 각 파이프라인 단계가 한 클록 주기씩 걸린다고 가정한다. 이때 하나의 명령어를 실행하고 다음 명령을 실행하는 사이에 필요한 시간(래치시간)을 무시하면 파이프라인에 의한 전체 명령어 실행시간 $T$는 다음과 같다.
$$T = K + (N - 1)$$
위의 식은 처음의 명령어를 제외한 $N-1$의 명령어를 실행할 때 걸리는 시간이다. 파이프라인을 사용하지 않으면 $N$개의 명령어를 실행하는데 $K \times N$ 시간이 소요된다. 파이프라인을 이용하며 얻을 수 있는 속도 향상(SP: SpeedUp)은 다음과 같이 정의된다.
$$ SP = \frac{K \times N}{K + (N-1)}$$
이상적인 경우 $K$단계의 파이프라인을 가진 컴퓨터에서 $K$배의 속도 향상을 얻기 위해서는 다음의 조건을 만족해야 한다.
- 모든 단계에서의 실행 시간이 같아야 한다.
- 래치시간이 각 단계의 실행시간보다 무시할 정도로 작아야 한다.
- 실행되어야 할 명령어의 수가 많아야 한다.
그러나 파이프라인의 성능을 최대로 하기 위해서는 몇 가지 제한 요소가 존재한다.
- 구조적인 제한 요소로서 2개 이상의 명령어가 같은 단계에서 같은 하드웨어가 동시에 접근하지 말아야 한다.
- 제어적인 제한요소로서 명령어의 수행은 정해진 순서대로 수행되어야 한다.
CISC와 RISC
명령어 집합은 컴퓨터 시스템의 성능에 많은 영향을 끼치는데, 명령어의 길이와 형식에 따라 CPU를 CISC(Complex Instruction Set Computer)과 RISC(Reduced Instruction Set Computer)로 나눌 수 있다.
CISC(Complex Instruction Set Computer)
CISC는 연산을 수행하는데 사용되는 복잡한 명령어를 수백 개 이상 탑재하는 마이크로 처리기이다. 하나의 명령어로 원하는 동작을 수행할 수 있기에 전체 프로그램의 길이가 RISC에 비해 짧다. 그러나 명령어 개수의 증가에 따라 처리기 내부구조가 매우 복잡해지고 고속 처리기를 만들기가 어렵기에 속도 향상에 한계가 있다..
RISC(Reduced Instruction Set Computer)
RISC는 CISC의 복잡한 명령어를 단순화하여 명령의 수를 줄이고 하드웨어를 간단하게 개산한 마이크로 처리기이다. CISC에 비해 명령어 해독과 실행에 소요되는 시간이 짧다. 즉, CPU의 처리속도가 상대적으로 빠르다.
CISC와 RISC 비교
CISC와 RISC를 비교하면 다음과 같다.
CISC (Complex Instruction Set Computer) | RISC (Reduced Instruction Set Computer) |
명령어 크기와 형식이 다양하다. | 명령어 크기가 동일하고 형식이 제한적이다. |
명령어 형식이 가변적이다. | 명령어 형식이 고정적이다. |
레지스터가 적다. | 레지스터가 많다. |
주소지정방식이 복잡하고 다양하다. | 주소지정방식이 단순하고 제한적이다. |
프로그램 길이가 짧고 명령어 사이클이 길다. | 모든 명령어는 한 사이클에 실행되나 프로그램의 길이가 길다. |
파이프라인이 어렵다. | 파이프라인이 쉽다. |