본문 바로가기
ELECTRONIC ELECTRICAL ENG/컴퓨터 일반

[컴퓨터 구조] 3. CPU 의 구조와 기능

by Hey Nary 2022. 6. 5.
728x90
반응형

 

[ELECTRONIC ELECTRICAL ENG/컴퓨터 일반] - [컴퓨터 구조] 2. 컴퓨터 구조의 발전

 

 

3.1 CPU의 기본 구조

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

- 각종 산술 연산들과 논리 연산들을 수행하는 회로들로 이루어진 하드웨어 모듈
- 산술 연산 : +, --, × , ÷
- 논리 연산 : AND, OR, NOT, XOR 등

 

(2) 레지스터 세트(Register Set)

- 액세스 속도가 가장 빠른 기억장치
- CPU 내부에 포함할 수 있는 레지스터들의 수가 제한됨

- 특수 목적용 레지스터들과 적은 수의 일반 목적용 레지스터들

 

(3) 제어 유니트(Control Unit)

- 프로그램 코드 명령어 를 해석하고 , 그것을 실행하기 위한 제어 신호들 (control 을 순차적으로 발생하는 하드웨어 모듈

 

(4) CPU 내부 버스 (CPU internal bus)

- ALU 와 레지스터들 간의 데이터 이동을 위한 데이터 선들과 제어 유니트로부터 발생되는 제어 신호 선들로 구성된 내부 버스
- 외부의 시스템 버스들과는 직접 연결되지 않으며 , 반드시 버퍼 레지스터들 혹은 시스템 버스 인터페이스 회로를 통하여 시스템 버스와 접속

 

 

3.2 CPU의 기능

(1) 명령어 인출 (Instruction Fetch): 기억장치로부터 명령어를 읽어온다
(2) 명령어 해독 (Instruction Decode): 수행해야 할 동작을 결정하기 위하여 명령어를 해독한다
(1),(2) -> 모든 명령어들에 대하여 공통적으로 수행

 

(3) 데이터 인출 (Data Fetch): 명령어 실행을 위하여 데이터가 필요한 경우에는 기억장치 혹은 I/O 장치로부터 그
데이터를 읽어온다
(4) 데이터 처리 (Data Process): 데이터에 대한 산술적 혹은 논리적 연산을 수행
(5) 데이터 쓰기 (Data Store): 수행한 결과를 저장

(3)-(5) -> 명령어에 따라 필요한 경우에만 수행

 

3.3 명령어 실행

(1) 명령어 사이클 (instruction cycle)

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

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

- 두 개의 부사이클

   1. 인출 사이클 (fetch cycle): CPU 가 기억장치로부터 명령어를 읽어오는 단계
   2. 실행 사이클 (execution cycle): 명령어를 실행하는 단계

 

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

데이터 통로가 표시된 CPU 내부 구조

  1. 프로그램 카운터 (Program Counter: PC) : 다음에 인출할 명령어의 주소를 가지고 있는 레지스터
    1. 각 명령어가 인출된 후에는 자동적으로 일정 크기 한 명령어 길이만큼 증가
    2. 분기 (branch) 명령어가 실행되는 경우에는 목적지 주소로 갱신
  2. 누산기 (Accumulator: AC) : 데이터를 일시적으로 저장하는 레지스터
    1. 레지스터의 길이는 CPU 가 한 번에 처리할 수 있는 데이터 비트 수 단어 길이 와 동일
  3. 명령어 레지스터 (Instruction Register: IR) : 가장 최근에 인출된 명령어 코드가 저장되어 있는 레지스터
  4. 기억장치 주소 레지스터 (Memory Address Register: MAR) : PC 에 저장된 명령어 주소가 시스템 주소 버스로 출력되기 전에 일시적으로 저장되는 주소 레지스터
  5. 기억장치 버퍼 레지스터 (Memory Buffer Register: MBR) : 기억장치에 쓰여질 데이터 혹은 기억장치로부터 읽혀진 데이터를 일시적으로 저장하는 버퍼 레지스터

(3) 인출 사이클 : 다음에 인출할 명령어 주소 > 기억장치 주소 > 기억장치 > 최근의 명령어로 저장

- 마이크로 연산 (micro operation)
t0 : MAR <- PC
  현재의 PC 내용을 CPU 내부 버스를 통하여 MAR 로 전송
t1 : MBR <- M[MAR], PC <- PC + 1
  그 주소가 지정하는 기억장치 위치로부터 읽혀진 명령어가 데이터 버스를 통하여 MBR 로 적재되며 , PC 의 내용에 1 을 더한다
t2 : IR <- MBR

  MBR 에 있는 명령어 코드가 명령어 레지스터인 IR 로 이동

 

- 예. CPU 클록 = 1 GHz 클럭 주기 = 1 ㎱
인출 사이클 : 1 ㎱ x 3 = 3 ㎱ 소요

 

(4) 실행 사이클

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

 

- 연산의 종류 

o 데이터 이동 : CPU 와 기억장치 간 혹은 I/O 장치 간에 데이터를 이동
o 데이터 처리 : 데이터에 대하여 산술 혹은 논리 연산을 수행

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

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

 

- 마이크로 연산 (micro operation) : 명령어들의 연산 코드 (op code = operation code, CPU가 수행할 연산을 지정) 에 따라 결정됨 
   +) 오퍼랜드(operand)
      명령어 실행에 필요한 데이터가 저장된 주소(addr)

 

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

t0 : MAR <- IR(addr)

    명령어 레지스터 IR 에 있는 명령어의 주소 부분을 MAR 로 전송
t1 : MBR <- M[MAR]
    그 주소가 지정한 기억장소로부터 데이터를 인출하여 MBR 로 전송
