-> 블로그 이전

[컴퓨터구조] CPU의 기본 구조

2022. 1. 20. 16:38Major`/컴퓨터구조

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 (데이터 인출 - 데이터 처리 - 데이터 저장) : 실행 사이클

- 기억장치로부터 인출된 DataMBR을 경유해서 AC에 저장 

  • 만약, 명령어가 해당 Data에 대해 산술/논리 연산을 수행하는 명령어 : AC의 DataALU로 보내진다
  • ALU에서 수행한 연산결과다시 AC에 저장

 


 

명령어 사이클

- CPU가 1개의 명령어를 실행하는 데 필요한 전체 과정

  • 프로그램 실행을 시작한 순간 ~ 중단될 때까지 반복 수행
  • 명령어 인출 단계(인출 사이클) - 명령어 실행 단계(실행 사이클)로 이루어진다

 

 

인출 사이클 (Fetch Cycle)

1. CPUPC가 가리키는 기억장치의 주소로부터 명령어를 인출

2. CPUPC의 내용을 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에 저장된 명령어의 operandMAR을 경유해서 기억장치로 보내서 Data를 인출

  • ex) LOAD addr
    • 기억장치에 저장되어 있는 DataAC로 이동 
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

▶ 명령어 인출

  1. PC의 내용이 100
  2. 주소가 100인 기억장치로부터 명령어를 인출
  3. 해당 명령어를 IR에 저장
CPU 레지스터 - 내용
PC 0100
IR 1250
주소, Data가 거치는 MAR, MBR - 내용
(MAR) 0100
(MBR) 1250

▶ 명령어 실행

  1. 명령어의 operand가 250
  2. 주소가 250인 기억장치로부터 Data를 MBR에 저장
  3. MBR에 저장된 Data를 AC에 저장
CPU 레지스터 - 내용
PC 0101
IR 1250
AC 0004
주소, Data가 거치는 MAR, MBR - 내용
(MAR) 0250
(MBR) 0004

 

2. ADD 251

▶ 명령어 인출

  1. PC의 내용이 101
  2. 주소가 101인 기억장치로부터 명령어 인출
  3. 해당 명령어를 IR에 저장
CPU 레지스터 - 내용
PC 0101
IR 5251
주소, Data가 거치는 MAR, MBR - 내용
(MAR) 0101
(MBR) 5251

▶ 명령어 실행

  1. 명령어의 operand가 251
  2. 주소가 251인 기억장치로부터 Data를 인출해서 MBR에 저장
  3. 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

▶ 명령어 인출

  1. PC의 내용이 102
  2. 주소가 102인 기억장치로부터 명령어 인출
  3. 해당 명령어를 IR에 저장
CPU 레지스터 - 내용
PC 0102
IR 2251
주소, Data가 거치는 MAR, MBR - 내용
(MAR) 0102
(MBR) 2251

▶ 명령어 실행

  1. 명령어의 operand가 251
  2. 저장할 Data(AC에 존재)를 MBR로 보낸다
  3. MBR의 Data를 명령어의 operand에 저장
CPU 레지스터 - 내용
PC 0103
IR 2251
AC 0007
Memory(Address : 251) 0007
주소, Data가 거치는 MAR, MBR - 내용
(MAR) 0251
(MBR) 0007

 

4. JUMP 170

▶ 명령어 인출

  1. PC의 내용이 103
  2. 주소가 103인 기억장치로부터 명령어 인출
  3. 해당 명령어를 IR에 저장
CPU 레지스터 - 내용
PC 0103
IR 8170
주소, Data가 거치는 MAR, MBR - 내용
(MAR) 0103
(MBR) 8170

▶ 명령어 실행

  1. 명령어의 operand가 170
  2. 해당 operand를 PC에 대입
CPU 레지스터 - 내용
PC 0170
IR 8170

 


 

인터럽트 사이클

- 순차적인 명령어 실행을 중단하고, 다른 프로그램을 처리하도록 요구 (Interrupt)

  • CPU ↔ 외부장치 간의 상호작용을 위한 기능
  • 정전과 같은 긴급한 상황에 대처

- 인터럽트 요청이 들어오면, CPU는 원래 프로그램 수행을 중단하고, 요구된 인터럽트를 처리하기 위한 프로그램을 수행 (인터럽트 서비스 루틴 : Interrupt Service Routine : ISR) 

  • 해당 인터럽트 처리가 끝나면 CPU는 원래 프로그램으로 return해서 수행

 

# CPU는 실행 사이클 종료 ~> 인출 사이클 시작 사이인터럽트 요구 신호가 들어와서 대기 중인지 검사 

≫ 만약 인터럽트 요구 신호가 들어왔다면 (인터럽트 사이클 : Interrupt Cycle)

  1. 현재 PC 내용을 stack에 저장 → 인터럽트 처리가 끝나고, 복귀할 주소를 저장해놓는다 → 기억장치의 주소가 현재 SP의 내용인 기억장치에 현재 PC내용을 저장
  2. 해당 인터럽트 서비스 루틴을 호출하기 위해, 해당 루틴의 시작 주소를 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 명령어 실행

▶ 명령어 인출

  1. PC의 내용이 100
  2. 주소가 100인 기억장치로부터 명령어 인출
  3. 해당 명령어를 IR에 저장
CPU 레지스터 - 내용
PC 0100
IR 1250
주소, Data가 거치는 MAR, MBR - 내용
(MAR) 0100
(MBR) 1250

▶ 명령어 실행

  1. 명령어의 operand가 250
  2. 주소가 250인 기억장치로부터 Data 인출
  3. 해당 Data를 AC에 저장
CPU 레지스터 - 내용
PC 0101
IR 1250
AC 0004
주소, Data가 거치는 MAR, MBR - 내용
(MAR) 0250
(MBR) 0004

▶ 인터럽트 발생

  1. 현재 PC의 내용인 101을 Stack에 저장 : 기억장치 주소가 현재 SP의 내용인 999인 기억장치에 현재 PC 내용 저장
  2. SP의 내용을 1 감소
  3. 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)