이 글은 혼자 공부하는 컴퓨터 구조+운영체제 교재와 강의를 참고하여 정리한 글입니다. 오타나, 잘못된 내용이 있으면 언제든지 알려주세요! 감사합니다.😊
CPU의 성능 향상 기법
빠른 CPU를 위한 설계 기법
클럭
더 빠른 CPU를 설계하기 위해서는 어떻게 설계해야 할까?
- 컴퓨터 부품들은 '클럭 신호'에 맞춰 일사불란하게 움직인다.
- CPU는 '명령어 사이클'이라는 정해지 흐름에 맞춰 명령어들을 실행한다.
클럭 신호가 빠르게 반복되면 CPU를 비롯한 컴퓨터 부품들이 그만큼 빠른 박자에 맞춰 움직이지 않을까?
꼭 그렇지는 아니지만 일반적으로는 그렇다. 따라서 클럭 속도는 CPU 속도 단위로 간주되기도 한다.
즉, 클럭 속도가 높은 CPU는 빠르게 동작한다.
클럭 속도
- 헤르츠(Hz) 단위로 측정한다.
- 헤르츠(Hz)는 1초에 클럭이 반복되는 횟수이다.
- 예시) 클럭이 '똑-딱'하고 1초에 한번 반복되면 1Hz, 클럭이 1초에 100번 반복되면 100Hz이다.
- 1초에 클럭이 기본적으로 25억 번, 순간적으로 최대 49억 번 반복된다는 뜻이다.
- CPU는 계속 일정한 클럭속도를 유지하지 않는다. 고성능을 요구할때는 순간적으로 클럭 속도를 높이고, 그렇지 않을 때는 유연하게 클럭 속도를 낮추기도 한다.
- 오버클럭킹: 최대 클럭 속도를 강제로 더 끌어올릴 수 있는 기법
참고: 1 GHz는 109Hz이다.
그럼 클럭 속도를 엄청나게 높이면 무조건 CPU가 빨라질까? 그렇지는 않다.
필요 이상으로 클럭을 높이면 발열 문제가 더 심각해진다.
클럭 속도를 높이는 방법 외에 CPU의 성능을 높이는 방법에는 어떠한 것들이 있을까?
크게 두 가지 방법이 있다.
- 코어 수를 늘리는 방법
- 예) 듀얼 코어, 멀티 코어
- 스레드 수를 늘리는 방법
- 예) 멀티 스레드
코어와 멀티 코어
코어
- 코어를 이해하려면 현대적인 관점에서 CPU라는 용어를 재해석해야 한다.
- CPU는 '명령어를 실행하는 부품'이다.
- 전통적인 관점에서 '명령어를 실행하는 부품'은 컴퓨터 내부에 원칙적으로 하나만 존재했다.
- 하지만 기술적 발전으로 인해 오늘날 CPU에는 '명령어를 실행하는 부품'이 여러 개 존재한다
- '명령어를 실행하는 부품'은 오늘날 코어라는 용어로 사용된다.
- 코어란 CPU 내에서 '명령어를 실행하는 부품'으로 여러 개 있을 수 있다.
- 즉, CPU는 '명령어를 실행하는 부품'에서 '명령어를 실행하는 부품을 여러 개 포함하는 부품'으로 명칭의 범위가 확장되었다.
- 전통적인 CPU에는 코어가 1개밖에 없었고, 단일한 코어가 곧 CPU였던 것이다.
멀티 코어
- 코어를 여러 개 포함하고 있는 CPU를 멀티 코어 CPU 또는 멀티코어 프로세서라고 부른다.
- CPU 내에 명령어를 처리하는 일꾼이 여러 명 있다고 생각하면 된다.
그럼 코어를 두 개, 세 개, 100개로 늘리면 연산 처리 속도도 그에 비례하여 빨라질까?
그렇지는 않다. CPU의 연산 속도가 꼭 코어 수에 비례하여 증가하지는 않는다. 예시) 조별과제 ㅋㅋ
중요한 것은 코어마다 처리할 명령어들을 얼마나 적절하게 분배하냐이다. 이에 따라서 연산 속도는 크게 달라진다.
스레드와 멀티 스레드
- 스레드는 '실행 흐름의 단위'이다.
- CPU에서 사용되는 스레드와 프로그래밍에서 사용되는 스레드는 용례가 다르기 때문에 명확하게 정리해야 한다.
- 스레드는 CPU에 사용되는 하드웨어적 스레드와 프로그램에서 사용되는 소프트웨어적 스레드가 있다.
- 하드웨어적 스레드
- 소프트웨어적 스레드
하드웨어적 스레드
- 하드웨어적 스레드는 '하나의 코어가 동시에 처리하는 명령어 단위'를 의미한다.
- 하나의 코어가 한 번에 하나씩 명령어를 실행한다.
- 즉, 명령어를 실행하는 부품이 하나 있고, 한 번에 하나씩 명령어를 실행하는 CPU
- 전통적인 CPU
- 여러 스레드를 지원하는 CPU는 하나의 코어로도 여러 개의 명령어를 동시에 실행할 수 있다.
- 예시)
- CPU 내부에 코어가, 명령어를 실행하는 부품이 2개가 있다. -> 2 코어
- 각각의 코어가 두 개씩의 명령어를 동시에 실행할 수 있다. -> 4 스레드
- 하나의 코어로 여러 명령어를 동시에 처리하는 CPU를 멀티스레드 프로세서 또는 멀티스레드 CPU라고 한다.
- 즉, 멀티스레드 프로세서는 여러 개의 하드웨어적 스레드를 지원하는 CPU를 말한다.
실제 CPU의 코어와 스레드를 보자.
- 명령어를 실행하는 부품을 8개 포함하고, 한 번에 16개의 명령어를 처리할 수 있는 CPU를 의미한다.
- 코어 하나당 두 개의 하드웨어 스레드를 처리한다고 볼 수 있다.
참고: 하이퍼스레딩은 인텔의 멀티스레드 기술을 의미한다.
소프트웨어적 스레드
- 소프트웨어적 스레드는 '하나의 프로그램에서 독립적으로 실행되는 단위'를 의미한다.
- 싱글스레드로 실행하면, 한 프로그램이 하나의 실행흐름을 따라 순차적으로 실행된다.
- 멀티스레드로 실행하면, 한 프로그램이 두 개 이상의 영역이 동시에 실행된다.
워드 프로세서 프로그램을 개발한다고 가정하자. 아래 기능들이 동시에 수행되기를 원한다.
- 사용자로부터 입력받은 내용을 화면에 보여 주는 기능
- 사용자가 입력한 내용이 맞춤법에 맞는지 검사하는 기능
- 사용자가 입력한 내용을 수시로 저장하는 기능
어떻게 하면 될까? 이 기능들을 작동시키는 코드를 각각의 스레드로 만들어 동시에 실행하면 된다.
즉, 소프트웨어 스레드를 3개 만들어서 실행하면 3개의 실행 흐름이 만들어지고, 동시에 실행된다.
주의!: 한 번에 하나씩 명령어를 처리하는 1 코어 1 스레드 CPU도 여러 소프트웨어적 스레드를 만들 수 있다.
CPU는 내부적으로 여러 개의 프로그램이나 스레드를 실행할 때 엄청나게 빠르게 번갈아가며 실행하기 때문에 우리의 눈에는 동시에 실행되는 것처럼 보인다.
즉, 1 코어 1 스레드 CPU로도 프로그램의 여러 부분을 동시에 실행할 수 있다.
멀티 스레드 프로세서
- 하드웨어 스레드는 하나의 코어가 동시에 처리하는 명령어 단위라고 했다.
- 멀티스레드 프로세서를 실제로 설계하는 것은 매우 복잡하지만, 가장 큰 핵심은 레지스터이다.
- 하나의 코어로 여러 명령어를 동시에 처리하도록 만들려면 프로그램 카운터, 스택 포인터, 메모리 버퍼 레지스터, 메모리 주소 레지스터와 같이 하나의 명령어를 처리하기 위한 꼭 필요한 레지스터들을 여러 개 갖고 있으면 된다.
- 즉, 하나의 코어 내부에 레지스터 세트가 여러개 있으면 하나의 코어가 여러 명령어를 동시에 처리할 수 있다.
- 예시 1) 하나의 코어에 프로그램 카운터가 두 개 있다면 '메모리에서 가져올 명령어 주소'를 두 개 지정할 수 있다.
- 예시 2) 하나의 코어에 스택 포인터가 두 개 있다면 두 개의 스택을 관리할 수 있다.
- 하드웨어 스레드를 이용해 하나의 코어로도 여러 명령어를 동시에 처리할 수 있다.
- 하지만 메모리 속 프로그램 입장에서 봤을 때 하드웨어 스레드는 '한 번에 하나의 명령어를 처리하는 CPU나 다름없다.
- 즉 메모리 입장에서는 CPU가 몇 코어 몇 스레드인지는 알 수가 없다. 그저 작업 흐름이 몇 개 있는지 알 뿐이다.
- 프로그램은 한 번에 하나의 명령어를 처리하는 CPU가 네 개 있는 것처럼 보인다.(하드웨어 스레드 개수만큼)
- 따라서 하드웨어 스레드를 논리 프로세서라고 부르기도 한다.
- 실제 CPU 속 명령어를 처리하는 부품인 코어는 4개이지만, 메모리 속 프로그램이 보기에는 한 번에 하나의 명령어를 처리하는 부품이 마치 8개가 있는 것처럼 생각한다.
명령어 병렬 처리 기법
CPU가 놀지 않고 시간을 효율적으로 쓰며 작동하게 만드는 것도 중요하다.
명령어를 동시에 처리하여 CPU를 한시도 쉬지 않고 작동시키는 기법인 명령어 병렬 처리 기법에 대해 알아보자.
대표적인 명령어 병렬 처리 기법들은 다음과 같다.
- 명령어 파이프라인
- 슈퍼스칼라
- 비순차적 명령어 처리
명령어 파이프라인
하나의 명령어가 처리되는 전체 과정을 비슷한 시간 간격으로 나누어보자.
명령어 처리 과정을 클럭 단위로 나누어 보면 4개의 단계로 다음과 같이 나눌 수 있다.
- 명령어 인출(Instruction Fetch): 명령어를 메모리부터 가져온다.
- 명령어 해석(Instruction Decode): 가져온 명령어를 해석한다
- 명령어 실행(Execute Instruction): 해석한 명령어를 실행한다.
- 결과 저장(Write Back): 필요하면 결괏값을 메모리에 저장한다.
참고: 인출 -> 실행으로 나누거나, 명령어 해석 -> 명령어 실행 -> 명령어 접근 -> 결과 저장으로 나누기도 한다.
- 중요한 점은 같은 단계가 겹치지 않는다면 CPU는 '각 단계를 동시에 실행할 수 있다'는 것이다.
- 예시 1) t1 시간 동안 하나의 CPU가 명령어를 해석하는 동안 또 다른 명령어를 동시에 가져올 수 있다.
- 예시 2) t2 시간 동안 하나의 CPU가 명령어를 실행하고, 다른 명령어를 해석하고, 또 다른 명령어를 동시에 가져올 수 있다.
- 명령어를 겹쳐서 병렬로 수행하면 훨씬 더 효율적으로 처리할 수 있다.
- 이처럼 마치 공장 생산 라인과 같이 명령어들을 명령어 파이프라인에 넣고 동시에 여러 개의 명령어를 겹쳐 실행, 처리하는 기법을 명령어 파이프라이닝이라고 한다.
- 정말 중요한 기법!
만약 파이프라인을 사용하지 않으면 명령어들을 어떻게 처리할까??
모든 명령어들을 순차적으로 처리해야 하기 때문에 파이프라인을 이용하는 것보다 훨씬 비효율적이다.
파이프라이닝이 항상 높은 성능을 가져올까? 그렇지 않다.
특정 상황에서는 성능 향상에 실패하는 경우도 있다.
즉, 여러 개의 명령어를 겹쳐 실행하는 과정이 제대로 동작하지 않는 상황을 파이프라인 위험(pipeline hazard)이라고 한다.
파이프라인 위험에는 크게 3가지가 있다.
- 데이터 위험
- 제어 위험
- 구조적 위험
데이터 위험
- 데이터 위험은 명령어 간 '데이터 의존성'에 의해 발생한다.
- 모든 명령어를 동시에 처리할 수 없다. 어떤 명령어는 이전 명령어를 끝까지 실행해야만 비로소 실행할 수 있는 경우가 있다.
- 위의 경우 명령어 1을 해석하는 동안에 명령어 2를 인출할 수 없다. 즉, 명령어 1을 수행해야만 명령어 2를 수행할 수 있다.
- 왜냐하면 R1에 R2 + R3 결괏값이 저장되어야만 명령어 2를 수행할 수 있기 때문이다. R1 값이 결정되어야만 한다.
- 따라서 명령어 2는 명령어 1의 데이터에 의존적이다.
제어 위험
- 제어 위험은 주로 분기 등으로 인한 '프로그램 카운터의 갑작스러운 변화'에 의해 발생한다.
- 프로그램 카운터는 '현재 실행 중인 명령어의 다음 주소'로 갱신된다. 즉, 프로그램 카운터가 갑작스럽게 특정 메모리 주소로 바뀌는 경우가 있다.
- 예시) JUMP, CALL, INTERRUPT
- 기본적으로 명령어들을 순차적으로 겹쳐서 실행한다. 예시) 10번지 -> 11번지 -> 12번지
- 근데 여기서 프로그램 카운터가 갑작스럽게 특정 메모리 주소로 바뀐다면?
- JUMP 60 명령어를 실행하면 60번지로 실행의 흐름이 바뀌게 된다. 프로그램 카운터도 60번지로 업데이트된다.
- 11번지 명령어에서의 인출, 해석과 12번지 명령어의 인출이 헛수고가 되어버린다. 60번지 명령어를 실행해야 하기 때문이다.
- 이처럼 프로그램 카운터가 갑작스러운 변화되는 상황에서 파이프라이닝이 성능 향상에 실패하는 문제를 제어 위험이라 한다.
- 이를 방지하기 위해 사용하는 기술 중 하나가 분기 예측(branch prediction)이다.
- 분기 예측은 프로그램이 어디로 분기할지 미리 예측한 후 그 주소를 인출하는 기술이다.
구조적 위험
- 구조적 위험은 명령어들을 겹쳐 실행하는 과정에서 서로 다른 명령어가 동시에 ALU, 레지스터 등과 같은 CPU 부품을 사용하려고 할 때 발생한다.
- 구조적 위험은 자원 위험(resource hazard)이라고도 부른다.
슈퍼스칼라
- 슈퍼스칼라는 CPU 내부에 여러 개의 명령어 파이프라인을 포함한 구조를 말한다.
- 오늘날 대부분의 CPU에서는 여러 개의 파이프라인을 이용한다.
- 슈퍼스칼라 구조로 명령어 처리가 가능한 CPU를 슈퍼스칼라 프로세서 또는 슈퍼스칼라 CPU라고 한다.
- 슈퍼스칼라 프로세서는 매 클럭 주기마다 여러 명령어를 인출, 해석, 실행, 저장할 수 있다.
- 멀티스레드 프로세서는 슈퍼스칼라 구조를 사용할 수 있다.
이론적으로는 슈퍼스칼라 프로세서는 파이프라인 개수에 비례하여 프로그램 처리 속도가 빨라진다.
하지만 파이프라인 위험도의 증가로 인해 반드시 파이프라인 개수에 비례하여 처리 속도가 증가하지는 않는다.
따라서 슈퍼스칼라 방식을 차용한 CPU는 파이프라인 위험을 방지하기 위해 고도로 잘 설계되어야 한다.
비순차적 명령어 처리(OoOE: Out-of-order execution)
- 비순차적 명령어 처리는 파이프라인의 중단을 방지하기 위해 명령어를 순차적으로 처리하지 않는 기법이다.
- 오늘날 CPU 성능 향상에 크게 기여한 기법이자 대부분의 CPU가 차용하는 기법이다.
파이프라이닝, 슈퍼스칼라 기법은 모두 명령어를 순차적으로 처리하는 방식이다.
하지만 파이프라인 위험과 같은 예상치 못한 문제들로 인해 명령어는 곧바로 처리되지 못하기도 한다.
즉, 모든 명령어를 순차적으로만 처리한다면 예상치 못한 상황에서 명령어 파이프라인은 멈춰버리게 된다.
다음 예시를 확인해 보자
위 명령어들을 순차적으로 처리한다면 겹쳐서 실행할 수가 없다. 왜 그럴까?
3번 명령어를 실행하기 위해서는 M(100)과 M(101) 값이 결정되어야 하기 때문에 1번과 2번 명령어 실행이 끝날 때까지 기다려야 하기 때문이다. 즉 이상적으로 겹쳐 실행할 수 없게 된다.
여기서 만약 서로 데이터 의존성이 없는 명령어의 순서를 바꾼다면 어떻게 될까?
3번 명령어를 맨 뒤로 보내보자.
명령어 3번은 뒤의 명령어와 순서를 바꾸어 실행해도 크게 문제 될 것이 없다.
순차적으로 명령어를 처리할 때보다 더 효율적인 것을 알 수 있다.
이렇게 명령어를 순차적으로만 실행하지 않고 순서를 바꿔 실행해도 무방한 명령어를 먼저 실행하여 명령어 파이프라인이 멈추는 것을 방지하는 기법이 비순차적 명령어 처리 기법이다.
하지만 아무 명령어나 순서를 바꿔서 수행할 수는 없다.
다음 예시를 보자
- 1번 명령어와 3번 명령어의 순서를 바꿀 수 없다.
- 왜냐하면 3번 명령어를 실행하기 위해서는 반드시 M(100) 값이 결정되어야 하기 때문이다.
- 1번 명령어와 4번 명령어의 순서를 바꿀 수 없다.
- 왜냐하면 1번 명령어와 2번 명령어를 토대로 3번 명령어가 수행되고, 3번 명령어를 토대로 4번 명령어가 수행되기 때문이다.
4번 명령어와 5번 명령어의 순서는 바꾸어 실행할 수 있다.
왜냐하면 두 명령어는 어떤 의존성도 없기 때문이다. 즉, 순서를 바꾸어도 전체 프로그램의 실행 흐름에 영향이 없다.
참고: 비순차적 명령어 처리 기법을 지원하는 CPU는 명령어 간의 순서를 바꿔도 되는지의 여부를 알아서 판단해 준다.
즉, 이러한 CPU들은 명령어들이 어떤 명령어와 데이터 의존성을 갖고 있는지, 순서를 바꿔 실행할 수 있는 명령어에는 어떤 것들이 있는지 판단할 수 있어야 하는 것이다.
메모리 집합 구조, CISC와 RISC
명령어 파이프라이닝과 슈퍼스칼라 기법을 CPU에 적용하려면 명령어가 파이프라이닝에 최적화되어 있어야 한다.
명령어가 어떻게 생겨야 명령어 파이프라이닝에 유리할까?
명령어 집합
CPU는 명령어를 실행한다고 했었다. 근데 이 세상 모든 CPU들이 똑같이 생긴 명령어를 실행할까? 그렇지는 않다.
CPU 제조사별로 만드는 CPU가 다르고, 같은 제조사에서 만든 CPU여도 명령어의 세세한 생김새, 연산, 주소 지정 방식 등은 CPU마다 다르다.
CPU가 이해할 수 있는 명령어들의 모음을 명령어 집합 또는 명령어 집합 구조(ISA, Instruction Set Architecture)라 한다.
- x86과 ARM은 다른 ISA, 명령어 집합 구조이기 때문에 인텔 CPU를 사용하는 컴퓨터와 아이폰은 서로의 명령어를 이해할 수 없다.
- 실행 파일은 명령어로 이루어져 있고, 서로의 컴퓨터가 이해할 수 있는 명령어가 다르기 때문이다.
- 즉 CPU는 명령어 집합에 속해있는 명령어들만 이해할 수 있다.
참고: x86은 32bit용, x86-64는 64비트용 x86 ISA이다.
ISA가 다르다는 것은 CPU가 이해할 수 있는 명령어가 다르다는 뜻이다. 명령어가 달라지면 어셈블리어도 달라진다.
즉, 같은 소스 코드로 만들어진 프로그램이어도 ISA가 다르다면, CPU가 이해할 수 있는 명령어, 어셈블리어도 달라진다.
이러한 점에서 명령어 집합 구조, ISA는 CPU의 언어인 셈이다.
CPU가 이해하는 명령어들이 달라지면 명령어의 생김새만 달라지는 것이 아니고 나비효과로 많은 것들이 달라진다.
제어장치가 명령어를 해석하는 방식, 사용되는 레지스터의 종류와 개수, 파이프라이닝의 용이성 등 많은 것이 달라진다.
이는 곧 CPU 하드웨어 설계에도 큰 영향을 미치게 된다.
- 우리가 실행하는 프로그램은 명령어로 이루어져 있다.
- ISA는 CPU의 언어이자 하드웨어가 소프트웨어를 어떻게 이해할지에 대한 약속이다.
명령어 병렬 처리 기법들을 적용하기에 용이한 ISA가 있고, 그렇지 않은 ISA가 있다.
명령어 병렬 처리 기법들을 도입하기 유리한 ISA는 뭘까?
CISC(Complex Instruction Set Computer)
- CISC는 복잡하고 다양한 수의 가변 길이 명령어 집합을 활용하는 컴퓨터(CPU)를 의미한다.
- x86, x86-64는 대표적인 CISC 기반의 ISA이다.
- CISC는 다양하고 강력한 기능의 명령어 집합을 활용하기 때문에 명령어의 형태와 크기가 다양한 가변 길이 명령어를 활용한다.
- 다양하고 강력한 명령어 집합을 활용한다는 것은 어떤 의미일까?
- 상대적으로 적은 수의 명령어로도 프로그램을 실행할 수 있다는 뜻이다.
- 예시) x86-64 코드 길이가 ARM보다 짧은 것을 확인할 수 있다.
- 메모리에 접근하는 주소 지정 방식도 다양해서 아주 특별한 상황에서만 사용되는 독특한 주소 지정 방식들도 있다.
참고: 프로그램을 실행하는 명령어 수가 적다는 말은 '컴파일된 프로그램의 크기가 작다'는 것을 의미한다.
같은 소스 코드를 컴파일해도 CPU마다 생성되는 실행 파일의 크기가 다를 수 있다는 뜻이다.
이러한 특징을 갖고 있는 CISC는 메모리를 최대한 아끼며 개발해야 했던 시절에 인기가 높았다.
왜냐하면 '적은 수만의 명령어만으로도 프로그램을 동작시킬 수 있다'라는 것은 메모리 공간을 절약할 수 있다는 장점이 있기 때문이다.
하지만 CISC에는 치명적인 단점이 존재한다.
활용하는 명령어가 워낙 복잡하고 다양한 기능을 제공하는 탓에 명령어의 크기와 실행되기까지의 시간이 일정하지 않다.
그리고 복잡한 명령어 때문에 명령어 하나를 실행하는 데에 여러 클럭 주기를 필요로 한다.
이러한 이유 때문에 명령어 파이프라이닝이 불리하다는 치명적인 단점이 있다.
명령어 파이프라인을 위한 이상적인 명령어는 다음과 같다.
각 단계에 소요되는 시간이 동일해야 한다. (가급적 1 클럭 주기로)
하지만 CISC가 활용하는 명령어는 명령어 수행 시간이 길고 가지각색이다.
따라서, 파이프라인이 효율적으로 명령어를 처리할 수가 없다.
명령어 파이프라인이 제대로 동작하지 않는다는 것은 현대 CPU에서 아주 치명적인 약점이다.
그리고 CISC가 복잡하고 다양한 명령어를 활용할 수 있다고 했지만, 대다수의 복잡한 명령어는 사용 빈도가 낮다.
즉, 실제로는 자주 사용되는 명령어만 쓰였다는 것이다.
이러한 이유들로 CISC 기반 CPU는 성장에 한계가 있다.
이러한 CISC의 한계를 통해 우리는 다음과 같은 원칙들을 지켜야 한다.
- 원활한 파이프라이닝을 위해 '명령어 길이와 수행 시간이 짧고 규격화'되어 있어야 한다.
- 복잡한 기능을 지원하는 명령어를 추가하기보다 '자주 쓰이는 기본적인 명령어를 작고 빠르게 만드는 것'이 중요하다.
이러한 원칙 하에 등장한 것이 RISC이다.
RISC(Reduced Instruction Set Computer)
- RISC는 단순하고 적은 수의 고정길이 명령어 집합을 활용한다.
- CISC에 비해 명령어의 종류가 적고, 짧고 규격화된 명령어, 되도록 1 클럭 내외로 실행되는 명령어를 지향한다.
- 이처럼 짧고 규격화된 명령어를 활용하는 RISC는 명령어 파이프라이닝에 유리하다.
- RISC는 메모리 접근을 단순화하고 최소화를 추구한다.
- 메모리에 직접 접근하는 명령어를 load, store 두 개로 제한
- 이런 점에서 RISC를 load-store 구조로 부르기도 한다.
- 레지스터를 적극적으로 활용한다.
- CISC보다 레지스터를 이용하는 연산이 많고, 일반적으로 범용 레지스터 개수도 더 많다.
- 다만 CISC보다 사용가능한 명령어 종류가 적기에, 더 많은 명령어로 프로그램을 동작시킨다.
- ARM은 RISC 기반의 대표적인 ISA이다.
- 예시) x86-64보다 더 많은 명령어로 동일한 프로그램을 실행한다.
'Computer Science > 컴퓨터 구조' 카테고리의 다른 글
[컴퓨터 구조] 보조기억장치 (0) | 2023.04.21 |
---|---|
[컴퓨터 구조] 메모리와 캐시 메모리 (1) | 2023.04.14 |
[컴퓨터 구조] CPU의 작동 원리 (0) | 2023.04.06 |
[컴퓨터 구조] 명령어 (1) | 2023.04.02 |
[컴퓨터 구조] 0과 1로 데이터를 표현하는 방법 (0) | 2023.03.31 |