공부/컴퓨터 구조

[Chap4] 중앙 처리 장치

esyeonge 2021. 5. 1. 00:56

01 프로세서 구성과 동작

[1] 컴퓨터 기본 구조와 프로세서

컴퓨터의 3가지 핵심 장치

;프로세서(Processor, CPU), 메모리, 입출력 장치

현대의 시스템 구조

; 폰 노이만이 만듦

  • 메모리 내장 방식
  • 프로그램 명령어 순차 실행

 

버스(Bus)

; 장치 간에 주소, 데이터, 제어 신호를 전송하기 위한 연결 통로(연결선)

  • 내부 버스(internal bus) : 프로세서 내부의 장치 연결
  • 시스템 버스(system bus) : 핵심 장치 및 주변 장치 연결

프로세서 = CPU

메모리 = 메모리

모니터, HDD, USB ... = I/O 장치

[2] 프로세서 구성 요소

산술 논리 연산 장치

; 산술 및 논리 연산 등 기본 연산을 수행

제어 장치

; 메모리에서 명령어를 가져와 해독하고 실행에 필요한 장치들을 제어하는 신호를 발생

레지스터 세트

; 프로세서 내에 존재하는 용량은 작지만 매우 빠른 메모리로 ALU의 연산과 관련된 데이터를 일시 저장하거나 특정 제어 정보 저장

  • 특수 레지스터 : PC나 IR처럼 특수 목적을 위한 것
    • PC(Program Counter) : 다음 실행할 명령어 주소 저장
    • IR(Intruction Register) : 현재 실행 중이 명령어를 가짐
    • 플래그 레지스터 : 연산 결과 정보 및 운영체제가 컴퓨터를 제어하는데 필요한 정보 저장
  • 범용 레지스터 : 데이터 임시 저장

[3] 프로세서 기본 구조

; 레지스터 세트(일반적으로 1~32개), ALU, CU, 이들 장치를 연결하는 버스로 구성

데이터 경로

ALU를 이용하여 오퍼랜드를 실행하고 결과를 저장하는 부분

CU : 제어장치

ALU : 연산장치

MAR, PC, IR, 레지스터 세트, MBR : 레지스터

 

이를 쉽게 표현하면 아래와 같다.

ALU

; 덧셈, 뺄셈 등 연산을 수행하고, 그 결과를 누산기(Accumulator, AC)에 저장

레지스터-메모리 명령

  • 메모리 워드를 레지스터로 가져옴(LOAD)
  • 레지스터의 데이터를 메모리에 다시 저장

레지스터-레지스터 명령

  • 레지스터에서 오퍼랜드 2개를 ALU의 입력 레지스터로 가져와 덧셈 또는 논리 AND 같은 몇 가지 연산을 수행
  • 연산 결과를 레지스터 중 하나에 다시 저장

[4] 프로세서 명령 실행

1단계 : 다음에 실행할 명령어를 메모리에서 읽어 명령 레지스터(IR)로 가져온다.

2단계 : 프로그램 카운터(PC)는 그 다음에 읽어올 명령어의 주소로 변경된다.

3단계 : 제어 장치는 방금 가져온 명령어를 해독(decode)하고 유형을 결정한다.

4단계 : 명령어가 메모리에 있는 데이터를 사용하는 경우 그 위치를 결정한다.

5단계 : 필요한 경우 데이터를 메모리에서 레지스터로 가져온다.

6단계 : 명령어를 실행한다.

7단계 : 1단계로 이동하여 다음 명령어 실행을 시작한다.

이 단계를 요약하면 인출(fetch)-해독(decode)-실행(execute) 사이클로 구성되며, 이를 주 사이클(main cycle)이라고 함

 

실행 속도의 빠름

단순한 명령어 여러 개 < 복잡한 명령어 1개

해독기

; 고가인 고성능 컴퓨터의 복잡한 명령어를 저가 컴퓨터에서 실행 가능하게 함

제어 기억 장치

; 빠른 읽기 전용 메모리

02 산술 논리 연산 장치

; 산술 연산과 논리 연산을 처리하는 프로세서의 일부

  • 주로 정수 연산을 처리
  • FPU(Floating-Point Unit) : 부동 소수 연산
  • 최근에는 ALU가 부동 소수 연산까지 처리(보조 프로세서를 사용하기도 함)

산술 연산

; 덧셈, 뺄셈, 곱셈, 나눗셈, 증가, 감소, 보수

논리 연산

; AND, OR, NOT, XOR, 시프트(shift)

 

