[computerStructure] 3. CPU 구조와 기능

말랑이·2023년 6월 3일
1

computerStructure

목록 보기
3/3
post-thumbnail

1 CPU 기능

동작기능
명령어인출 (Instruction Fetch)기억장치 ➡️ 명령어 읽어옴
명령어해독 (Instruction Decode)수행해야 할 동작 결정을 위해 ➡️ 명령어 해독

모든 명령어들에 대해 공통적 수행

동작기능
데이터인출 (Data Fetch)명령어 실행을 위해 데이터 필요 ➡️ 기억장치 or I/O장치 데이터 읽어옴
데이터처리 (Data Process)데이터 산술적 or 논리적 연산 수행
데이터저장 (Data Store)수행한 결과 ➡️ 저장

명령어에 따라 필요한 경우에만 수행


2 CPU 기본구조

1️⃣ 산술논리연산장치

👾 산술논리연산장치(ALU) : 각종 산술연산 및 논리연산 수행

  • 하드웨어 모듈
  • 산술연산 : +, -, ×, ÷
  • 논리연산 : AND, OR, NOT, XOR

2️⃣ 레지스터

👾 레지스터(register) : 엑세스속도가 가장 빠른 기억장치

  • CPU 내부에 포함할 수 있는 레지스터 수 제한 ⛔️
    • 특수목적용 레지스터
    • 일반목적용 레지스터

3️⃣ 제어유니트

👾 제어유니트 : 프로그램코드 (명령어) 해석 → 실행하기 위한 제어신호들을 순차적으로 발생

4️⃣ CPU 내부버스

👾 CPU 내부버스 : ALU ↔︎ 레지스터의 데이터이동을 위한 데이터선 + 제어신호선

  • 외부 시스템버스와 직접 연결 ⛔️
  • 버퍼레지스터 or 시스템버스 인터페이스 회로 → 시스템버스와 접속 가능 ✅

3 명령어 실행

1️⃣ 명령어사이클

👾 명령어사이클(instruction cycle)

  • CPU가 한개의 명령어를 실행하는데 필요한 전체처리과정
  • 프로그램 실행 시작 → 전원 OFF or 회복불가 Error로 인한 중단전까지 계속 반복됨

두 개의 부사이클(subcycle)로 분리

📍 인출사이클 (fetch cycle)
	- CPU → 기억장치로부터 명령어를 읽어오는 단계

📍 실행사이클 (execution cycle)
	- 명령어를 실행하는 단계

기본 명령어사이클

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

📍 프로그램카운터 (Program Counter : PC)
	- 다음에 인출(Fetch)할 명령어의 주소를 가지고있는 레지스터
    - 명령어 인출 후 → 자동적으로 일정크기만큼 증가 (한 명령어길이)
    - 분기명령어(branch) 실행 → 목적지 주소로 갱신

📍 누산기 (Accumulator : AC)
	- 데이터를 일시적으로 저장하는 레지스터
    - 레지스터길이 = CPU가 한번에 처리할 수 있는 데이터 bit수 (단어길이 32bit, 64bit)

📍 명령어레지스터 (Instruction Register : IR)
	- 가장 최근에 인출된 명령어코드가 저장되어있는 레지스터

📍 기억장치주소레지스터 (Memory Address Register : MAR)
	- PC에 저장된 명령어주소 → 시스템 주소버스로 출력되기 전,
      일시적으로 저장되는 주소레지스터

📍 기억장치버퍼레지스터 (Memory Buffer Register : MBR)
	- 기억장치에 쓰여질 데이터 + 기억장치로부터 읽혀진 데이터
    - 일시적으로 저장하는 버퍼레지스터

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


2️⃣ 인출사이클

인출사이클 마이크로연산(micro-operation)

📍 t₀ : MAR ← PC
📍 t₁ : MBR ← M[MAR], PC ← PC + 1
📍 t₂ : IR ← MBR

(t₀, t₁, t₂ → CPU 클럭주기)
  • [첫번째주기] 현재 PC 내용 → CPU 내부버스 → MAR로 전송
    • (PC : 다음에 인출할 명령어 주소 가지고있는 레지스터)
    • (MAR : PC 명령어주소 → 시스템주소버스로 출력되기 전, 일시적으로 저장되는 주소레지스터)
  • [두번째주기] 기억장치 위치로부터 읽혀진 명령어 → 데이터버스 → MBR로 적재 PC내용 + 1
    • (MBR : 기억장치에서 읽혀진 데이터 일시적저장)
  • [세번째주기] MBR에 명령어코드 → IR로 이동
    • (IR : 가장 최신에 인출된 명령어코드저장)