t2 : AC <- MBR

    그 데이터를 AC 에 적재


- 예2. STA addr 명령어 : AC 레지스터의 내용을 기억장치에 저장하는 명령어

t0 : MAR <- IR(addr)

    데이터를 저장할 기억장치의 주소를 MAR 로 전송
t1 : MBR <- AC

    저장할 데이터를 버퍼 레지스터인 MBR 로 이동
t2 : M[MAR] <- MBR

    MBR 의 내용을 MAR 이 지정하는 기억장소에 저장


- 예3. ADD addr 명령어 : 기억장치에 저장된 데이터AC 의 내용과 더하고 , 그 결과는 다시 AC 에 저장하는 명령어

t0 : MAR <- IR (addr)

    데이터를 저장할 기억장치의 주소를 MAR 로 전송
t1 : MBR <- M[MAR]

    저장할 데이터를 버퍼 레지스터인 MBR 로 이동
t2 : AC <- AC + MBR

    그 데이터와 AC 의 내용을 더하고 결과값을 다시 AC 에 저장


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

t0 : PC <- IR(addr)

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

 

- 예5. 어셈블리 프로그램의 실행

0. 연산 코드에 임의의 정수 배정 -> 오퍼랜드

    LOAD : 1

    STORE : 2
    ADD : 5
    JUMP : 8

1. LOAD 명령어 인출 : PC=100으로 기억장치의  100번지에 있는 명령어가 실행됨. LOAD 명령어의 기계 코드가 주소(IR)에 저장됨

2. LOAD 명령어 실행 : 1250 코드에 의해, 250번지의 데이터가 AC에 저장됨

  + 명령어가 인출되었으므로, PC=PC+1=101이 됨.

3. ADD 명령어 인출 : PC=101로 기억장치의 101번지에 있는 명령어가 실행됨. ADD 명령어의 기계 코드가 주소(IR)에 저장됨

4. ADD 명령어 실행 : 5251 코드에 의해, 251번지의 데이터와 AC의 데이터가 더해짐. 그 결과가 AC에 저장됨.

    + 명령어가 인출되었으므로, PC=PC+1=102이 됨.

5. STA 명령어 인출 : PC=102로 기억장치의 102번지에 있는 명령어가 실행됨. STA 명령어의 기계코드가 주소(IR)에 저장됨.

6. STA 명령어 실행 : 2251 코드에 의해, 251번지의 데이터에 AC의 데이터가 저장됨.

    + 명령어가 인출되었으므로, PC=PC+1=103이 됨.

7. JUMP 명렁어 인출 : PC=103로 기억장치의 103번지에 있는 명령어가 실행됨. JUMP 명령어의 기계코드가 주소(IR)에 저장됨.

8. JUMP 명렁어 실행 : 8170 코드에 의해, 분기될 데이터의 주소 170번지가 PC에 적재됨. 다음 명령어 인출 시에는 170번지의 명령어가 인출됨.

 

 

3.4 인터럽트 사이클 (interrupt cycle)

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

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

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

(1) 인터럽트 처리 과정

1. 인터럽트 발생

2. CPU에서 어떤 장치가 인터럽트를 요구했는지 확인하고 , 현재의 명령어 실행을 끝낸 즉시 , 다음에 실행할 명령어의 주소
(PC 의 내용) 를 스택 (주기억장치의 특정 영역) 에 저장

3. ISR 을 호출하기 위하여 그 루틴의 시작 주소를 PC 에 적재.

  시작 주소는 인터럽트를 요구한 장치로부터 전송되거나 미리 정해짐

4. 해당 ISR 을 호출

5. 서비스가 종료된 다음에는 중단되었던 원래 프로그램의 수행 계속

(2) 마이크로 연산

t0 : MBR <- PC

    PC 의 내용을 MBR 로 전송

t1 : MAR <- SP, PC <- ISR 의 시작 주소

    SP 는 스택 포인터 (stack pointer)

    SP 의 내용을 MAR 로 전송하고 PC 의 내용은 인터럽트 서비스 루틴의 시작 주소로 변경

t2 : M[MAR] <- MBR

    MBR 에 저장되어 있던 원래 PC 의 내용을 스택에 저장

 

-예. 아래 프로그램의 첫 번째 명령어인 LOAD 250 명령어가 실행되는 동안에 인터럽트가 들어왔으며 , 현재 SP = 999
이고 , 인터럽트 서비스 루틴의 시작 주소는 650 번지라고 가정

100 LOAD 250
101 ADD 251
102 STA 251
103 JUMP 170

 

1. 현재 실행 중인 LOAD 실행을 끝냄. 

2. 원래 PC의 101번지를 SP의 999번지에 저장함.

3. ISR의 시작 주소인 650번지를 PC에 적재함.

4. 650번지의 명령어 실행이 끝나면 SP에 있는 주소의 명령어를 실행함.

 

(3) 다중 인터럽트

1.  CPU 가 인터럽트 서비스 루틴을 처리하고 있는 도중에는 새로운 인터럽트 요구가 들어오더라도 CPU 가 인터럽트 사이클을 수행하지 않도록 방지
    - 인터럽트 플래그 (interrupt flag) <-  0 : 인터럽트 불가능 (interrupt disabled) 상태
    - 시스템 운영상 중요한 프로그램이나 도중에 중단할 수 없는 데이터 입출력 동작 등을 위한 인터럽트를 처리하는데 사용
2. 인터럽트의 우선 순위를 정하고 , 우선 순위가 낮은 인터럽트가 처리되고 있는 동안에 우선순위가 더 높은 인터럽트가 들어온다면 현재의 인터럽트 서비스 루틴의 수행을 중단하고 새로운 인터럽트를 처리

 

728x90
반응형

댓글