2022. 1. 20. 16:38ㆍMajor`/컴퓨터구조
CPU
- 컴퓨터의 핵심 요소
- 기억장치에 저장되어 있는 명령어들을 실행 : "프로그램 수행"
CPU의 프로그램 수행 과정 (기능)
① 명령어 인출 (Instruction Fetch) - 무조건 실행
- 기억장치로부터 명령어 읽기
② 명령어 해독 (Instruction Decode) - 무조건 실행
- 해당 명령어 해독
- 어떤 동작을 수행해야하는지 결정해야 하기 때문에
③ 데이터 인출 (Data Fetch)
- 명령어를 수행할 때 Data가 필요한 경우, (기억장치, I/O장치)로부터 해당 Data를 읽기
④ 데이터 처리 (Data Process)
- 해당 Data에 대한 산술/논리연산을 수행
⑤ 데이터 저장 (Data Store)
- 수행 결과 저장
→ ①, ②는 무조건 실행 / ③, ④, ⑤는 명령어에 따라 선택적 실행
CPU 내부 구조
ALU (산술논리연산장치)
- 각종 산술/논리 연산들을 수행하는 회로
- 산술 연산 : 덧셈/뺄셈/곱셈/나눗셈
- 논리 연산 : AND/OR/NOT
Register (레지스터)
- CPU내에서 Data들을 기억하는 Memory 장치
- 엑세스 속도가 가장 빠르다
- 내부 회로가 복잡해서 많은 공간을 차지
- 특수 목적용 레지스터, 일반 목적용 레지스터들만 포함
Register 종류
▶ 프로그램 카운터 (PC : Program Counter)
- 다음에 인출할 명령어의 주소를 보유하고 있는 레지스터
- 명령어 인출 후, 해당 명령어 길이만큼 증가
- 분기(branch) 명령어가 실행될 경우, 해당 목적지 주소로 갱신
▶ 누산기 (AC : Accumulator)
- Data의 연산결과를 일시적으로 저장하는 레지스터
- AC의 비트 수 = word 길이 (CPU가 한 번에 처리할 수 있는 비트 수)
▶ 명령어 레지스터 (IR : Instruction Register)
- 현재 실행중인 명령어를 저장하는 레지스터
▶ 기억장치 주소 레지스터 (MAR : Memory Address Register)
- 접근할 메모리의 주소를 임시 저장
- PC에 저장된 명령어 주소가 System 주소 버스로 출력되기 전에 일시적으로 저장
- MAR 출력 선 : 주소 버스 선들과 직접 접속
▶ 기억장치 버퍼 레지스터 (MBR : Memory Buffer Register)
- 주기억장치에 읽어온 Data / 주기억장치에 저장할 Data를 임시 저장하는 버퍼 레지스터
- Data를 처리하기 위해 반드시 거쳐간다
- MBR 입/출력 선 : 데이터 버스 선들과 직접 접속
▶ 입출력 주소 레지스터 (IOAR : I/O Address Register)
- 접근할 I/O 장치의 주소를 저장
▶ 입출력 버퍼 레지스터 (IOBR : I/O Buffer Register)
- I/O 장치 ↔ CPU 사이의 교환되는 Data가 임시 저장
▶ 플래그 레지스터 (FR : Flag Register)
- 연산 결과를 bit단위로 할당해서 저장
Control Unit (제어 유니트)
- 프로그램 코드(명령어)를 해석하고, 그에 따른 제어신호를 순차적으로 발생시키는 하드웨어 모듈
- 명령어 실행에 필요한 Data들의 전송 통로/방향을 지정
- CPU 내의 각 구성요소 제어 + 외부의 하드웨어 자원 제어
CPU 내부 버스
- (ALU, Register, Control Unit) 간의 (Data 신호, 제어 신호)들의 전송 통로
- 데이터/주소 선 (ALU↔Register Data 이동) + 제어신호 선 (From Control Unit)
- 이러한 내부 버스 선들은 외부의 System Bus와 직접 연결 X
- 반드시 (버퍼 레지스터, 인터페이스 회로)를 통해서 System Bus와 접속
※ CPU 내부 구조에서의 작동 방식
# 명령어 (명령어 인출 - 명령어 실행)
- 기억장치로부터 인출된 명령어는 MBR을 경유해서 IR에 저장 - 인출 사이클
- 실행 사이클에서 Control Unit으로 보내져서 해당 명령어를 해독
# Data (데이터 인출 - 데이터 처리 - 데이터 저장) : 실행 사이클
- 기억장치로부터 인출된 Data는 MBR을 경유해서 AC에 저장
- 만약, 명령어가 해당 Data에 대해 산술/논리 연산을 수행하는 명령어 : AC의 Data가 ALU로 보내진다
- ALU에서 수행한 연산결과는 다시 AC에 저장
명령어 사이클
- CPU가 1개의 명령어를 실행하는 데 필요한 전체 과정
- 프로그램 실행을 시작한 순간 ~ 중단될 때까지 반복 수행
- 명령어 인출 단계(인출 사이클) - 명령어 실행 단계(실행 사이클)로 이루어진다
인출 사이클 (Fetch Cycle)
1. CPU는 PC가 가리키는 기억장치의 주소로부터 명령어를 인출
2. CPU는 PC의 내용을 1씩 증가시킴으로써 명령어를 기억장치에 저장된 순서대로 읽어올 수 있게 해준다
인출 사이클 각 단계별 마이크로-연산 (Micro - Operation)
- CPU 클록의 각 주기 동안 수행되는 기본 동작
t(0) : PC -> MAR
t(1) : M[MAR] -> MBR / PC + 1 -> PC
t(2) : MBR -> IR
- t(0), t(1), t(2)는 CPU 클록의 각 주기
- 명령어 인출에는 3개의 CPU 클록 주기만큼의 시간이 걸린다
if 클록 주파수 = 1GHz >> 클록주기 = 1ns
-> 인출 사이클 = 1ns x 3 = 3ns
if 클록 주파수 = 2GHz >> 클록주기 = 0.5ns
-> 인출 사이클 = 0.5ns x 3 = 1.5ns
(1) t(0) : PC -> MAR
- 현재 PC의 내용(인출할 명령어 주소)을 CPU 내부 버스를 통해서 MAR로 보내기
- System Bus와 직접 접속된 MAR을 통해서 주소(인출할 명령어의 주소)가 기억장치로 전송
(2) t(1) : M[MAR] -> MBR / PC + 1 -> PC
1. 해당 기억장치 주소로부터 읽혀진 명령어가 데이터 버스를 통해서 MBR에 적재
2. PC의 내용에 1을 더해서 다음 명령어의 주소를 가리키게 한다
if 각 기억장치 주소가 바이트 단위로 지정, 명령어 길이 = 16bit
-> 해당 명령어는 2개의 주소에 걸쳐 저장 (16bit = 2byte)
-> 이 경우, 해당 명령어를 읽고 PC의 내용에 2를 더해야 한다
(3) t(2) : MBR -> IR
- MBR에 저장되어 있는 명령어를 IR로 이동
실행 사이클 (Execute Cycle)
- CPU가 인출된 명령어(IR에 존재)를 해독하고, 해당 결과에 따라 필요한 연산을 수행
- Data 이동 : CPU ↔ (기억장치, I/O장치) 간에 Data를 이동
- Data 처리 : Data에 대한 산술/논리 연산을 수행
- Data 저장 : (Data의 연산결과, Input 장치로부터 읽은 Data)를 기억장치에 저장
- 프로그램 제어 : 프로그램의 실행 순서를 결정
- 실행 사이클에서 수행되는 마이크로-연산들은 명령어의 종류에 따라 다르다
- 해당 명령어는 (opcode, operand)로 구성
- operand는 명령어가 사용할 Data가 저장되어 있는 기억장치의 주소를 가리킨다
1. Data 이동
- IR에 저장된 명령어의 operand를 MAR을 경유해서 기억장치로 보내서 Data를 인출
- ex) LOAD addr
- 기억장치에 저장되어 있는 Data를 AC로 이동
t(0) : IR(addr) -> MAR
t(1) : M[MAR] -> MBR
t(2) : MBR -> AC
(1) t(0) : IR(addr) -> MAR
- IR에 저장되어 있는 명령어의 operand 주소를 MAR을 통해서 기억장치로 보낸다
(2) t(1) : M[MAR] -> MBR
- 해당 주소가 지정하는 기억장치로부터 Data를 인출해서 MBR에 저장
(3) t(2) : MBR -> AC
- 해당 Data를 AC에 저장
2. Data 저장
- AC의 Data를 기억장치에 저장
- ex) STA addr
t(0) : IR(addr) -> MAR
t(1) : AC -> MBR
t(2) : MBR -> M[MAR]
(1) t(0) : IR(addr) -> MAR
- 데이터를 저장할 기억장치의 주소를 MAR로 보낸다
(2) t(1) : AC -> MBR
- 저장할 Data를 MBR로 보낸다
≫ (1), (2)를 통해서 Data를 저장할 주소, 저장할 Data가 각각 MAR, MBR에 저장
(3) t(2) : MBR -> M[MAR]
- 해당 주소가 지정하는 기억장치에 Data를 저장
- MBR : 저장하려는 Data 보유
- MAR : Data를 저장할 기억장치의 주소 보유
3. Data 처리
- 기억장치에 저장된 Data를 AC의 Data와 더하고, 해당 결과를 다시 AC에 저장
- ex) ADD addr
t(0) : IR(addr) -> MAR
t(1) : M[MAR] -> MBR
t(2) : AC + MBR -> AC
(1) t(0) : IR(addr) -> MAR
- 명령어의 operand를 주소버스를 경유해서 MAR로 보낸다
(2) t(1) : M[MAR] -> MBR
- 해당 명령어의 주소인 기억장치의 주소로부터 Data를 인출해서 MBR에 저장
(3) t(2) : AC + MBR -> AC
- AC에 저장된 Data, MBR에 저장된 Data를 더하고, 해당 결과를 AC에 저장
4. 프로그램 제어
- 일반적으로 명령어들은 기억장치에 저장된 순서대로 실행되기 때문에, 실행 순서를 결정할 필요가 없다 (PC에 의해 결정)
>> 전혀 다른 위치에 있는 명령어를 실행할 경우
- 프로그램 수행 순서를 조정
- 현재 PC 내용이 가리키는 위치가 아닌, 다른 위치의 명령어로 실행 순서를 변경
- 분기(branch) 명령어
- ex) JUMP addr
- 한 주기만에 실행이 완료
t(0) : IR(addr) -> PC
- 명령어의 operand는 분기 목적지 주소를 가리키기 때문에, 해당 주소를 PC에 적재하면 된다
- 이런 과정을 통해서, PC의 내용이 변경됨에 따라, 명령어의 실행 순서도 변경된다
※ Example
주소 | 명령어 | 기계 코드 |
100 | LOAD 250 | 1250 |
101 | ADD 251 | 5251 |
102 | STA 251 | 2251 |
103 | JUMP 170 | 8170 |
opcode : LOAD = 1 / STA = 2 / ADD = 5 / JUMP = 8 |
1. LOAD 250
▶ 명령어 인출
- PC의 내용이 100
- 주소가 100인 기억장치로부터 명령어를 인출
- 해당 명령어를 IR에 저장
CPU 레지스터 - 내용 | |
PC | 0100 |
IR | 1250 |
주소, Data가 거치는 MAR, MBR - 내용 | |
(MAR) | 0100 |
(MBR) | 1250 |
▶ 명령어 실행
- 명령어의 operand가 250
- 주소가 250인 기억장치로부터 Data를 MBR에 저장
- MBR에 저장된 Data를 AC에 저장
CPU 레지스터 - 내용 | |
PC | 0101 |
IR | 1250 |
AC | 0004 |
주소, Data가 거치는 MAR, MBR - 내용 | |
(MAR) | 0250 |
(MBR) | 0004 |
2. ADD 251
▶ 명령어 인출
- PC의 내용이 101
- 주소가 101인 기억장치로부터 명령어 인출
- 해당 명령어를 IR에 저장
CPU 레지스터 - 내용 | |
PC | 0101 |
IR | 5251 |
주소, Data가 거치는 MAR, MBR - 내용 | |
(MAR) | 0101 |
(MBR) | 5251 |
▶ 명령어 실행
- 명령어의 operand가 251
- 주소가 251인 기억장치로부터 Data를 인출해서 MBR에 저장
- MBR의 Data와 AC의 Data를 add하고, 해당 결과를 다시 AC에 저장
CPU 레지스터 - 내용 | |
PC | 0102 |
IR | 5251 |
AC | 0004 |
ALU | 0003 + 0004 |
최종 AC | 0007 |
주소, Data가 거치는 MAR, MBR - 내용 | |
MAR | 251 |
MBR | 0003 |
3. STA 251
▶ 명령어 인출
- PC의 내용이 102
- 주소가 102인 기억장치로부터 명령어 인출
- 해당 명령어를 IR에 저장
CPU 레지스터 - 내용 | |
PC | 0102 |
IR | 2251 |
주소, Data가 거치는 MAR, MBR - 내용 | |
(MAR) | 0102 |
(MBR) | 2251 |
▶ 명령어 실행
- 명령어의 operand가 251
- 저장할 Data(AC에 존재)를 MBR로 보낸다
- MBR의 Data를 명령어의 operand에 저장
CPU 레지스터 - 내용 | |
PC | 0103 |
IR | 2251 |
AC | 0007 |
Memory(Address : 251) | 0007 |
주소, Data가 거치는 MAR, MBR - 내용 | |
(MAR) | 0251 |
(MBR) | 0007 |
4. JUMP 170
▶ 명령어 인출
- PC의 내용이 103
- 주소가 103인 기억장치로부터 명령어 인출
- 해당 명령어를 IR에 저장
CPU 레지스터 - 내용 | |
PC | 0103 |
IR | 8170 |
주소, Data가 거치는 MAR, MBR - 내용 | |
(MAR) | 0103 |
(MBR) | 8170 |
▶ 명령어 실행
- 명령어의 operand가 170
- 해당 operand를 PC에 대입
CPU 레지스터 - 내용 | |
PC | 0170 |
IR | 8170 |
인터럽트 사이클
- 순차적인 명령어 실행을 중단하고, 다른 프로그램을 처리하도록 요구 (Interrupt)
- CPU ↔ 외부장치 간의 상호작용을 위한 기능
- 정전과 같은 긴급한 상황에 대처
- 인터럽트 요청이 들어오면, CPU는 원래 프로그램 수행을 중단하고, 요구된 인터럽트를 처리하기 위한 프로그램을 수행 (인터럽트 서비스 루틴 : Interrupt Service Routine : ISR)
- 해당 인터럽트 처리가 끝나면 CPU는 원래 프로그램으로 return해서 수행
# CPU는 실행 사이클 종료 ~> 인출 사이클 시작 사이에 인터럽트 요구 신호가 들어와서 대기 중인지 검사
≫ 만약 인터럽트 요구 신호가 들어왔다면 (인터럽트 사이클 : Interrupt Cycle)
- 현재 PC 내용을 stack에 저장 → 인터럽트 처리가 끝나고, 복귀할 주소를 저장해놓는다 → 기억장치의 주소가 현재 SP의 내용인 기억장치에 현재 PC내용을 저장
- 해당 인터럽트 서비스 루틴을 호출하기 위해, 해당 루틴의 시작 주소를 PC에 저장 → 시작 주소는 인터럽트를 요구한 장치로부터 전송 or 미리 정해진 값
인터럽트 사이클 마이크로-연산
t(0) : PC -> MBR
t(1) : SP -> MAR / ISR 시작주소 -> PC
t(2) : MBR -> M[MAR] / SP - 1 -> SP
SP(Stack Pointer)
- 특수 목적용 레지스터
- 항상 stack의 top 주소를 가리킨다
(1) t(0) : PC -> MBR
- 현재 PC의 내용이 MBR에 저장
(2) t(1) : SP -> MAR / ISR 시작주소 -> PC
- SP의 내용이 MAR을 경유해서 주소 버스로 나간다
- → 현재 MAR : stack의 top 주소 보유
- ISR의 시작주소가 PC에 저장
(3) t(2) : MBR -> M[MAR] / SP - 1 -> SP
1. MBR에 저장된 주소(return할 복귀 주소)를 stack에 저장
2. SP의 내용을 1 감소시켜서 stack의 top주소 변경
※ Example
주소 | 명령어 | 기계 코드 |
100 | LOAD 250 | 1250 |
101 | ADD 251 | 5251 |
102 | STA 251 | 2251 |
103 | JUMP 170 | 8170 |
opcode : LOAD = 1 / STA = 2 / ADD = 5 / JUMP = 8 |
- LOAD 250가 실행되는 동안 인터럽트가 들어왔다고 가정
- SP = 999
- ISR 시작주소 = 650
LOAD 명령어 실행
▶ 명령어 인출
- PC의 내용이 100
- 주소가 100인 기억장치로부터 명령어 인출
- 해당 명령어를 IR에 저장
CPU 레지스터 - 내용 | |
PC | 0100 |
IR | 1250 |
주소, Data가 거치는 MAR, MBR - 내용 | |
(MAR) | 0100 |
(MBR) | 1250 |
▶ 명령어 실행
- 명령어의 operand가 250
- 주소가 250인 기억장치로부터 Data 인출
- 해당 Data를 AC에 저장
CPU 레지스터 - 내용 | |
PC | 0101 |
IR | 1250 |
AC | 0004 |
주소, Data가 거치는 MAR, MBR - 내용 | |
(MAR) | 0250 |
(MBR) | 0004 |
▶ 인터럽트 발생
- 현재 PC의 내용인 101을 Stack에 저장 : 기억장치 주소가 현재 SP의 내용인 999인 기억장치에 현재 PC 내용 저장
- SP의 내용을 1 감소
- ISR 시작주소를 PC에 저장
CPU 레지스터 - 내용 | |
PC | 0101 |
Memory (Address : 999) | 0101 |
SP | 998 |
최종 PC | 0650 |
주소, Data가 거치는 MAR, MBR - 내용 | |
(MAR) | 999 |
(MBR) | 0101 |
다중 인터럽트 (Multiple Interrupt)
- 외부 장치를 위한 ISR의 명령어가 실행하고 있는 도중에, 다른 외부 장치가 또 인터럽트 요구를 발생
처리 방법
(1) CPU가 ISR을 처리하고 있을 경우에는, 새로운 인터럽트 요구가 들어와도 인터럽트 사이클 수행 X
- "인터럽트 불가능"상태 일 경우, CPU가 인터럽트 요구 신호 검사 X
- 한 ISR을 처리하는 동안에 발생하는 인터럽트 요구는 "대기" 상태로 남아 있다가, CPU가 해당 ISR을 끝내면 다시 인터럽트 가능 상태로 바뀐 후 인식
(2) 인터럽트 요구들 간에 우선순위를 정하고, 우선순위가 낮은 인터럽트 요구를 처리하고 있다가 우선순위가 더 높은 인터럽트 요구가 들어오면, 현재 ISR 수행을 중단하고, 우선순위가 더 높은 인터럽트 요구를 먼저 수행
간접 사이클 (Indirect Cycle)
명령어의 operand는 원래 해당 Data를 저장하고 있는 기억장치의 주소
- but, 명령어가 만약 해당 Data를 저장하고 있는 기억장치의 주소의 주소를 가지고 있는다면 >> 해당 Data의 실제 주소를 기억장치로부터 먼저 읽어와야 한다 - 간접 사이클
- 인출 사이클 ~ 실행 사이클 사이에 위치
- 명령어 내의 특정 비트가 1로 세트된 경우에만 수행
- 간접 주소지정 방식에서 사용
간접 사이클 마이크로-연산
t(0) : IR(addr) -> MAR
t(1) : M[MAR] -> MBR
t(2) : MBR -> IR(addr)