📍 CPU 클럭주파수 = 1GHz (클럭주기 = 1ns)
	➡️ 인출사이클 : 1ns × 3 = 3ns 소요

인출사이클 주소 및 명령어흐름도


3️⃣ 실행사이클

👾 실행사이클 : 명령어코드 해독 (Decode) → 그 결과에 따라 필요한 연산들 수행

CPU가 수행하는 연산종류

  • 데이터이동 : CPU ↔︎ 기억장치, CPU ↔︎ I/O장치 → 데이터이동
  • 데이터처리 : 데이터 산술연산, 논리연산
  • 데이터저장 : 연산결과 데이터, 입력장치 데이터 → 기억장치에 저장
  • 프로그램제어 : 프로그램 실행순서 결정

실행사이클 마이크로연산(micro-operation) : 명령어의 연산코드(op code)에 의해 결정됨

📍 연산코드 (operation code)
	- CPU가 수행할 연산을 지정

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

📎 LOAD addr 명령어

📍 LOAD addr
	- 기억장치에 저장되어있는 데이터 → CPU 내부 레지스터 AC로 이동하는 명령어
    - AC : 누산기 (데이터 일시적 저장)

	t₀ : MAR ← IR(addr)
    t₁ : MBR ← M[MAR]
    t₂ : AC ← MBR
주기과정
첫번째주기(명령어레지스터)IR → 명령어 주소 → (기억장치주소레지스터)MAR
두번째주기기억장소 → 데이터인출 → (기억장치버퍼레지스터)MBR
세번째주기(기억장치버퍼레지스터)MBR 데이터 → (누산기)AC 적재

📎 STA addr 명령어

📍 STA addr 명령어
	- AC 레지스터 내용 → 기억장치에 저장하는 명령어
    
    t₀ : MAR ← IR(addr)
    t₁ : MBR ← AC
    t₂ : M[MAR] ← MBR
주기과정
첫번째주기(명령어레지스터)IR → 데이터 저장할 기억장치 주소 → (기억장치주소레지스터)MAR
두번째주기(누산기)AC → 저장할 데이터 → (기억장치버퍼레지스터)MBR
세번째주기(기억장치버퍼레지스터)MBR → 저장할 데이터 → (기억장치주소레지스터)MAR 지정 기억장소에 저장

📎 ADD addr 명령어

📍 ADD addr 명령어
	- 기억장치에 저장된 데이터 → AC 내용과 더함
    - 더한 결과 → 다시 AC에 저장하는 명령어
    
    t₀ : MAR ← IR(addr)
    t₁ : MBR ← M[MAR]
    t₂ : AC ← AC + MBR
주기과정
첫번째주기(명령어레지스터)IR → 데이터 불러올 기억장치 주소 → (기억장치주소레지스터)MAR
두번째주기불러온 데이터 → (기억장치버퍼레지스터)MBR
세번째주기불러온 데이터 + 기존 (누산기)AC 데이터 → 결과값 (누산기)AC 재저장

📎 JUMP addr 명령어

📍 JUMP addr 명령어
	- 오퍼랜드(addr)가 가리키는 위치의 명령어
    - 실행순서를 변경하는 분기(branch) 명령어
    
    t₀ : PC ← IR(addr)
주기과정
첫번째주기명령어의 오퍼랜드(분기할 목적지 주소) → (프로그램카운터)PC에 저장
다음 명령어 인출사이클 → addr 주소의 명령어 인출

4️⃣ 어셈블리프로그램 실행과정

연산코드 임의 정수 배정

어셈블리언어정수
LOAD (기억장치 → AC)1
STA (AC → 기억장치)2
ADD (기억장치데이터 → AC + 불러온데이터 → AC 재저장)5
JUMP (addr 위치 명령어 실행)8

주소명령어기계코드
100LOAD 2501250
101ADD 2515251
102STA 2512251
103JUMP 1708170

LOAD 250 실행

  • 100번지 명령어코드 인출 → (명령어레지스터)IR에 저장
  • 250번지 데이터 → (누산기)AC 적재
  • PC += 1 → 101