[1] 산술 연산

  • 가산기(ADD) 기반 동작
  • 실제 회로에서는 캐리 전파로 일어나는 속도 지연 문제 때문에 덧셈 회로에 전가산기 대신 캐리 예측 가산기 사용
  • 2진수 곱셉은 부스 알고리즘 사용

Booth Algorithm

  • 피승수(곱해지는 수)와 승수(곱하는 수)를 곱한 결과는 AQ에 저장
  • A와 q0은 초기값으로 0을 설정
  • 연산 횟수인 n은 비트 수

예) (-7) * (+3)

-7(M) = 1001, 3(Q) = 0011

-M = 0111(1001의 2의 보수)

결론 1110 1011

[2] 논리 연산과 시프트 연산

 

시프트 연산

; 데이터를 좌우로 시프트

산술 시프트

; 빈자리는 부호로

논리 시프트

; 빈자리는 0으로

회전 시프트

; 로테이션

03 레지스터

; CPU가 사용하는 데이터와 명령어를 신속하게 읽어 오고 저장하고 전송

  • 메모리 계층의 최상위에 존재
  • 시스템에서 가장 빠른 메모리
  • 주기억 장치에서 데이터를 읽어 와 레지스터에 저장 후 처리가 끝나면 주기억 장치에 결과 저장

[2] 레지스터 종류

  • 메모리 주소 레지스터(MAR) : CPU가 읽고 쓰기 위한 데이터의 메모리 주소 저장
  • 메모리 버퍼 레지스터(MBR) : 메모리에서 데이터를 읽거나 메모리에 저장될 명령의 데이터를 일시 저장
    • 임시 저장된 명령어 내용 → 명령 레지스터로
    • 데이터 내용 → 누산기 or I/O 레지스터로
  • 입출력 주소 레지스터(I/O AR) : I/O장치의 주소를 지장
  • 입출력 버퍼 레지스터(I/O BR) : I/O 모듈과 CPU 사이에 교환되는 데이터를 일시적으로 저장
  • 프로그램 카운터(PC) : 다음에 실행할 명령어의 주소를 저장하는 레지스터
  • 명령어 레지스터(IR) : 기억장치로부터 읽어온 명령어를 수행하기 위하여 일시적으로 저장
  • 누산기(AC) : ALU 내부에 위치하며, ALU의 산술 연산과 논리 연산 과정에 사용
  • 스택 제어 레지스터 : 메모리 스택을 관리
  • 플래그 레지스터(FR) : CPU가 작동하는 동안 특정 조건의 발생을 표시
    • = 상태 레지스터(SR), 프로그램 상태 워드(PSW)
  • 데이터 레지스터(DR) : 주변 장치로, 또는 주변 장치로부터 전송되는 데이터를 일시적으로 저장하기 위해 프로세서에 사용되는 레지스터

[3] 레지스터 전송(LOAD, STORE, MOVE 명령 등)

 

수업 시간에 진행한 예를 통해 살펴보자.

MOVE는 연산 코드(opcode)

변수a, 20은 피연산자(operand)

이때 연산코드는 동작을 나타내고, 피연산자는 저장 공간을 나타낸다.

 

  • MOV 변수a 20은 상수 20을 변수 a에 저장하라는 것.

→ 즉 피연산자 1과 2가 있으면 동작 수행 후의 결과를 1에다가 저장한다.

 

주소 버스 : 접근할 주소를 알려줌

데이터 버스 : 값만 가져옴

제어 버스 : 읽기, 쓰기 등 어떤 행위를 할 지

 

쓰기 방향은 중앙처리장치 → 주기억장치

읽기 방향은 주기억장치 → 중앙처리장치

 

위의 경우에는 150번에서 500이라는 값을 읽어오는 것

 

그렇다면 위의 프로그램 코드를 아래의 그림처럼 나타낸 예를 살펴보자.

초기 설정은 위와 같다.

주소 레지스터는 PC, 명령어 레지스터는 IR이다.

 

101번에서 MOV 변수a 20이라는 명령어를 읽어온다.

 

명령을 수행하기 전에 PC의 값을 1 올린 후,

명령어 레지스터에 따라 변수 a의 주소인 105번에 20을 쓴다.

 

그런 다음 102번의 명령어를 읽어온다.

 

102번의 명령어를 읽어왔으니 PC를 +1 취해주고, 읽어온 명령어를 실행해준다.

읽어온 명령어는 105번의 값을 읽어온 후 레지스터A에 저장하는 것이다.

 

