상세 컨텐츠

본문 제목

02. CPU의 구조와 기능 (1) [CPU의 기본구조, 명령어 실행]

Computer Science/Computer Architecture

by RACC8N 2020. 4. 3. 14:11

본문

CPU의 기능 

1. 명령어 인출(Instruction Fetch) : 기억장치로부터 명령어를 읽어온다.

2. 명령어 해독(Instruction Decode) : (읽어온 명령어) 수행해야 할 동작을 결정하기 위해 명령어를 해독한다.

※ 명령어 인출/해독은 모든 명령어들에 대하여 공통적으로 수행한다.

 

3. 데이터 인출(Data Fetch) : 명령어 실행을 위하여 데이터가 필요한 경우에는 기억장치 혹은 I/O장치로부터 그 데이터를 읽어온다.

4. 데이터 처리(Data Process) : 데이터에 대한 산술적  or 논리적 연산을 수행한다.

5. 데이터 저장(Data Store) : 수행한 결과를 저장한다.

※ 데이터 인출/처리/저장은 명령어에 따라 필요한 경우에만 수행한다.

 

2.1 CPU의 기본 구조

산술논리연산장치(ALU : Arithmetic and Logical Unit)

레지스터 세트(Register Set)

제어 유니트(Control Unit)

ALU (Arithmetic and Logical Unit)

○ 각종 산술 연산들과 논리 연산들을 수행하는 회로들로 이루어진 하드웨어 모듈

○ 산술 연산 : +, - *, %

○ 논리 연산 : AND, OR, NOT, XOR 등

 

Register

○ Access 속도가 가장 빠른 기억장치

○ CPU 내부에 포함할 수 있는 레지스터들의 수가 제한됨 (특수 목적 레지스터, 일반 목적 레지스터)

 

Control Unit

○ 프로그램 코드(명령어)를 해석하고, 그것을 실행하기 위한 제어 신호(Control Signals)들을 순자척으로 발생하는 하드웨어 모듈

 

CPU 내부 버스(CPU internal Bus)

○ CPU 내부 구성요소들 간의 정보 전송 통로

○ ALU와 레지스터들 간의 데이터 이동을 위한 데이터 선들과 제어 유니트로부터 발생되는 제어 신호 선들로 구성된 내부 버스

○ 외부의 시스템 버스들과 직접 연결되지 않으며, 반드시 버퍼 레지스터들 혹은 시스템 버스 인터페이스 회로를 통하여 시스템 버스와 접속

 

2.2 명령어 실행

명령어 사이클 (Instruction Cycle)

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

○ CPU가 프로그램 실행을 시작한 순간부터, 전원을 끄거나 회복 불가능한 오류가 발생하여 중단될 때까지 반복

○ 명령어 인출단계와 명령어 실행 단계로 나뉘어짐.

1. 인출 사이클 (Fetch Cycle) : CPU가 기억장치로부터 명령어를 읽어오는 단계

2. 실행 사이클 (Execution Cycle) : 명령어를 실행하는 단계

명령어 실행에 필요한 CPU 내부 레지스터들

1. 프로그램 카운터 (Program Counter : PC)

○ 다음에 인출할 명령어의 주소를 가지고 있는 레지스터

○ 각 명령어가 인출된 후에는 자동적으로 일정 크기 (한 명령어 길이) 만큼 증가

분기(branch) 명령어가 실행되는 경우에는 목적지 주소로 갱신

 

2. 누산기 (Accumulator : AC)

○ 데이터를 일시적으로 저장하는 레지스터

○ 레지스터의 길이는 CPU가 한 번에 처리할 수 있는 데이터 비트 수 (단어 길이)와 동일

 

3. 명령어 레지스터 (Instruction Register : IR)

○ 가장 최근에 인출된 명령어 코드가 저장되어 있는 레지스터 (decode 되기 전 / Control Unit 이전)

 

4. 기억장치 주소 레지스터 (Memory Address Register : MAR)

○ PC에 저장된 명령어 주소가 시스템 주소 버스로 출력되기 전에 일시적으로 저장되는 주소 레지스터

MAR의 출력 선들이 주소 버스 선들과 직접 연결된다.

 

5. 기억장치 버퍼 레지스터 (Memory Buffer Register : MBR)

○ 기억장치에 저장될 데이터 혹은, 기억장치로부터 읽혀진 데이터가 일시적으로 저장되는 버퍼 레지스터

MBR의 입력 및 출력 선들이 데이터 버스 선들과 직접 연결된다.

※ 흐름요약 :

기억장치로부터 인출된 명령어는 MBR을 경유하여 IR에 저장되며, 실행 사이클에서 제어 유니트로 보내져 해독된다.