ADD 251 실행

  • 101번지 명령어코드 인출 → (명령어레지스터)IR에 저장
  • 기존 (누산기)AC 데이터 + 251번지 데이터 → 결과 (누산기)AC 재적재
  • PC += 1 → 102

STA 251 실행

  • 102번지 명령어코드 인출 → (명령어레지스터)IR에 저장
  • (누산기)AC 데이터 → 251번지에 저장
  • PC += 1 → 103

JUMP 170 실행

  • 103번지 명령어코드 인출 → (명령어레지스터)IR에 저장
  • 분기될 목적지주소 (IR 하위부분) 170 → (프로그램카운터)PC 적재
  • 다음 명령어 인출 사이클 → 170번지 명령어 인출

5️⃣ 인터럽트사이클

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

  • ① 프로그램 실행 중, CPU 현재 처리 순서 중단 ⛔️
  • 다른 동작을 먼저 수행하도록 요구하는 시스템동작
📍 인터럽트 서비스 루틴 (ISR)
	- Interrupt 처리를 위해 수행되는 프로그램루틴

Interrupt에 의한 제어의 이동

Interrupt 처리과정

📍 CPU
	- 어떤 장치가 interrupt 요청했는지 확인 → 해당 ISR 호출
	- 서비스 종료 후 → 중단되었던 원래 프로그램 다시 수행
   
📍 CPU Interrupt 처리의 세부동작
	① 현재 명령어 실행 끝낸 즉시 → 다음 실행 명령어 주소 (PC내용) 스택에 저장
    - 스택 : 데이터를 순차적으로 쌓아 가장 나중에 쌓은 스택이 가장 먼저 쓰임
    - (주기억장치의 특정부분)
    ② ISR 호출을 위해, 루틴 시작주소를 PC 적재
    - 시작주소 : Interrupt 요구 장치로부터 전송 or 미리정해진값

Interrupt 사이클 마이크로연산

t₀ : MBR ← PC
t₁ : MAR ← SP, PC ← ISR 시작주소
t₂ : M[MAR] ← MBR
주기과정
첫번째주기(프로그램카운터)PC → 다음인출할 명령어주소 → (기억장치버퍼레지스터)MBR
두번째주기① (Interrupt stack top address)SP → (기억장치주소레지스터)MAR
② (프로그램카운터)PC → 다음인출할 명령어주소 → ISR 시작주소로 변경
세번째주기(기억장치버퍼레지스터)MBR → 원래 PC 내용 → 스택에 저장

Interrupt 사이클 마이크로연산 예시

📍 LOAD 250 명령어 실행 중, Interrupt 들어옴
📍 현재 SP = 999
📍 Interrupt ISR = 650 번지

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

6️⃣ 다중인터럽트

👾 다중인터럽트(multiple interrupt) : 인터럽트 서비스 루틴 수행 중, 다른 인터럽트 발생

다중인터럽트 처리방법

  • ① 새로운 인터럽트 사이클 수행 ⛔️

    • 인터럽트플래그(interrupt flag) ← 0 : 인터럽트 불가능상(interrupt disabled)
    • 시스템 운영상 중요한 프로그램 or 도중에 중단할 수 없는 데이터 입출력 인터럽트 처리시 사용
  • ② 인터럽트 우선순위 설정

    • 우선순위 낮은 인터럽트 처리 → 우선순위 높은 인터럽트 요청
      ➡️ 현재 인터럽트 중단, 새로운 인터럽트 먼저처리

7️⃣ 간접사이클

👾 간접사이클(Indirect cycle) : 명령어에 포함되어있는 주소 → 해당 명령어 실행에 필요한 데이터의 주소를 인출하는 사이클

  • 간접주소지정방식(indirect addressing mode) 사용
  • 인출사이클 ↔︎ 실행사이클 사이에 위치

간접사이클 마이크로연산

t₀ : MAR ← IR(addr)
t₁ : MBR ← M[MAR]
t₂ : IR(addr) ← MBR
  • 인출된 명령어 주소필드 → 기억장치로부터 데이터의 실제주소 인출 → (기억장치버퍼레지스터)IR 주소필드에 저장
profile
🐱Sunyeon-Jeong, mallang developer🐰

1개의 댓글

comment-user-thumbnail
2023년 7월 2일

데이터과학을 공부 하면서 컴퓨터 하드웨어가 데이터를 어떻게 처리하는 지 궁금했었는데, 잘 요약해주셔서 유익 했슴다..!

답글 달기