본문 바로가기
Computer Science/Computer Architecture

[컴퓨터 구조] ISA, CISC, RISC

by 진현개발일기 2024. 10. 6.

■ ISA

CPU는 제조사마다 생김새, 연산 및 주소 지정 방식에 차이가 있다.

이러한 CPU가 이해할 수 있는 명령어들의 모음을 '명령어 집합(Instruction Set)' 또는 '명령어 집합 구조(ISA; Instructio Set Architecture)'라고 부른다. 즉 CPU마다 각기 다른 ISA를 가질 수 있다.

 

예로 인텔이나 AMD의 x86, x86-64의 ISA와 애플의 ARM ISA는 서로 다른 ISA이기 때문에 별도의 작업 없이 인텔의 CPU에서 빌드한 실행 파일을 그대로 아이폰에 옮겨 실행하면 바로 실행이 안된다. 왜냐하면 실행 파일(exe)은 명령어로 이루어져 있고, CPU마다 이해할 수 있는 명령어가 다르기 때문이다.

 

예시로 동일한 C++ 코드를 gcc 14.2라는 동일한 컴파일러를 이용하여  X86-64 ISA, ARM ISA 어셈블리어로 컴파일하면 아래와 같은 모습을 띄게 된다.

[코드]

[x86-64 gcc 14.2]

[ARM gcc 14.2.0]

■ CISC

CISC (Complex Instruction Set Computer)는 활자 그대로 '복잡한 명령어 집합을 활용하는 컴퓨터'이다.

복잡하고 다양한 명령어들을 활용하는 CPU 설계 방식으로 위에서 얘기한 x86, x86-64가 대표적인 CISC 기반의 ISA이다.

 

CISC는 기본적으로 명령어의 형태와 크기가 다양한 가변 길이 명령어를 활용한다. 그에 따라 메모리 주소 접근 지정 방식도 다양하기에 상대적으로 적은 수의 명령어로도 프로그램을 실행할 수 있다.

 

위에서 예시로 붙여놓은 이미지만 봐도 ARM에 비해 x86-64가 비교적 적은 개수의 명령어로 동일 코드를 수행하는 것을 볼 수 있었다.

 

이러한 장점 덕분에 메모리를 최대한 아낄 수 있지만, CISC에는 치명적인 단점이 다소 있다.

가변 길이의 명령어를 수행하기 때문에 명령어의 크기와 수행 시간이 일정하지 않다는 것이다.

 

이것이 왜 문제가 될까? 앞서 포스팅한 글의 명령어 파이프라이닝을 한 번 보자

https://yjhdevelopdiary.tistory.com/237

 

[컴퓨터 구조] 명령어 병렬 처리기법 (ILP)

■ 명령어 병렬 처리 기법 (ILP; Instruction-Level Paallelism)좋은 성능의 CPU 제작을 위해 높은 클럭 속도, 멀티 코어, 멀티 스레드를 지원하는 CPU를 만드는 것도 중요하다. 하지만, 코어와 하드웨어 스레

yjhdevelopdiary.tistory.com

※ 예시 이미지에서 볼 수 있듯이 위 파이프라이닝 기법은 한 클럭에 한 단계를 수행한다는 전제가 깔려있다.

 

하지만 명령어의 길이가 규격화되지 않은 CISC 경우에는 명령어 파이프라이닝의 장점을 최대한 활용하지 못하게 된다.

예로 명령어1의 해석(Decode) 시간이 1클럭일 때 명령어2는 다소 복잡한 명령어라서 해석 수행 시간이 3클럭이라면 수행해야하는 그 외 명령어들이 모두 지연이 된다.

예시

 

또 다른 단점으로는 복잡하고 다양한 명령어를 활용할 수 있다고는 했지만, 실제로 그러한 복잡한 기능을 사용할 일이 거의 없다는 것이다. 

 

[정리]

CISC는 가변 길이의 명령어를 활용함으로써 다양한 주소 접근 지정 방식을 이용해 비교적 적은 수의 명령어로 프로그램을 동작시킬 수 있어서 메모리 공간을 절약할 수 있지만, 대다수의 복잡한 명령어의 사용 빈도가 낮을 뿐더러 명령어가 규격화되어 있지 않아서 파이프라이닝이 어렵다. 

■ RISC

RISC (Reduced Instruction Set Computer)는 활자 그대로, CISC에 비해, 명령어의 종류가 적다.

CISC와 달리 짧고 규격화된 명령어로 되도록 1클럭 내외로 명령어를 수행하게끔 설계하는 방식이다.

그러므로 단순하고 적은 수의 고정 길이 명령어를 활용하기에 명령어 파이프라이닝에 최적화 되어있다.

 

단순하다는 것에 대한 예로 메모리 접근 관련 명령어를 load, store 두 개로 제한하고 최대한 레지스터를 적극적으로 활용한다는 점이 있다. 이러한 구조로 인해 'load-store 구조'라고 불리기도 한다.

 

이와 같이 적은 종류의 명령어 개수로 프로그램을 수행하다보니 프로그램을 이루는 명령어의 수가 CISC보다 훨씬 많다.

이는 맨 위에 x86-64, ARM 어셈블리어 비교 사진을 보면 알 수 있는 내용이다.

 

 

728x90