+ 한국항공대학교 길현영 교수님의 컴퓨터구조론 과목 내용을 정리한 글입니다.
명령어 집합 구조 (ISA, Instruction Set Architecture)
좁은 의미에서 컴퓨터 구조 = 명령어 집합 구조 (ISA)
어떤 프로그램과 그 프로그램을 수행할 컴퓨터 하드웨어 사이의 인터페이스에 대한 완전한 정의 혹은 명세
- 명령어는 CPU 등 컴퓨터 하드웨어에서 인식되거나 실행될 수 있는 기계 명령어이다.
Machine Code - 기계어: The byte-level programs that a processor excutes => 프로세서에서 실행되는 2진 코드 (2진 코드)
Assembly Code - 어셈블리어: A text representation of machine code
=> 컴퓨터 하드웨어가 이해할 수 있는 기계어를 사람이 기억하고 사용할 수 있도록 만든 컴퓨터 언어
ex) 00100101 == ADD
- 기계어 1개와 어셈블리어 1개는 1대1로 매칭된다.
명령어 집합 구조는 "특정 CPU를 위해 정의된 명령어들의 모음"이다.
=> 회사마다 다르다!
Instruction Set Architecture as an ADT
Abstract Data Type (= object) : A set of values (state) and associateed operations that are precisely specified independent of any particular implementation (ex. Stack, Queue)
=> 상태와 상태를 변화시키는 명령어들의 집합이다.
명령어의 특성: 형태를 결정하는 요인
비유) CPU라는 기계는 주메모리에서 명령어를 받아와서 그 명령어를 실행한다.
- 다양한 종류의 명령어들을 "기계"는 어떻게 인식할 수 있을까?
- 일단, 형태적 요소(모습)를 갖고 1차원적으로 분류한다.
=> 명령어 특성에 맞는 형태(서식) 정의가 먼저 필요하다.
- 명령어 안에 담겨야 할 내용들은 무엇인가?
- 명령어 자체는 얼마만큼의 크기로 표현될 것인가?
- 그 내용들을 어떻게 나눠 배정할까? (범위, 개수 등)
명령어의 특성: 피연산자 수
(산술연산) 명령어 기본 형식 : z = f(x, y)
- f: 명령어 (연산 부호, opcode)
- x, y, z: 피연산자(operand)로서, 데이터 위치(레지스터 - cpu 내 메모리 주소 / 메모리 주소 - 메인 메모리 주소)나 값 자체를 포함하여, 주소 필드(address field)라고도 부른다.
< 피연산자 개수에 따른 명령어 종류 >
1. 피연산자가 없는 경우
halt: 프로그램 정지
add: 스택에 저장된 피연산자 2개를 꺼내서 합을 다시 스택에 저장
=> 명령어가 짧다 -> CPU가 할 일이 적다.
2. 단항 피연산자
not r1: True, False 전환
add r1: 특정 레지스터에 r1을 더해서 저장
2. 이항 피연산자
add r1, r2
4. 삼항 피연산자
add r1, r2, r3: r2와 r3 값을 더해서 r1에 할당
5. 다항 피연산자
madd r1, r2, r3, r4 .. : 더 많은 값을 더해서 r1에 할당 (multi)
=> 명령어가 길다 -> CPU가 할 일이 많다.
명령어의 특성: 명령어 길이
고정 길이 명령어
=> 명령어의 종류나 명령어에 포함된 구성요소에 관계없이 명령어의 길이가 모두 일정하다.
- 장점: 명령어 해독의 용이성 등으로 프로세서 하드웨어 디자인이 쉽다. (어디서 어디까지 명령어인지 쉽게 알수 있다.)
- 단점: 짧은 길이의 명령어도 긴 명령어와 동일한 길이여서 프로그램의 크기가 증가한다. => 메모리 낭비
=> 즉, 더 단순하다
가변 길이 명령어
=> 명령어의 종류나 명령어에 포함된 구성요소에 따라 다양한 길이의 명령어를 사용할 수 있다.
- 장점: 명령어의 길이 최적화로 프로그램의 크기가 감소하고 (불필요하게 사용되는 메모리가 없다.) 컴퓨터/연산 특성을 사용하는 명령어를 사용할 수 있다.
- 단점: 프로세서 하드웨어 디자인이 어렵다.
=> 즉, 더 똑똑해야 한다.
비유) 동일한 택배 상자 vs 내용물에 딱 맞는 크기의 택배 상자
=> 기계는 동일한 택배 상자를 처리하기가 더 편하다. (상황 고려 X)
=> 딱 맞는 크기의 택배 상자는 불필요한 종이와 공간을 줄일 수 있다. 쌓기(처리하기) 어렵다.
명령어의 특성: 각 필드 길이
Opcode 길이 (연산 부호 길이)
=> 연산의 개수를 결정한다.
ex) 4bit => 2^4 = 16가지 연산을 정의할 수 있다. (0000 ~ 1111)
- 명령어의 길이가 고정되어 있다면, Opcode 길이를 늘리면 다른 길이를 감소해야 할 수 있다.
Operand 길이 (메모리 주소 길이)
=> 오퍼랜드의 범위를 결정한다. (오퍼랜드의 종류에 따라 범위가 다르다.)
- 데이터: 표현 가능한 수의 범위 결정
- 기억 장치 주소: 메모리 entry 개수 결정
- 레지스터 번호: 레지스터의 개수 결정
ex) 4bit => 0 ~ 2^4 - 1까지의 주소 값을 갖을 수 있다.
명령어 집합 설계 시 고려사항
- 하드웨어 기술, 컴퓨터 구성, 프로그래밍 언어, 컴파일러 기술, 플랫폼이 될 운영체제 등 모두 고려해야한다.
1. 명령어 형식
- 명령어 구성을 나타내는 양식으로, 연산의 종류를 나타내는 연산코드(opcode), 연산 종류에 따른 피연산자 수와 길이, 종류 등을 나타낸다.
2. 연산의 종류
- 명령어가 프로세서에서 수행할 수 있는 일의 종류이다.
ex) 전송 연산, 처리 연산, 제어 연산, 입출력 연산 등
3. 피연산자(operand) 형식
- 명령어가 처리할 피연산자 데이터에 대한 정보이다.
ex) 연산을 수행할 데이터들의 형태(가능한 데이터 종류와 값), 데이터를 저장하는 방식(데이터의 길이, 수의 표현 방식) 등
4. 피연산자를 위한 주소지정방식
- 피연산자는 명령어 내부나 레지스터, 메모리 등 다양한 위치에 있을 수 있으므로, 주소 정보를 나타내는 방식에 대한 정보 명시가 필요하다.
CPU가 수행하는 일
명령어 인출과 해독 (Instruction Fetch & Decode)
- 기억 장치로부터 명령어를 읽어오고, 읽어온 명령어가 무엇인지 해독한다.
(어디까지가 opcode이고, operand인지)
=> 모든 명령어들에 대해 항상 공통적으로 수행한다.
데이터 인출 (Data Fetch, Load)
- 기억장치나 I/O 장치에서 데이터를 읽어온다. (= 읽기, read)
데이터 처리 (Data Process)
- 산술적 혹은 논리적 연산을 수행한다.
데이터 저장 (Data Store)
- 수행한 결과를 저장한다. (= 쓰기, write)
=> 인출, 처리, 저장 등은 명령어 종류에 따라 선택적으로 수행된다. (어떤 명령어를 가져오는지)
CPU의 기본 구성 (폰 노이만 모델)
1. ALU: 각종 산술/논리 연산들을 수행하는 회로들로 이루어진 HW 모듈
ex) +, -, ×, ÷, AND, OR, NOT, XOR 등
=> 누산기 사용
2. 레지스터 (register): CPU 안의 엑세스 속도가 가장 빠른 기억장치
- CPU 내부에 둘 수 있는 레지스터의 수는 제한적이다.
2 - 1. 프로그램 카운터 (Program Counter, PC)
- 다음에 인출할 명령어의 주소를 보관한다.
- 각 명령어가 인출된 후에는 자동적으로 일정 크기(한 명령어 길이)만큼 증가한다.
- 분기(branch) 명령어가 실행되는 경우에는 목적지 주소로 갱신한다.
2 - 2. 명령어 레지스터 (Instruction R, IR)
- 가장 최근 인출된 명령어를 보관한다.
2 - 3. 누산기 (Accumlator, ACC)
- 데이터를 일시적으로 보관한다. (계산 과정의 중간 값을 보관)
2 - 4. 기억장치 주소 레지스터 (Memory Address R , MAR)
- CPU가 접근하려는 메모리 주소를 보관한다.
- 기억장치에 있는 데이터 주소값을 일시적으로 저장한다.
ex) PC에 저장된 명령어 주소를 시스템 주소 버스로 출력되기 전에 일시적으로 저장한다.
2 - 5. 기억장치 버퍼 레지스터 (Memory Buffer R, MBR)
- CPU가 메모리에서 읽거나 저장할 때 데이터 자체를 보관한다.
- 기억장치에 쓰여질 데이터 혹은 기억장치로부터 읽혀진 데이터를 일시적으로 저장한다.
+ 대부분의 시스템에서 레지스터의 크기는 CPU가 한 번에 처리할 수 있는 데이터 비트 수(word 길이)와 동일하다.
ex) 64bit 컴퓨터 => CPU안의 레지스터의 크기: 64bit = CPU가 한 번에 처리할 수 있는 데이터: 64bit
3. 제어장치: 프로그램 코드(명령어)를 해석하고, 이를 실행하기 위한 제어 신호들을 순차적으로 발생하는 HW
=> 프로그램 카운터, 명령어 레지스터 사용
+ CPU 내부 버스 (internal nus): ALU와 레지스터들 간 이동하는 데이터와 제어장치로부터 발생되는 제어 신호가 이동하는 통로
데이터 적재/저장 명령어 실행 과정
적재 (load): CPU가 메모리에 있는 데이터를 읽어오는 것
1. 프로세서는 데이터가 있는 메모리 주소를 MAR에 보낸다.
2. MAR이 지정하는 메모리 주소에 있는 데이터를 읽어와 MBR에 저장한다.
3. 프로세서는 MBR에 저장된 데이터를 읽는다.
=> 메모리 주소만 전달 후 데이터 읽어와서 프로세서에 저장
저장(store): CPU가 메모리에 데이터를 기록하는 것
1. 프로세서는 데이터를 저장할 메모리 주소를 MAR에 보낸다.
2. 프로세서는 데이터를 MBR에 저장한다.
3. 메모리는 MAR이 지정하는 위치에 MBR의 내용을 저장한다.
=> 메모리 주소와 데이터를 함께 전달해서 메모리에 저장
명령어 사이클 (instruction cycle): 명령어를 수행하는 일련의 과정
- 컴퓨터마다 명령어 실행과정이 동일하지 않으나, 일반적으로 거치는 최소 과정을 포함한다.
명령어 사이클
CPU가 한 개의 명령어를 실행하는 데 필요한 전체 처리 과정
- CPU가 프로그램 실행을 시작하는 순간부터 전원을 끄거나 회복 불가능한 오류가 발생하여 중단될 때까지 반복한다.
- 두 개의 부사이클(subcycle)로 분리한다.
인출 사이클 (fetch cycle)
- cpu가 기억장치로부터 명령어를 읽어오는 단계
< 인출 사이클 예 >
+ t는 CPU 클록 주기이고, CPU 클록 = 1GHz (클록 주기 = 1 ns)이라면, 인출 사이클: 1ns × 3 = 3ns 소요
t0: MAR <- PC
=> 현재 PC가 가리키는 내용(메모리 주소)을 MAR로 전송한다.
t1: MBR <- M[MAR], PC <- PC + 1
=> 메모리는 MAR이 지시하는 메모리의 내용인 명령어를 MBR로 보내고, PC가 다음 명령어를 가리키도록 PC의 내용을 갱신한다. (명령어 길이를 1로 가정)
t2: IR <- MBR
=> MBR에 있는 명령어를 IR에 저장한다.
+ 주소 버스: CPU -> 기억장치
+ 데이터 버스: CPU <-> 기억장치
주소란 데이터의 위치이다. => 기억장치가 주소를 갖고 있다. => CPU가 메모리에 주소 버스를 통해 주소값을 전송하면 메모리에서 그 주소값에 해당하는 데이터를 CPU에 전송한다.
실행 사이클 (execution cycle)
- 명령어 코드를 해독하고 그 결과에 따라 필요한 연산들을 실행하는 단계
- 인출 사이클 때보다 작업량이 더 많기 때문에, 오늘날 컴퓨터는 실행 사이클을 다수의 단계로 분할한다.
- 실행 사이클에서 수행되는 마이크로-연산들은 명령어 연산 코드(opcode)에 따라 결정된다.
전송 연산
- CPU내 레지스터와 메모리 사이에 데이터를 교환한다.
ex) 적재(Load), 저장(Store)
처리 연산
= 산술논리장치를 사용하여 데이터를 조작한다.
ex) 산술연산, 논리연산, 데이터형식 변환 연산 등
제어 연산
- 프로그램의 실행 순서를 제어한다.
ex) 순차, 무조건 분기, 조건 분기, 프로시져 호출/복귀, 인터럽트
입출력 연산
- CPU 내 레지스터와 I/O장치 간에 데이터를 이동시킨다. (전송 연산으로 볼 수 있다.)
'Computer Science > Computer Architecture' 카테고리의 다른 글
[Computer Architecture] 명령어 집합 (2) (0) | 2023.09.23 |
---|---|
[Computer Architecture] 명령어 집합 (1) (0) | 2023.09.22 |
[Computer Architecture] 컴퓨터의 성능 (1) | 2023.09.10 |
[Computer Architecture] 컴퓨터의 발전 (종류) (2) | 2023.09.09 |
[Computer Architecture] 컴퓨터의 발전 (역사) (2) | 2023.09.04 |