MAR은 CPU 내부 주소버스와 시스템 주소 버스 사이에서 버퍼역할을 하는 레지스터이며,

MBR은 데이터에 대하여 같은 역할을 하는 버퍼 레지스터 이다.

기억장치로부터 인출된 데이터는 MBR을 경유하여 AC로 적재된다. 만약 명령어가 그 데이터에 대하여 산술 혹은 논리연산을 수행하는 것이라면, AC의 내용이 ALU로 보내진다. 그리고 ALU의 연산 결과는 다시 AC에 저장된다.

 

2.2.1 인출 사이클

인출 사이클의 마이크로 연산

인출 사이클 : CPU가 기억장치의 지정된 위치로부터 명령어를 읽어옴

마이크로 연산 : CPU 클록의 각 주기 동안 실행되는 기본적인 동작

[첫번째 주기] 현재의 PC 내용을 CPU내부 버스를 통하여 MAR로 전송

[두번째 주기] 그 주소(MAR에 있는)가 지정하는 기억장치 위치로부터 읽혀진 명령어가 데이터 버스를 통하여 MBR로 적재, PC의 내용에 1(명령어의 길이)을 더한다.

[세번째 주기] MBR에 있는 명령어 코드가 명령어 레지스터인 IR로 이동

EX) CPU 클록 = 1GHz (클럭 주기 = 1ns) -> 인출 사이클 : 1ns * 3 = 3ns소요

2.2.2 실행 사이클

실행 사이클의 마이크로 연산

○ 실행사이클 : CPU는 실행 사이클 동안에 명령어 코드를 해독(decode)하고, 그 결과에 따라 필요한 연산들을 수행

 

CPU가 수행하는 연산들의 종류

○ 데이터 이동 : CPU와 기억장치 간 혹은 I/O장치 간에 데이터를 이동

○ 데이터 처리 : 데이터에 대하여 산술 혹은 논리 연산을 수행

○ 데이터 저장 : 연산 결과 데이터 혹은 입력장치로부터 읽어 들인 데이터를 기억장치에 저장

○ 프로그램 제어 : 프로그램의 실행 순서를 결정

 

실행 사이클에서 수행되는 마이크로 연산들은 명령어의 연산(OP CODE)에 따라 결정됨

기본적인 명령어 형식의 구성

연산 코드 (Operation Code) : CPU가 수행할 연산을 지정

오퍼랜드 (Operand) : 명령어 실행에 필요한 데이터가 저장된 주소(addr)

[EXAMPLE 1] LOAD addr : 기억장치에 저장되어있는 데이터를  CPU 내부 레지스터인 AC로 이동하는 명령어

[첫번째 주기] 명령어 레지스터 IR에 있는 명령어 주소 부분을 MAR로 전송

[두번째 주기] 그 주소가 지정한 기억장소로부터 데이터를 인출하여 MBR로 전송

[세번째 주기] 그 데이터를 AC에 적재

 

[EXAMPLE 2] STORE addr : AC 레지스터의 내용을 기억장치에 저장하는 명령어

[첫번째 주기] 데이터를 저장할 기억장치 주소를 MAR로 전송

[두번째 주기] 저장할 데이터를 버퍼 레지스터인 MBR로 이동

[세번째 주기] MBR내용을 MAR이 지정하는 기억장소에 저장

 

[EXAMPLE 3] ADD ddr : 기억장치에 저장된 데이터를 AC의 내용과 더하고, 그 결과를 AC에 저장하는 명령어

[첫번째 주기] 연산에 필요한 데이터가 저장된 기억장치의 주소를 MAR로 전송

[두번째 주기] 주소에 있는 데이터를 버퍼 레지스터인 MBR로 이동

[세번째 주기] 그 데이터와 AC의 내용을 더하고 결과값을 AC에 저장

[EXAMPLE 4] JUMP addr : 오퍼랜드(addr)가 가리키는 위치의 명령어로 실행 순서를 변경하는 분기(branch) 명령어

[첫번째 주기] 명령어의 오퍼랜드(분기할 목적지 주소)를 PC에 저장 (다음 명령어 인출 사이클에서 그 주소의 명령어가 인출되므로, 분기가 발생)

 

어셈블리 프로그램 실행과정의 예

연산 코드에 임의의 정수 배정 :  LOAD : 1  ,  STORE : 2  ,  ADD : 5  ,  JUMP : 8

1. 100번지의 첫 번째 명령어 코드가 인출되어 IR에 저장

2. 250번지의 데이터를 AC로 이동

3. PC = PC + 1 = 101

4. 두 번째 명령어가 101번지로부터 인출되어 IR에 저장