아래의 실행 과정들도 위처럼 진행된다.

 

04 명령어 형식

; 연산 코드(opcode), 오퍼랜드(operand), 피연산자 위치, 연산 결과의 저장 위치 등 여러 가지 정보로 구성

0-주소 명령어

; 연산에 필요한 오퍼랜드 및 결과의 저장 장소가 묵시적으로 지정된 경우 : stack을 갖는 구조

Stack의 동작 과정

  • LIFO : 가장 마지막에 입력된 것이 가장 먼저 출력됨
  • Top에 위치한 요소는 POP을 통해 스택에서 인출됨
  • 연산을 수행하고, 연산의 결과를 다시 스택에 저장되도록 PUSH
  • 결과 데이터 저장 후 Top은 가장 위로 이동

 

1-주소 명령어

; 연산 대상이 되는 2개 중 하나만 표현하고 나머지 하나는 묵시적으로 지정 : 누산기(AC)

  • 기억 장치 내의 데이터와 AC 내의 데이터로 연산 후 결과는 AC에 저장
  • ADD X ; AC ← AC + M[X] (X번지의 내용과 누산기의 내용을 더하여 결과를 다시 누산기에 저장)

cf) ; 는 주석 표시이다.

2-주소 명령어

; 연산에 필요한 두 오퍼랜드 중 하나가 결과 값을 저장

  • ADD R1, R2 ; R1 ← R1+R2

3-주소 명령어

; 연산에 필요한 오퍼랜드 2개와 결과 값의 저장 장소가 모두 다름

  • ADD R1, R2, R3 ; R1 ← R2+R3
  • 연산 후에도 입력 데이터를 보존함
  • 프로그램이 짧아지지만 명령어 해독 과정이 복잡해짐

0-주소, 1-주소, 2-주소, 3-주소 명령을 사용하여 Z=(B+C)*A를 구현한 예

  • ADD : 덧셈
  • MUL : 곱셈
  • MOV : 데이터 이동(레지스터와 기억 장치 간)
  • LOAD : 기억 장치에서 데이터를 읽어 누산기에 저장
  • STOR : AC의 내용을 기억 장치에 저장

[2] 명령어 종류

(1) 데이터 이동 명령

; 연산에 필요한 가장 기본이 되는 작업 : 원본과 동일한 새로운 객체를 만드는 복사(다른 장소에 복사본 생성)

  • 변수에 값 할당 : A=B는 메모리 주소 B의 값(데이터)을 A 장소로 복사한다는 의미.
  • 데이터의 효율적인 액세스 및 사용 : 메모리와 레지스터 간에 데이터를 이동하여 프로그램 실행을 효율적으로 수행
    • LOAD : 메모리에서 레지스터로
    • STORE : 레지스터에서 메모리로
    • MOVE : 하나의 레지스터에서 다른 레지스터로
    cf) 메모리 간 이동은 일반적으로 사용하지 X

(2) 2항 연산

; 산술 연산 및 논리 연산과 오퍼랜드 2개를 결합하여 결과 생성

  • AND 연산; 워드에서 특정 비트를 추출하는 용도로 사용
    B 마스크와 AND 결합을 통해 3번째 문자 추출 후 오른쪽으로 8비트 시프트 진행
  • ex) 8비트 문자가 4개 저장된 32비트 워드에서 3번째 문자만 남기고 오른쪽으로 8비트 시프트

(3) 단항 연산

; 오퍼랜드와 결과가 모두 1개

  • 2항 연산보다 명령이 짧지만, 명령에 다른 정보를 지정해야 할 때가 많다.
  • shift 연산 : 비트를 왼쪽이나 오른쪽으로 이동하는 작업으로 워드의 끝부분에서 비트 손실 발생
    • 2의 제곱수를 곱할 때와 나눌 때 사용함.
    • 왼쪽으로 시프트 되었을 때는 (원래 수)*(2^k), 오른쪽으로 시프트 되었을 때는 (원래 수)/(2^k)
    • 24*n에 대하여 계산

      → 24*n = (16+8)*n = 2^4*n + 2^3*n

      → n을 4비트 왼쪽 시프트하면 16*n, 3비트 시프트 하면 8*n

      최종 목적 : 산술 연산의 속도를 높이기 위함(곱셈보다 시프트 두 번 + 덧셈이 빠름)

  • rotate 연산 : 한쪽 끝에서 밀린 비트가 다른 쪽 끝에서 다시 나타나는 이동

