2. 명령어와 CPU 아키텍처 (Instructions and CPU Architectures)
명령어Instructions는 특정 마이크로프로세서가 인식하고, 기능을 수행할 수 있는 기계어 명령어의 집합을 말한다. 프로세서는 제조사, 목적 등에 따라 각기 다른 명령어 집합Instruction Set을 보유하고 있다. 우리가 사용하는 컴퓨터 프로그램은 각 프로세서에 대응하는 명령어의 집합(즉, 기계어)로 번역되어 실행되게 된다.
구식 컴퓨터뿐 아니라 현대의 컴퓨터들도 의외로 간결한 명령어 집합을 보유하고 있다.
명령어는 opcode와 operand로 구성되는데, opcode는 해당 명령어가 수행할 기능(store, load, add 등)을 나타내고, operand는 해당 명령을 수행하는데 필요한 데이터의 메모리 주소를 나타낸다.
명령어의 길이
메모리 반도체의 가격이 비쌌던 옛날에는, 코드 전체의 크기를 최소화하기 위해 명령어의 길이를 가변적Variable으로 정했다. 자주 사용되는 명령어는 짧은 길이를 할당하고, 자주 사용되지 않는 명령어에는 긴 길이를 할당하여, 코드의 전반적인 길이를 줄이는데 집중했다.
그러나, 메모리의 가격이 저렴해지고 실행 시간이 중요해짐에 따라 모든 명령어의 길이가 동일한 고정Fixed 명령어 길이를 사용하기 시작했다.
명령어 집합 구조의 작동 구조
명령어 집합으로 구성된 프로세서는 다음 과정의 반복을 통해 작동한다.
- Instruction Fetch
- 명령어를 메모리에서 가져온다.
- 가져온 명령어를 특수 register에 저장해 둔다.
- Instruction Decode
- 명령어가 어떤 기능을 수행할지 결정한다. = 명령어 내의 opcode 부분을 decode 한다.
- Operand Fetch
- 수행할 데이터를 메모리에서 가져온다.
- 가져온 데이터를 범용 register에 저장한다.
- Execute
- Decode된 명령 기능을 수행한다.
- 결과를 범용 register에 저장한다.
- Result Store(Write Back)
- 범용 register에 있는 결과를 메모리에 저장한다.
- Instruction Fetch (다음 명령어로 반복)
위 구조에서, 레지스터와 메모리간의 데이터 이동이 많은 것을 알 수 있다. 실제로 컴퓨터에서 실행되는 명령어의 30% 이상은 load 명령어와 store 명령어라고 한다. 때문에, 메모리와 프로세서간의 I/O 성능이 성능에 큰 영향을 미친다.
명령어 실행 파이프라인
짧은 시간에 많은 명령어를 처리하기 위해, 프로세서는 명령어 수행의 5단계를 파이프라인을 통해 동시에 수행한다.
즉, A 명령어의 Instruction Fetch 작업이 끝나면 A 명령어의 Instruction Decode 작업을 시작함과 동시에 B 명령어의 Instruction Fetch 작업을 시작한다. 이 과정이 끝나면 A 명령어는 Operand Fetch, B 명령어는 Instruction Decode 단계에 진입하며 또다시 바로 C 명령어의 Instruction Fetch를 시작한다.
이 방법을 통해, 한 명령어의 5단계가 끝나고 다음 명령어를 실행하는 것에 비해 이론상 5배 빠른 처리가 가능하다.
CPU 아키텍처의 발전
이렇듯 컴퓨터 구조는 실행 속도를 개선하는 방향으로 발전하였는데, 초창기에는 누산기 구조Accumulator Architectures라 부르는 방법이 적용되었다.
이후, 스택 구조가 도입되며 레지스터가 등장했고, 마침내 우리가 사용하는 고레벨 컴퓨터 구조, 범용 레지스터 구조General-Purpose Register가 등장하게 되었다.
CISC vs RISC
CISC와 RISC는 CPU 아키텍처의 일종으로, CISC는 복잡 명령어 집합 컴퓨터Complex Instruction Set Computer를 의미하고, RISC는 축소 명령어 집합 컴퓨터Reduced Instruction Set Computer를 의미한다.
CISC는 이름처럼 복잡한 명령어 집합을 갖는데, 덕분에 Load 명령어를 따로 실행하지 않고 한번에 데이터를 load하여 연산을 수행할 수 있다. (즉, a+b를 수행할 때, load와 add를 따로 수행할 필요없이, add만으로 해결가능하다.)
이러한 장점이 있지만, CISC는 가변 명령어 길이로 인해 각 명령어의 실행 속도가 상이하여, 파이프라인을 통한 병렬처리에 약하다는 큰 단점이 있다.
반면, RISC는 단순한 고정 길이 명령어들로 구성되어 파이프라인 처리에 용이하다는 장점이 있으며, 복잡한 연산을 단순한 연산의 조합으로 처리하므로 CISC에서 처리 가능한 연산을 모두 수행할 수 있다.
RISC는 메모리 접근을 Load/Store의 두 명령어로 제한하여, 다른 연산에서 불필요한 메모리 접근으로 인한 속도 저하를 막았다는 특징도 있다.
결과적으로, 현대에 들어 CPU 아키텍처는 대부분 RISC 구조를 채택하게 되었다.
C언어에서 명령어로
아래의 C 코드를 실행하는 경우를 가정해보자.
sum = a + b;
먼저, C언어 코드는 다음과 같은 어셈블리어로 컴파일된다.
lw $1, 100($5) # $5(메모리)이 100번째 주소에 있는 값을 레지스터 $1로 이동
lw $2, 104($5) # 메모리의 104번째 주소에 있는 값을 레지스터 $2로 이동
add $3, $1, $2 # $1, $2를 더한 값을 $3에 저장
sw $3, 108($5) # $3의 값을 메모리 108번 주소에 저장
이 코드는 최종적으로 기계어 명령어로 변환된다. 아래 명령어 집합에서 1번은 load, 2번은 add, 3번은 store에 대응된다고 보면 된다.
# 1번 명령어 , 1번 주소, 5번 주소 + 100
0001 0001 0101 0110 0100
# 1번 명령어 , 2번 주소, 5번 주소 + 104
0001 0010 0101 0110 0110
# 2번 명령어, 1번 주소, 2번 주소, 3번 주소
0010 0001 0010 0011
# 3번 명령어, 3번 주소, 5번 주소 + 108
0011 0011 0101 0110 1000
'학부 수업 > 컴퓨터구조' 카테고리의 다른 글
5.5 프로그램의 실행 과정 (0) | 2020.10.12 |
---|---|
5. 메모리 접근 (Addressing) (0) | 2020.10.12 |
4. MIPS의 명령어 구조와 명령어들 (0) | 2020.10.12 |
3. MIPS 아키텍처 (0) | 2020.10.12 |
1. 프로세서의 응답시간, 클럭, 수율 (Latency, Clock Frequency, Yield of Processor) (0) | 2020.09.20 |
댓글
이 글 공유하기
다른 글
-
5. 메모리 접근 (Addressing)
5. 메모리 접근 (Addressing)
2020.10.12 -
4. MIPS의 명령어 구조와 명령어들
4. MIPS의 명령어 구조와 명령어들
2020.10.12 -
3. MIPS 아키텍처
3. MIPS 아키텍처
2020.10.12 -
1. 프로세서의 응답시간, 클럭, 수율 (Latency, Clock Frequency, Yield of Processor)
1. 프로세서의 응답시간, 클럭, 수율 (Latency, Clock Frequency, Yield of Processor)
2020.09.20