https://dev-dx2d2y-log.tistory.com/197
[컴퓨터구조] OOO, OoOE, 토마슬로 알고리즘을 통한 비순차적 명령어 처리 + 혼공컴구 독서 #6 - CPU
아니 열람실에서 공부중인데 6시 이후로 급격하게 추워짐 뭐야이거 개추워https://dev-dx2d2y-log.tistory.com/191 [컴퓨터구조] 혼공컴구 독서 #5 - 명령어 사이클과 인터럽트https://dev-dx2d2y-log.tistory.com/189 [
dev-dx2d2y-log.tistory.com
저번에는 CPU의 간단한 성능향상기법에 대해서 알아보았다.
명령어 파이프라인을 사용하든, OOO를 사용하든 파이프라이닝은 중요하다. OOO와 명령어 파이프라이닝 또는 슈퍼스칼라가 대척점에 있는 관계같지만, 실제로는 OOO는 파이프라이닝을 비순차적으로 실행하는 과정이기 때문에 파이프라이닝은 현대 컴퓨터구조에서 중요한 편이다.
또한 명령어 파이프라이닝을 위해서는 명령어가 파이프라이닝에 효과적으로 적용될 수 있는 구조를 가지고 있어야한다.
이를 기반으로하는 기술은 ISA, 그리고 이를 기반으로한 CISC와 RISC가 있다.
ISA
CPU의 구조는 제조사마다 다른 편이고, CPU의 제조사마다, CPU마다 규격, 기능도 다르고, 명령어의 세부사항, 명령어로 할 수 있는 연산, 주소 지정방식은 다르다. (물론 큰 틀에서 본 명령어의 연산코드-오퍼랜드라는 기본적인 구조와 작동원리는 CPU마다 크게 다르지 않다.)
따라서 CPU가 이해할 수 있는 명령어들의 모음은 CPU마다 다르기 마련이다. 이런 명령어들의 모음을 명령어 집합(instruction set), ISA(명령어 집합 구조; Instruction Set Architecture)라고한다.
예를 들면, 인텔 CPU는 x86 (또는 x86-64) ISA를 사용하고, Mac의 CPU는 ARM ISA를 사용한다. 따라서 ISA가 다르기 때문에 세부적인 명령어 호환이 이루어지지 않는다. 그래서 윈도우와 맥의 프로그램 호환은 개발을 윈도우용과 Mac용으로 하지 않는 이상 호환되지 않는 편.
또한 명령어는 어셈블리어와 일대일 대응을 이룬다고했는데, 이 때문에 ISA마다 적용되는 어셈블리어가 다르다. 또한 명령어 구조가 다를 뿐 아니라 레지스터의 구조, 메모리 관리 방법, 제어장치의 명령어 해석 방식 등이 달라지기 때문에 ISA구조가 다른 CPU 간 소통은 제약점이 많다.
CISC
CISC의 특징
CISC는 Complex Instruction Set Computer (복잡한 명령어 집합을 활용하는 컴퓨터, 여기서 컴퓨터는 CPU와 동의어다.)의 약자다. 복잡하고 다양한 명령어들을 활용하는 CPU 설계방식. x86, x86-64가 CISC 기반의 ISA다.
CISC는 다양하고, 복잡한 명령어들을 사용한다. 따라서 명령어의 크기와 형태가 다양한 편이며, 그렇기 때문에 명령어는 가변 길이 명령어를 사용한다. 메모리 주소 접근 지정 방식도 다양한 편이기 때문에 여러 방식들을 사용하는 편.
다양한 기능들을 제공하는 편이기 때문에 적은 수의 명령어로도 프로그램을 실행할 수 있고, 명령어의 길이도 짧은 편이다. 여러 기능들을 하나로 합친 명령어들을 사용할 수 있기 때문. 그래서 CISC 기반의 x86 어셈블리 코드와 CISC가 아닌 ARM 어셈블리 코드를 비교해보면 x86 어셈블리가 더 코드길이가 짧다. 그래서 컴파일된 프로그램의 크기도 작은 편이다.
CISC의 장점
이러한 CISC의 장점은 메모리를 최대한 아껴서 개발해야하던 시절에 인기가 많았다. 왜냐하면 기능이 많아서 사용할 수 있는 명령어가 많고, 그래서 적은 수의 명령어로도 같은 기능을 처리할 수 있기 때문이다.
CISC의 단점
다만 CISC의 단점도 명확한데, 명령어가 워낙 복잡하고 다양해서 명령어의 실행주기가 일정하지 않다. 앞서 클럭에 대해 배우면서 컴퓨터 내 장비들은 일정 클럭마다 명령을 처리한다고했는데, CISC가 너무나도 복잡한 명령어를 사용하다보면 여러 클럭동안 해당 명령어를 처리해야하기 때문이다.
그리고 이는 명령어 파이프라이닝에서 약간의 문제가 되는데, 명령어 파이프라인에서는 명령어를 인출하고, 해석하면서 동시에 다음 명령어를 인출하고, 해석한 명령어를 실행하며 인출한 명령어를 해석하고 다음 명령어를 다시 인출하는, 일련의 과정 속 각 과정이 같은 시간동안 CPU를 점유해야한다. 즉, 인출과 해석, 실행과 저장까지 모두 같은 시간이 소요되어야 공장처럼 동시에 여러 명령어를 인출, 해석, 저장, 실행시킬 수 있다. 각 과정을 병렬적으로 동시에 실행할 수는 있지만, 한 과정을 동시에 실행시키지는 못하기 때문이다.
이런 점에서 CISC를 살펴보면, 만약 특정 명령어가 실행과정에서 오랜 시간이 걸리면, 그 다음명령어들은 해석과정이 끝났더라도 앞에 있는 오래 걸리는 명령어의 실행이 끝날 때까지 대기해야한다. 따라서 CISC는 명령어의 수행시간을 예측할 수 없어 파이프라이닝이 어렵다.
RISC
RISC의 특징
RISC는 Reduced Instruction Set Computer 의 약어다. 적은 수의 명령어 집합을 사용하는 CPU라는 뜻이다.
파이프라이닝에서의 CISC의 여러 단점들을 보완해서 등장한 ISA구조다. 앞서 CISC는 명령어의 크기가 제각각이라 명령어의 실행, 해석 등의 과정에서 시간을 오래 점유하는 명령어가 생기면 파이프라이닝의 구조가 깨질 수 있다.
RISC는 무엇을 지향하는가?
또 CISC의 하나의 단점은, CISC는 다양하고 복잡한 명령어들을 지원하지만, 대다수의 복잡한 명령어들은 그 활용빈도가 적다는 것이다. 그래서 복잡한 기능을 추가하기보다는 많이 쓰이는 명령어를 간결하고 짧게 만드는 것이 좋다.
이러한 점들은 CISC의 단점을 보완한 RISC의 구조의 지향점들을 나타낸다. 각 명령어들은 일정한 처리시간을 가지며, 명령어가 짧고 간결하게, 명령어 처리과정의 과정이 1클럭 내외로 실행되는 것을 지향한다.
RISC의 특징
RISC는 고정 길이 명령어를 활용한다. 명령어의 길이가 고정되었기 때문에 처리과정에서 약 1클럭 내외의 소요시간이 걸린다. 즉, 파이프라이닝에 최적화된 구조.
대표적인 예시가 메모리 접근 방식인데,
CISC는
ADD EAX, [0x1234]: 메모리주소 0x1234에 있는 값을 EAX 레지스터 값과 더해 EAX에 저장.
INC [EBX]: EBX 레지스터가 가리키는 메모리 주소의 값을 1 증가
MOVS: 메모리의 한 블럭을 다른 메모리 블럭으로 이동
PUSH / POP: 스택의 그거
등이 있다.
CISC는 메모리 주소에서 값을 가져오고, 연산을 처리하고, 이를 저장하는 과정을 모두 한 명령어에서 처리할 수 있다. 이것이 CISC의 가장 큰 특징으로, 사용하는 명령어의 수는 적지만 명령어 한 개 당 소요시간이 크기 때문에 파이프라이닝에는 적합하지 않다.
RISC는
Load (가져오기)
Store (저장)
가 끝이다.
따라서 사용해야할 명령어가 많다. CISC 구조의 ADD [300], [200], [100] 명령어(100번 주소의 값과 200번 주소의 값을 더해서 300번 주소에 저장)를 RISC로 처리하려면
LOAD R1, [100]
LOAD R2, [200]
ADD R3, R1, R2
STORE [300], R3
이렇게 명령어가 많이 필요하다. 이를 보면 알 수 있듯이, RISC는 메모리 접근하는 방식을 아주 간략하게한 대신 레지스터의 활용률을 높였다. 따라서 범용 레지스터의 수가 RISC에서 조금 더 많은 편이다. 그리고 사용 가능한 명령어의 수가 RISC보다 적기 때문에 컴파일된 코드에서 명령어를 CISC에 비해서 더 많이 사용하는 편.
번외: 윈도우에서는 왜 x86을 쓰는가?
윈도우에서는 여전히 x86 ISA, 그러니까 CISC를 사용한다. 분명 현대 컴퓨터구조는 파이프라이닝이 중요하고, CISC는 파이프라이닝에 유리하지 않은 구조라고 했는데 왜 여전히 x86 구조를 사용하는 것일까?
그 이유는 수십 년 동안 윈도우와 윈도우 전용 프로그램들은 CISC 기반으로 프로그래밍되었고, 따라서 CISC 구조를 한순간에 RISC로 바꿔버리면 그동안의 개발된 윈도우 프로그램들이 휴지조각이 되어버리기 때문이다. 즉, 레거시 때문
그래서 윈도우 내부에서는 ISA 구조를 RISC로 바꾸기보다는 CISC → RISC 컨버터를 사용한다. 그래서 CISC의 복잡한 명령어들은 RISC 스타일의 명령어 구조로 쪼갠다. 그 이후의 명령어들은 CISC 명령어를 사용하긴하지만, 그래도 RISC의 성격을 띄게되어 명령어 파이프라이닝이 더욱 쉬워지는 것. 또한 이 변환과정 자체가 자원이 많이 드는 일이기 때문에, 이를 캐시에 저장하여 두고두고 사용한다.
[컴퓨터구조] OOO, OoOE, 토마슬로 알고리즘을 통한 비순차적 명령어 처리 + 혼공컴구 독서 #6 - CPU
아니 열람실에서 공부중인데 6시 이후로 급격하게 추워짐 뭐야이거 개추워https://dev-dx2d2y-log.tistory.com/191 [컴퓨터구조] 혼공컴구 독서 #5 - 명령어 사이클과 인터럽트https://dev-dx2d2y-log.tistory.com/189 [
dev-dx2d2y-log.tistory.com
RISC 구조가 CISC 구조보다 레지스터를 더 요구한다는 문제는 저번에 다룬 Register Renaming으로 해결하는 편이다.
따라서 CISC의 레거시 구조를 지키면서 RISC 구조의 이점까지 챙길 수 있는 방향으로 작동된다.
번외2: 믿거나말거나 나무위키


재미로 살펴보니 나무위키에서 RISC 문서가 있어서 살펴보니 이정도의 내용들이 있었다. RISC에 대해서 일반적으로 알려진 오해 정도를 다루고 있다. 믿거나말거나 읽어보면 재밌다.`
'CS > 컴퓨터구조' 카테고리의 다른 글
| [컴퓨터구조] 혼공컴구 독서 #9 - 메모리와 주소의 종류, MMU, 캐시메모리와 CPU 경향성 (1) | 2026.02.03 |
|---|---|
| [컴퓨터구조] 혼공컴구 독서 #8 - RAM과 DRAM, SRAM의 형태와 성능 (0) | 2026.02.01 |
| [컴퓨터구조] OOO, OoOE, 토마슬로 알고리즘을 통한 비순차적 명령어 처리 + 혼공컴구 독서 #6 - CPU 성능향상 (1) | 2026.01.25 |
| [컴퓨터구조] 혼공컴구 독서 #5 - 명령어 사이클과 인터럽트 (0) | 2026.01.23 |
| [컴퓨터구조] 혼공컴구 독서 #4 - CPU 레지스터 (0) | 2026.01.20 |