(4) 비교와 조건 분기 명령어

  • 조건이 충족되면 특정 메모리 주소로 분기 - if; 특정 비트가 0인지 확인 or 음수인지 알아보기 위해 부호 비트 검사(1이면 분기)
  • 오버플로 비트; 산술 연산의 결과 데이터가 표현 범위를 벗어났을 때 1로 설정
  • 오버플로가 발생하면 에러 루틴 및 수정 조치를 취함
  • 캐리 비트; 맨 왼쪽 비트에서 데이터가 넘칠 때 세트
    • 다중 비트 연산 : 정수가 워드 2개 이상으로 표현되는 경우 연산을 수행하려면 캐리 비트 점검

(5) 프로시저 호출 명령

; 특정 작업을 수행하는 명령 그룹, 프로그램 내 어디서든 호출 가능

  • 서브루틴(어셈블리), 함수(C언어) 매서드(자바)

(6) 루프 제어 명령

; 명령 그룹을 정해진 횟수만큼 실행해야 하는 경우

  • for문

05 주소 지정 방식

주소 지정

; 오퍼랜드의 위치를 지정하는 것

(1) 즉시 주소 지정

; 오퍼랜드를 지정하는 가장 간단한 방법

  • 명령어 자체에 오퍼랜드를 포함
  • 오퍼랜드가 포함되어 명령어가 인출될 때 오퍼랜드도 자동으로 인출
  • 장점 : 오퍼랜드를 인출을 위한 메모리 참조가 필요 없음
  • 단점 : 상수만 가능, 상수 값의 크기가 필드 크기로 제한

(2) 직접 주소 지정

; 메모리에 위치한 오퍼랜드의 전체 주소 지정 → 실제 메모리에 있는 주소를 찾아서 넣어주는 것

  • 컴파일 할 때 알려진 주소의 전역 변수에 액세스하는 데만 사용 가능함

(3) 레지스터 주소 지정

; 가장 일반적인 주소 지정 방식으로 직접 주소 지정과 개념은 같고, 위치가 레지스터임

cf) 레지스터는 액세스가 빠르고 주소가 짧아서 많이 사용하는 방식임

  • LOAD나 STORE 명령어 사용→ 한 오퍼랜드는 레지스터고, 다른 한 오퍼랜드는 메모리 주소

(4) 레지스터 간접 주소 지정

; 직접 주소를 명령어에는 포함하지 않음 → 포인터를 이용 → 명령어에 전체 메모리 주소가 없어도 메모리 참조 가능

(5) 변위(offset) 주소 지정

; 특정 레지스터에 저장된 주소 오프셋을 더해 실제 오퍼랜드가 저장된 메모리 위치 지정

이때 특정 레지스터가 무엇인지에 따라 여러 주소 지정 방식이 가능함

ex) 인덱스 주소 지정 방식 → 인덱스 레지스터, 상대 주소 지정 방식 → PC

 

  • 인덱스 주소 지정

; 레지스터(명시적 또는 암시적)에 일정한 변위를 더해 메모리 주소 참조

  • R1, R2, R3의 3개의 레지스터 필요함
  • 명령어 루프에 4개 실행

(6) 간접 주소 지정

; 메모리 참조가 2번 이상 일어나는 경우 → 데이터를 가져오는 시간이 많이 소요됨

  • 프로세서와 주기억 장치 간의 속도 차가 많은 프로세서의 경우
    • 오퍼랜드 인출 시 오래 걸림 → 프로그램 수행 시간 증가

cf) 현재는 간접 주소 지정을 지원하는 프로세서는 거의 없음

 

(7) 묵시적 주소 지정

; 오퍼랜드의 소스나 목적지를 명시하지 않음 → 암묵적으로 알 수 있음

  • PUSH, POP등의 스택 관련 명령어 사용
    • PUSH R1 : 레지스터 R1의 값을 스택에 저장
    • POP : 스택의 TOP에 있는 값을 AC로 인출
  • 누산기를 소스나 목적지로 사용하는 경우에 생략 가능
 

Notion2Tistory

 

boltlessengineer.github.io

 

[출처]

1. 최신 컴퓨터 구조 - 디지털 논리부터 성능 분석까지,

'공부 > 컴퓨터 구조' 카테고리의 다른 글

[Chap6] 기억 장치  (0) 2021.05.09
[Chap5] 제어 장치  (0) 2021.05.01
[Chap3] 디지털 논리 회로  (0) 2021.05.01
[Chap2] 데이터의 표현(2)  (0) 2021.05.01
[Chap2] 데이터의 표현  (0) 2021.05.01