CISC와 RISC CPU 설계 철학: 명령어 집합과 실행 구조의 차이
CISC와 RISC의 명령어 길이, 메모리 접근, 파이프라인, 코드 밀도 차이와 x86-64·ARM의 현대적 변화를 정리한다.
2026-08-14 · 최초 발행 2026-01-03
명령어 집합을 설계하는 방향
CISC(Complex Instruction Set Computer)는 다양한 복합 명령어를 제공해 적은 수의 명령어로 프로그램을 표현하려는 아키텍처다. 반대로 RISC(Reduced Instruction Set Computer)는 단순하고 고정 길이인 명령어를 반복 실행해 빠른 처리와 파이프라인 최적화를 노린다.
차이는 단순히 명령어 개수에 그치지 않는다. CISC는 명령어 디코딩과 하드웨어 구현이 복잡해지는 대신 코드 밀도를 높이고, RISC는 실행 구조를 단순하게 유지하는 대신 동일한 작업에 더 많은 명령어가 필요할 수 있다.
복합 작업을 명령어에 담는 CISC
CISC는 하드웨어가 복잡한 작업을 수행하도록 설계한다. 대표 아키텍처는 Intel과 AMD의 x86, x86-64다.
명령어 하나가 여러 작업을 수행할 수 있고, 메모리를 직접 대상으로 연산하거나 다양한 주소 지정 방식을 활용할 수 있다. x86-64 명령어는 1바이트 ~ 15바이트의 가변 길이를 가지므로 명령어마다 디코딩 과정도 달라진다.
초기 x86은 8개 범용 레지스터를 사용했다. 레지스터가 제한적인 환경에서는 메모리에 직접 접근하는 일이 잦아졌고, 복잡한 명령어는 여러 마이크로 명령어로 변환해 실행한다. 이 방식은 코드 밀도를 높이지만 하드웨어 복잡도를 키운다.
x86에서 보이는 복합 명령어
; 메모리에서 직접 연산
ADD [EBX], EAX ; 메모리 주소 [EBX]의 값에 EAX 더하기
; 복잡한 문자열 연산
REP MOVSB ; ECX 횟수만큼 문자열 복사
; PUSH와 MOV를 합친 명령어
PUSH DWORD [EBX+8] ; 메모리 값을 스택에 푸시
; 곱셈과 덧셈을 한 번에
LEA EAX, [EBX+ECX*4+8] ; EAX = EBX + ECX*4 + 8
이처럼 CISC 명령어는 한 번의 명령으로 복합 작업을 표현할 수 있으며, 메모리 직접 연산과 높은 코드 밀도가 특징이다.
단순한 실행 경로를 택한 RISC
RISC는 복잡한 작업을 소프트웨어가 조합하도록 두고, 명령어 자체는 단순하게 유지한다. ARM, MIPS, RISC-V, PowerPC가 대표적인 아키텍처다.
대부분의 명령어는 한 가지 작업을 맡고, 레지스터 간 연산을 중심으로 실행된다. ARM은 ARM 모드에서 32비트 고정 길이 명령어를 사용하며, MIPS 역시 32비트 고정 길이를 사용한다. 고정된 형식은 디코딩을 단순하게 만들고 실행 시간을 예측하기 쉽게 한다.
레지스터 수에서도 차이가 난다. ARM은 16개 범용 레지스터, MIPS는 32개 범용 레지스터를 제공해 메모리 접근을 줄인다. 메모리 접근은 LOAD와 STORE가 담당하고, 실제 연산은 레지스터에서만 수행하는 Load/Store 아키텍처가 RISC의 핵심이다.
고정 길이 명령어와 단순한 실행 구조는 파이프라인 구성에 유리하며, 높은 클럭 속도와 예측 가능한 실행 시간을 목표로 한다.
ARM에서의 Load/Store 처리
; 메모리 연산은 LOAD/STORE만
LDR R0, [R1] ; R0 = Memory[R1] (Load)
ADD R0, R0, R2 ; R0 = R0 + R2 (레지스터 연산)
STR R0, [R1] ; Memory[R1] = R0 (Store)
; CISC의 ADD [EBX], EAX를 RISC로 표현
; 3개의 명령어 필요
RISC에서는 한 명령어가 한 작업을 처리하며, 메모리 연산은 LOAD와 STORE로 제한된다. 그 결과 같은 작업도 CISC보다 많은 명령어를 사용할 수 있어 코드 밀도는 낮아진다.
코드 밀도와 실행 구조의 교환 관계
| 구분 | CISC | RISC |
|---|---|---|
| 명령어 수 | 수백 개 | 수십 개 |
| 명령어 복잡도 | 복잡 | 단순 |
| 명령어 길이 | 가변 (1~15바이트) | 고정 (4바이트) |
| 실행 시간 | 가변 | 고정 (1 사이클) |
| 레지스터 수 | 적음 (8~16개) | 많음 (16~32개) |
| 메모리 접근 | 직접 연산 가능 | Load/Store만 |
| 코드 밀도 | 높음 | 낮음 |
| 프로그램 크기 | 작음 | 큼 |
| 파이프라인 | 어려움 | 쉬움 |
| 하드웨어 복잡도 | 높음 | 낮음 |
| 전력 소비 | 많음 | 적음 |
| 대표 아키텍처 | x86, x86-64 | ARM, MIPS, RISC-V |
CISC는 수백 개의 명령어와 가변 길이 형식을 통해 작은 프로그램 크기와 높은 코드 밀도를 추구한다. 복잡한 명령어는 여러 사이클을 사용하거나 마이크로코드로 변환될 수 있어 실행 시간을 예측하기 어렵고, 파이프라인 최적화와 디코딩도 복잡해진다.
RISC는 수십 개의 기본 명령어를 고정 길이로 제공한다. 대부분 1 사이클에 실행되며, Load/Store만 메모리에 접근하고 연산은 레지스터에서 처리한다. 컴파일러의 명령어 선택과 최적화는 단순해지지만, 프로그램 크기는 커지고 메모리 사용량은 늘어날 수 있다.
메모리 비용과 컴파일러가 바꾼 설계 선택
CISC는 메모리가 비쌌고 어셈블리 프로그래밍이 주류였던 시기에 등장했다. 프로그램 크기를 최소화하려면 적은 명령어로 복잡한 작업을 처리하고 높은 코드 밀도를 확보하는 방식이 필요했다. Intel 8086은 1978년에, Motorola 68000은 1979년에 등장했다.
RISC는 메모리 가격 하락과 컴파일러 발전, 파이프라인 최적화 요구를 배경으로 1980년대에 등장했다. 당시 연구에서는 프로그램의 80%가 단순한 명령어만 사용하고 복잡한 명령어는 거의 사용되지 않으며, 단순한 명령어가 더 효율적이라는 결과가 제시됐다. ARM과 MIPS는 1985년, SPARC는 1987년에 등장했다.
현대 CPU에서는 경계가 흐려진다
x86-64는 외부적으로 CISC 명령어 집합과 하위 호환성을 유지하면서도, 내부적으로는 명령어를 마이크로 명령어로 변환한다. RISC와 유사한 파이프라인, Out-of-Order 실행, 슈퍼스칼라 아키텍처를 활용하는 하이브리드 접근이다.
ARM도 기본 RISC 구조 위에 코드 밀도와 연산 기능을 보강해 왔다. Thumb 명령어는 16비트로 코드 밀도를 높이고, NEON은 SIMD 벡터 연산을 제공한다. RISC-V는 모듈형 설계와 확장 가능한 명령어 집합을 내세운다.
워크로드와 기기 유형에 따른 선택
x86-64는 데스크톱과 서버, 고성능 컴퓨팅, 하위 호환성이 필요한 환경, 복잡한 소프트웨어에서 사용된다. Intel Core 시리즈와 AMD Ryzen 시리즈가 대표 제품이며, 높은 성능과 방대한 소프트웨어 생태계, 하위 호환성이 강점이다.
ARM은 모바일 기기, 임베디드 시스템, 저전력이 필요한 환경, IoT 기기에 적합하다. ARM Cortex 시리즈, Apple M 시리즈, Qualcomm Snapdragon이 대표 제품이다. 낮은 전력 소비, 긴 배터리 수명, 낮은 발열이 장점으로 언급된다.
Apple M 시리즈는 ARM 기반으로 데스크톱과 노트북 영역에 진출했고, 높은 성능과 낮은 전력을 함께 내세운다. 서버 분야에서도 AWS Graviton을 포함한 ARM 서버가 증가하고 있으며, 클라우드 데이터센터에서는 전력 효율성이 중요해지고 있다.
| 분야 | CISC (x86-64) | RISC (ARM) |
|---|---|---|
| 데스크톱 | 주류 | 증가 중 |
| 서버 | 주류 | 증가 중 |
| 모바일 | 거의 없음 | 독점 |
| 임베디드 | 일부 | 주류 |
| IoT | 거의 없음 | 독점 |
| 전력 효율성 | 낮음 | 높음 |
| 성능 | 최고 | 점점 근접 |