컴퓨터 하드웨어는 크게 중앙처리장치(CPU), 메인 메모리, 입출력 장치로 나뉘며 이들은 모두 버스(Bus)로 연결되어 있습니다. 이번 포스팅에서는 중앙처리장치에 대해서 알아보겠습니다.
중앙처리장치 (CPU)
중앙처리장치는 "기계어 명령어"를 해독하고 명령어를 파악한 후, 해당 명령어를 수행하기 위한 세부 작업을 실행합니다.
기본적으로 제어 명령을 보내거나 연산 수행을 하는 것이 중앙처리장치의 역할입니다. 중앙처리장치는 내부적으로 레지스터, 산술/논리 장치, 컨트롤 장치로 구성되어 있으며 이들은 모두 내부 버스로 연결되어 있습니다.
레지스터 (Registers)
레지스터란 플립플랍 여러 개를 일렬로 배열해서 구성한 것이며, CPU 연산을 위한 데이터를 저장하는 CPU 내부의 임시 공간입니다. 레지스터의 동작 방식에 따라 직렬(Serial) 또는 병렬(Parallel) 형식으로 입출력을 진행할 수 있습니다.
레지스터 구현 방법
레지스터에 입력과 출력을 직렬 또는 병렬 방법을 사용할 수 있기에 총 4가지 방식의 레지스터 구현 방법이 있습니다.
- Serial Input Serial Output (SISO)
- Serial Input Parallel Output (SIPO)
- Parallel Input Serial Output (PISO)
- Parallel Input Parallel Output (PIPO)
레지스터 종류
레지스터는 다양한 용도로 사용될 수 있는 "범용 레지스터(General Purpose Registers)"와 사용 목적이 정해져 있는 "특수 목적 레지스터(Special Purpose Registers)"로 구분 가능합니다. 다음과 같은 레지스터들이 존재합니다.
- PC(Program Counter): 다음에 실행할 명령어의 주소를 기억하는 레지스터
- IR(Instruction Register): 현재 실행 중인 명령어를 기억하는 레지스터
- AC(Accumulator): 연산 결과를 일시적으로 저장하는 레지스터
- MAR(Memory Address Register): 메인 메모리에 읽기/쓰기를 하는 주소를 저장하는 레지스터
- MBR(Memory Buffer Register): 메인 메모리에 읽기/쓰기를 하는 데이터를 저장하는 레지스터
- Status Register(상태 레지스터): CPU 내부의 상태를 저장하는 레지스터
- Base Register(베이스 레지스터): 간접 주소 지정 방식에서 주소의 시작 번지를 기억하는 레지스터
- Index Register(인덱스 레지스터): 프로그램에서 반복 연산의 횟수나 인덱싱을 위하여 사용되는 레지스터
- Shift Register(쉬프트 레지스터): 저장된 값을 왼쪽/오른쪽으로 1비트씩 자리를 이동하는 레지스터
산술/논리 연산 장치 (Arithmetic and Logic Unit: ALU)
산술/논리 연산 장치(ALU)는 CPU 내부에서 실제 연산을 담당하는 부분으로 즉, 산술 연산과 논리 연산을 수행하는 부분입니다.
산술 연산을 위해서는 기본적인 1비트 가산기를 만들고, 병렬로 멀티 비트로 확장하여 멀티 비트 가산기를 만든다. 그리고 이를 기반으로 다양한 사칙 연산을 수행합니다.
논리 연산은 True(1), False(0)과 피연산자로 사용하는 연산입니다. 논리 회로를 이용하여 빠른 연산 수행 속도를 자랑합니다. 산술 연산과 논리 연산을 결합하여 더욱 복잡한 연산을 수행합니다.
제어 장치 (Control Unit)
제어 장치는 처리해야 하는 명령어들을 해석하고, 명령어 수행에 필요한 제어 신호를 생성해서 적절한 모듈에게 신호를 보냅니다. 즉, 제어 장치는 명령어를 해독하여 적절한 데이터 처리 신호를 위한 제어 신호를 발생시키는 장치입니다. 명령어와 CPU의 상태 신호와 클럭을 입력으로 받아들입니다.
제어 장치 구현
제어 장치 구현 방법은 크게 "하드와이어 제어 방식(Hardwired)"과 "마이크로 프로그램 기반 제어 방식(Micro-Programmed)"이 있습니다.
하드와이어 방식은 조합 논리 회로를 이용하여 구현하는 방식입니다.
- 하드웨어를 이용하는 방법이기에 실행 속도가 빠르지만, 명령어 세트가 한 번 만들어지면 변경할 수 없습니다.
- 회로 구성이 복잡하여 RISC(Reduced Instruction Set Computer) 구조를 기본으로 하는 컴퓨터에서 주로 사용됩니다.
마이크로 프로그램 방식은 PROM(Programmable ROM)을 이용하여 필요한 제어 신호를 프로그래밍하는 방식입니다.
- 제어 메모리 내부에 있는 마이크로 명령어들의 집합으로, 기계어가 더 작은 단위로 나뉘어 실행되도록 하는 "마이크로 프로그램"을 PROM에 프로그래밍하는 방식입니다. 그렇기에 메인 메모리 외에 별도의 메모리가 필요합니다.
- 명령어 세트 변경이 더 용이하고 검증이 쉽습니다.
- 하드웨어 방식에 비해서는 속도가 느립니다.
- 다양한 어드레싱 모드를 지원하는 등, 비교적 복잡한 명령어 세트를 가진 시스템에 적합합니다.
폰 노이만의 내장형 프로그램 방식
폰 노이만의 내장형 프로그램 방식은 프로그램을 메인 메모리에 데이터와 같이 내장한다. 메인 메모리에 있는 프로그램의 인스트럭션을 신행하기 위해서는 인스트럭션을 CPU로 가져와 실행한다. 인스트럭션의 실행 과정은 "명령어 수행 사이클"이라 불립니다. 명령어 수행 사이클은 다음과 같은 과정으로 이루어집니다.
- 명령어 인출(Fetch): 메인 메모리로부터 수행할 명령어를 가져온다. PC 레지스터가 다음에 수행할 명령어의 주소를 가지고 있다.
- 명령어 해독(Decode): 인출된 명령어의 종류를 해독한다.
- 명령어 실행(Execute): CPU 내부의 제어 장치가 명령어 해독 결과에 따라 필요한 제어 신호를 실행한다.
파이프라이닝 (Pipelining)
위의 명령어 수행 사이클은 기본적으로 Fetch, Decode, Indirect, Execute, Interrupt 등의 세부 단계로 이루어집니다. 각 세부 단계들을 인접한 명령어들 사이에 중복 수행하는 것을 "파이프라이닝(Pipelining)"이라고 합니다.
즉, 파이프라이닝이란 순차적인 명령어들 간의 병렬성을 사용하는 기술이다. 동시에 수행가능한 명령어의 개수를 증가시켜 속도를 증가시킨다. 이때, 파이프라이닝을 효과적으로 하기 위해서는 명령어 구조가 가능한 RISC 구조의 인스트럭션이 효율적이다.
CISC / RISC
기계어 명령의 길이와 형식에 따라 CPU를 CISC(Complex Instruction Set Computer)과 RISC(Reduced Instruction Set Computer)로 나눌 수 있습니다.
- CISC: 다양한 종류의 연산과 주소 지정 모드 등이 제공되어 자유로운 프로그래밍이 가능하고 복잡한 명령도 마이크로 코드이기에 코드의 효율이 좋습니다.명령어의 구조와 개수 등이 복잡하여 명령어의 해독에 시간이 많이 걸린다.
- RISC: 고정된 길이의 명령어를 사용하고 명령어의 종류가 상대적으로 적다. 그렇기에 명령어들이 단순화되어 연속적으로 중복 수행하는 파이프라이닝 기법을 효율적으로 적용할 수 있다. 따라서 명령어 수행 속도가 빠르다. 또한 전력 소모가 낮아 임베디드 프로세서에 자주 사용하나 명령어의 길이가 고정되어 코드의 효율이 낮다.