5. AC의 내용과 251번지의 내용을 더하고, 그 결과를 AC에 저장

6. PC = PC + 1 = 102

7. 세 번째 명령어가 102번지로부터 인출되어 IR에 저장

8. AC의 내용이 251번지에 저장

9. PC = PC + 1 = 103

10. 네 번째 명령어가 103번지로부터 인출되어 IR에 저장

11. 분기될 목적지 주소, 즉 IR의 하위 부분(170)이 PC로 적재 (다음 명령어 인출 사이클에서는 170번지의 명령어 인출)

 

2.2.3 인터럽트 사이클(Interrupt Cycle)

인터럽트 : 프로그램 실행 중에 CPU의 현재 처리 순서를 중단시키고 다른 동작을 수행하도록 요구하는 시스템 동작

 

※ 외부로부터 인터럽트 요구가 들어오면 CPU는 원래의 프로그램 수행을 중단하고, 요구된 인터럽트를 위한 서비스 프로그램을 먼저 수행

 

인터럽트 서비스 루틴 (Interrupt Service Routine : ISR) : 인터럽트를 처리하기 위하여 수행되는 프로그램 루틴

인터럽트 처리 과정

※ 인터럽트가 들어왔을 때 CPU는 어떤 장치가 인터럽트를 요구했는지 확인하고, 해당 ISR을 호출한다. 서비스가 종료된 다음에는 중단되었던 원래 프로그램을 계속 수행한다.

 

CPU 인터럽트 처리의 세부 동작 (인터럽트 사이클 동안 수행)

1. 현재의 명령어 실행을 끝낸 즉시, 다음에 실행할 명령어의 주소(PC의 내용)를 스택에 저장 -> 일반적으로 스택은 주기억 장치의 특정 부분

2. ISR을 호출하기 위하여 그 루틴의 시작 주소를 PC에 적재. 이때 시작 주소는 인터럽트를 요구한 장치로부터 전송되거나 미리 정해진 값으로 결정.

인터럽트 사이클의 마이크로 연산

인터럽트 사이클 : 인터럽트 요구가 들어왔는지 검사하고, 그 처리에 필요한 동작들을 수행하는 과정

※ CPU가 인터럽트 사이클을 시작하기 전에, 인터럽트 가능한 상태로 세트되어 있는지 먼저 확인해야 한다. 만약 중요한 프로그램이 실행되는 중이라서 CPU가 인터럽트를 받지 못하도록 세트되어 있는 경우라면, 인터럽트 사이클은 수행되지 않는다.

인터럽트 가능 (Interrupt Enabled) 상태 : 인터럽트를 받을 수 있는 상태

인터럽트 불가능 (Interrupt Disabled) 상태 : 인터럽트를 받을 수 없는 상태

[첫번째 주기] PC의 내용을 MBR로 전송

[두번째 주기] SP의 내용을 MAR로 전송하고, PC의 내용은 ISR의 시작 주소로 변경

[세번째 주기] MBR에 저장되어 있던 원래 PC의 내용을 스택에 저장

 

[EXAMPLE] LOAD 250 명령어가 실행되는 동안에 인터럽트가 들어왔으며, 현재 SP=999이고, ISR=650 번지이다.

다중 인터럽트(Multiple Interrupt)

인터럽트 서비스 루틴을 수행하는 동안에 다른 인터럽트 발생

처리방법 두 가지

1. CPU가 ISR를 처리하고 있는 도중에는 새로운 인터럽트 요구가 들어오더라도 인터럽트 사이클을 수행하지 않는 방법

> 인터럽트 플래그(Interrupt Flag) 0 : 인터럽트 불가능 상태

> 시스템 운영상 중요한 프로그램이나 도중에 중단할 수 없는 데이터 입출력 동작 등을 위한 인터럽트를 처리하는데 사용

2. 인터럽트의 우선순위를 정하고, 우선순위가 낮은 인터럽트가 처리되고 있는 동안에 우선순위가 더 높은 인터럽트가 들어온다면, 현재의 ISR의 수행을 중단하고 새로운 인터럽트를 먼저 처리

2.2.4 간접 사이클

명령어에 포함되어 있는 주소를 이용하여, 그 명령어 실행에 필요한 데이터의 주소를 인출하는 사이클 (간접 주소지정 방식에서 사용)

인출 사이클과 실행 사이클 사이에 위치

 

간접 사이클에서 수행될 마이크로 연산

인출된 명령어의 주소 필드 내용을 이용하여 기억장치로부터 데이터의 실제 주소를 인출하여 IR의 주소 필드에 저장

 

관련글 더보기

댓글 영역