[컴퓨터구조론_생능] ch02 개념정리

728x90

ch02. CPU 구조와 기능

-CPU 기본 동작 : 기억장치에 저장된 명령어( 프로그램 코드)를 실행하는 프로그램 수행

-CPU가 프로그램 수행을 위해 해야 하는 세부 동작 5가지

 

[CPU 세부 동작 기능] (5)

1) 명령어 인출 : 기억장치로부터 명령어 읽어옴

2) 명령어 해독 : 수행할 동작 결정 위해 명령어 해독

         // 모든 명령어에 공통 수행 동작

3) 데이터 인출 : 동작 수행 시 필요한 데이터 (기억장치 OR I/O장치)에서 읽어옴

4) 데이터 처리 : 데이터에 산술,논리 연산 수행

5) 데이터 저장 : 수행한 결과 데이터를 저장

            // 필요에 따라 수행 동작


2-1. CPU 기본 구조

[CPU 내부 구성 요소] (3)

1) ALU (산술논리연산장치)

: 산술,논리 연산 수행 회로들로 구성된 하드웨어 모듈

2) 레지스터 : CPU 내부에 위치한 기억장치

: 기억장치 중 가장 속도 빠르다

-일반 목적 레지스터

-특수 목적 레지스터

3) 제어 유니트

: 명령어 프로그램 코드 해석 후 동작 수행 위한 제어신호 순차 발생시키는 하드웨어 모듈

+ ) CPU 내부 버스

: 데이터와 제어신호전송통로, CPU 내부 구성 요소 간 통로

: 내부 버스 선들은 외부 시스템 버스와 직접 연결X

: 반드시 버퍼 레지스터 OR 인터페이스 회로 통하여 시스템 버스와 연결됨


2-2. 명령어 실행

-CPU는 기억장치에 저장된 명령어 인출 후 실행 처리 작업 수행

[명령어 사이클]

: CPU가 한 개의 명령어 실행에 필요한 전체 과정 사이클

시작 -> 명령어 인출 -> 명령어 실행 -> 중단

[인출 사이클] [실행 사이클]

[CPU 내부 특수 목적 레지스터] (5) : 명령어 실행 위해 필요

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

: 다음에 인출될 명령어 주소 가지고 있는 레지스터

: 각 명령어 인출된 후 자동 일정 크기증가

2) AC (Accumulator) : 누산기

: 연산에 사용될 데이터 일시적 저장하는 레지스터

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

: 가장 최근 인출된 명령어 저장된 레지스터

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

: PC에 저장된 명령어 주소가 시스템 주소버스 가기 전에 일시적 (저장) 경유 주소 레지스터

: MARCPU 내부 주소 버스 <-> 외부 시스템 주소 버스 사이에서 주소 버퍼 역할

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

: 기억장치에 저장될/ 기억장치로부터 읽혀진 데이터가 일시(저장) 경유되는 버퍼 레지스터

: MBRCPU 내부 데이터 버스 <-> 외부 시스템 데이터 버스 사이에서 데이터 버퍼 역할

*버퍼 : 메모리 간 속도 차이 줄이기 위해 존재

(1) [인출 사이클]

: CPUPC 내용(다음 주소) 토대로 기억장치 속 특정 위치의 명령어 읽어오는 과정

: PC -> 최종 IR에 적재

 

t0 :MAR <- PC

t1 :MBR <- MAR , PC <- PC + 1

t2 :IR <- MBR

1클록 주기 = 1ns

인출 사이크 클록 개수 : 3(t0, t1, t2)

인출 시간 = 1ns X 3 = 3ns

 

(2) [실행 사이클]

: CPU가 명령어 해독 후, 그에 필요한 연산 수행하는 과정

: 실행 사이클에서는 명령어 종류에 따라 마이크로 연산이 달라지므로 분류해서 보자

<CPU 수행 연산 종류 (4) >

(1) 데이터 이동 : CPU <-> 메모리 사이/CPU <-> I.O장치 사이 데이터 이동

(2) 데이터 처리 : 데이터에 대한 연산 수행

(3) 데이터 저장 : 데이터를 기억장치[M]에 저장

(4) 프로그램 제어 : 프로그램 실행 순서 결정

 

[[ 실행 사이클 종류 (4) ]]

 

데이터 이동 (실행 사이클)

: 데이터 이동 (addr 속 내용) -> AC

: IR -> 최종 AC 로 데이터 이동

 

Load (addr) 명령어 실행 : Load(이동)

t0: MAR <- IR(addr) // 인출 사이클에서 IR에 적재된 명령어 주소를 MAR 거쳐 M으로 보냄

t1: MBR <- M(MAR) // 기억장치 속 주소에서 데이터 인출 후 MBR로 보냄

t2: AC <- MBR //MBR에서 AC 데이터 누산기로 데이터 적재

데이터 저장 (실행 사이클)

: IR(주소) -> AC(데이터) -> 최종 M(기억장치)에 데이터 저장

 

STA(addr) 명령어 실행 : STA (storage) 저장

t0: MAR <- IR(addr) //데이터 저장할 주소 내용 MAR 거쳐서 M(기억장치)로 보냄

t1: MBR <- AC // AC 속 데이터를 MBR 거쳐서 M(기억장치)로 보냄

t2: M[MAR] <- MBR // 결과적으로 주소, 데이터 모두 기억장치에 보내진 상태인데,

기억장치 속에 저장해둔 주소 내용과 저장할 데이터 내용 모두 읽고 그 주소에 데이터 내용을 저장시킴

 

데이터 처리 (실행 사이클)

: IR -> 데이터 연산 결과값 -> 최종 AC에 적재

 

ADD(addr) 명령어 실행

t0: MAR <- IR(addr) // 연산 대상 데이터의 주소를 M으로 보냄

t1: MBR <- M(MAR) // M의 해당 주소에서 연산할 데이터 인출 후 MBR로 보냄

t2: AC <- AC + MBR //MBR 속 데이터와 기존 AC의 데이터를 ALU에 보내 연산 처리 후

-> 연산 결과값은 다시 AC에 결과 적재

 

프로그램 제어(분기 명령어)

: 보통 명령어들은 순서대로 PC 내용 읽어서 차례로 실행된 후, PC+! 시킴

만약 다른 위치로 분기시켜서 프로그램 실행 순서 바꿀 경우 분기 명령어사용

 

JUMP(addr) 명령어 실행

t0: PC <-IR(addr) // 다음 실행 주소 저장하는 PC에 분기될 주소 넣어

현재 실행 마친 뒤 다음 실행이 분기 주소에서 이루어지도록 함

 

[어셈블리 프로그램 실행 과정 예시]

*어셈블리 = 중간 언어

*임의로 코드 지정 : LOAD = 1, STORE = 2, ADD = 5, JUMP = 8

 

PC(100) 1250 : 기억장치 250번지 내용을 AC에 적재 후, : LOAD (250)

PC(101) 5251 : 기억장치 251번지 내용과 더하고, (ADD) : ADD (251)

PC(102) 2251 : 결과값을 251번지에 저장 후, (STA) : STA(251)

PC(103) 8170 : 170번지로 점프하는 프로그램 (JUMP) : JUMP(170)

 

[단계 1] : LOAD 명령어 인출

:현재 PC는 첫 번째 명령어(1250)100번지에 갖고 있다. 1250 = Load(250)

PC 100번지의 내용인 ‘LOAD’ 명령어 인출되어 IR(명령어 레지스터)에 적재된다.

 

[단계 2] : LOAD 명령어 실행

: IR에 적재된 명령어 해독하여 250번지 속 데이터를 AC로 이동시켜서 LOAD 실행 완료

: PC 내용은 다음 실행을 위해 +1 증가되어 101번지 가리키게 된다.

 

[단계 3] : ADD 명령어 인출

: 현재 PC는 두 번째 명령어(5251)101번지에 갖고 있다. 5251 = ADD(251)

PC 101번지의 내용인 ‘ADD’명령어 인출되어 IR에 적재된다.

 

[단계 4] : ADD 명령어 실행

: IR에 적재된 명령어 해독하여 251번지의 내용 + AC 내용 (ALU에서 연산 ) ,

연산결과를 다시 AC에 적재시켜 ADD 실행 완료

: PC 내용은 다음 실행을 위해 +1 증가되어 102번지 가리키게 된다.

 

[단계 5] : STA 명령어 인출

: 현재 PC는 세 번째 명령어(2251)102번지에 갖고 있다. 2251 = STA(251)

PC 102번지의 내용인 ‘STA’명령어 인출되어 IR에 적재된다.

 

[단계 6] : STA 명령어 실행

: IR에 적재된 명령어 해독하여 현재 AC내용 -> M[251번지]에 저장시켜 STA 실행 완료

: PC 내용은 다음 실행을 위해 +1 증가되어 103번지 가리키게 된다.

 

[단계 7] : JUMP 명령어 인출

: 현재 PC는 네 번째 명령어(8170)103번지에 갖고 있다. 8170 = JUMP(170)

PC 103번지의 내용인 ‘JUMP’명령어 인출되어 IR에 적재된다.

 

[단계 8] : JUMP 명령어 실행

:IR에 적재된 명령어 해독하여 분기 목적 주소 170번지를 PC내용에 저장. JUMP 실행 완료

이 다음 실행 시 PC내용에 저장된 분기 주소로 가서 실행 시작

 

(3) [인터럽트 사이클]

인터럽트 사이클

:인터럽트 요구 신호 검사하고 현재 PC내용은 복귀주소로서 스택에 저장한 후

인터럽트 ISR 시작 주소를 PC내용에 적재시키는 과정

 

: CPU가 순차적으로 프로그램 수행하는 도중//

외부에서 인터럽트 요구가 들어오면 CPU는 기존 프로그램 수행까지만 수행한 뒤 ,

인터럽트 요구를 우선 처리하기 위해 ISR(인터럽트 서비스 루틴) 프로그램 우선 수행한다.

: 이후 인터럽트 처리 끝나면 CPU는 기존 프로그램으로 복귀하여 기존 수행 지속한다.

 

t0: MBR <- PC //현재 PC내용(복귀주소) 데이터 취급하여 MBR로 보냄

t1: MAR <- SP, PC <- ISR 시작 주소 //SP가 가리키는 스택 주소를 MAR로 보냄

// 동시에 ISR 시작 주소는 비어있는 PC 내용에 보냄

t2: M[MAR] <- MBR, SP <- SP-1 //MBR 속 복귀주소를 MAR 속 스택 주소에 임시 저장

// 동시에 SP는 다음 수행 위해 SP-1 처리

 

[스택 VS SP(스택 포인터) ]

스택 : 주기억장치의 특정 부분에 위치

: 메인 메모리의 일부분을 따와서 아래부터 차례로 데이터 저장

 

SP : CPU 내부 레지스터 중 하나

: 스택의 최상위 주소 가리키며, CPU 내부 특수 목적 레지스터 중 하나

 

+ [다중 인터럽트]

인터럽트 서비스 루틴 실행 도중에 또 인터럽트 요구가 중복되어 들어온 경우

 

<다중 인터럽트 처리방법 (2) >

1) 인터럽트 불가능 상태로 만듦

: 새로운 인터럽트 요구 들어오더라도 인터럽트 불가능 상태로 만들어두면

인터럽트 사이클 수행 X

 

2) 인터럽트 우선순위 정함

: 우선순위 높은 인터럽트 우선 수행

: 우선순위 동일한 경우에는 먼저 수행하던 인터럽트 처리 후 나중 인터럽트 처리

 

(4) [간접 사이클]

: 인출 사이클에서 읽어온 주소 속에 간접 주소 저장된 경우에 한해서 실행되는 사이클

: 실행 사이클에서 사용될 실제 데이터의 주소를 기억장치로부터 읽어오는 사이클

: 인출 사이클과 실행 사이클 사이에 존재

 

t0: MAR <- IR(addr) //간접 주소 MAR로 보냄

t1: MBR <- M[MAR] //MAR 따라가 기억장치 속 실제 주소값 읽어 MBR 보냄

t2: IR(addr) <-MBR //MBR 속 실제 주소값을 다시 IR에 적재

 

2-3. 명령어 파이프라이닝

*파이프라인 : 기존 하드웨어 쪼개서 속도향상 도모

 

[명령어 파이프라이닝] : 속도 향상 목적 CPU 성능 높이는 기술

: 명령어 실행에 사용되는 하드웨어를 여러 개의 독립적인 단계로 분할시켜

각 단계들이 병렬로 동시 수행되도록 만든다.

(동시에 서로 다른 명령어 처리 가능해져서 속도 향상 가능케 하는 기술)

(1) 2단계 명령어 파이프라인

 

[문제점]

: 명령어의 인출과 실행 처리 시간 동일한 경우에 한해서만 속도향상이 가능

: 만약 처리시간 동일하지 않다면 되려 파이프라인 효율 저하

 

[해결책]

: 파이프라인 단계 수를 증가시켜 각 단계 처리시간을 같게 만들어준다.

: 처리 시간이 더 긴 파이프라인 단계를 여러 개로 분할함으로써

단계들의 처리시간 거의 같도록 만드는 것

 

(2) 4단계 명령어 파이프 라인

 

-명령어 인출(IF) 단계 : 다음 명령어를 기억장치로부터 인출

 

-명령어 해독(ID) 단계 : 해독기 이용하여 명령어 해독

 

-오퍼랜드 인출(OF) 단계 : 기억장치로부터 오퍼랜드 인출

 

-실행(EX) 단계 : 지정된 연산 수행

[파이프라인에 의한 전체 명령어 실행 시간]

 

- 파이프라인 단계 수 : K

실행할 명령어들의 수 : N

 

(가정: 각 파이프라인 단계가 한 클럭 주기씩 걸린다고 가정하자 )

 

< 전체 명령어 실행 시간 Tk > : 파이프라인 O

 

Tk = k + (N 1)

 

: 첫 번째 명령어 실행 시 k주기 걸리지만,

나머지 (N=1) 개 명령어들은 한 주기마다 실행이 끝나기 때문.

 

< 기본 명령어 실행 시간 T1> : 파이프라인 X

 

T1 = k X N

 

< 파이프라인 사용에 의한 속도 향상 Sp>

Sp = T1 / Tk =

[파이프라인 효율 저하 원인]

: 이론 상의 속도 효율이 그대로 나타나지 않는 요인

 

모든 명령어들이 파이프라인 단계들을 모두 거치지는 않는다.

ex. 어떤 명령어의 경우, 오퍼랜드 인출할 필요가 없는데 파이프라인 단순화시키기 위해

불필요하게 소모되는 시간 발생

 

파이프라인의 클록은 처리 시간이 가장 오래 걸리는 단계를 기준으로 결정한다.

, 시간 소모 가져옴 (-> 해결법 : 슈퍼파이프라이닝 )

 

IF단계와 OF단계가 동시에 기억장치 액세스할 경우, ‘기억장치 충돌발생되어 지연된다

동시 액세스 불가능하기 때문에 하나는 지연이 불가피

(-> 해결법 : 캐시)

 

중간에 조건분기명령어 실행되면 미리 인출하여 처리해둔 명령어들이 무효화된다.

 

[분기 발생에 의한 성능 저하 최소화 방법]

 

분기 예측

: 분기 언제 일어날 것인지 미리 예측하여 어느 경로의 명령어 인출할지 미리 결정하는 방법

 

분기 목적지 선인출

: 조건 분기가 인식되면, 분기명령어의 다음 명령어 뿐 아니라,

분기의 목적지 명령어도 함께 인출하는 방법

 

루프 버퍼 사용

: 파이프라인의 명령어인출 단계에 포함되어 있는 작은 고속 기억장치인 루프 버퍼에

가장 최근 인출된 n개 명령어 순서대로 젖아해두는 방법

 

지연 분기

: 프로그램 내부 분기 명령어 위치를 재배치함으로써 파이프라인 성능 개선하는 방법

 

 

[상태 레지스터]

: 조건 분기 명령어가 사용할 조건 플래그들 저장 R 레지스터

: 플래그 통해서 CPU 내의 상태를 보여주는 장치

*플래그 : 조건 상태 나타내는 비트

 

부호(S) 플래그 : 직전 수행된 산술연산 결과값의 부호비트에 ( + : 0// - : -1) 저장

제로(Z) 영 플래그 : 연산 결과값이 0이면 플래그를 1로 세팅

올림수(C) 플래그 : 올림수 발생시 플래그 1로 세팅

동등(E) 플래그: 두 수 비교한 결과

(A-B = 0) 두 수 같게 나왔을 경우 플래그 1로 세팅

오버플로그(V) 플래그 : 산술 연산 과저에서 오버플로우(에러) 발생 시 플래그 1로 세팅

인터럽트(I) 플래그

인터럽트 가능 상태 : 0 세팅

인터럽트 불가능 상태 : 1 세팅

-슈퍼바이저(P) 플래그 : CPU 실행모드가 슈퍼바이저 모드이면 1로 세팅

사용자 모드이면 0 세팅

 

(3) 슈퍼스칼라

: CPU 처리 속도 더욱 높이기 위해

내부에 여러 개의 명령어 파이프라인들을 덧붙여 포함시킨 구조 \

 

파이프라인 수 = m

-> m-wqy 슈퍼스칼라 로 부름

 

<일반 파이프라인 실행> : 단일 파이프라인

 

<2-way 슈퍼스칼라 실행> : 파이프라인 2개씩 덧붙임

N : 실행할 명령어의 수

K : 주기

m: 파이프라인 수

 

< 단일 파이프라인 실행 시간 T1>

T1 = k + (N 1)

<m-wqy 슈퍼스칼라 실행 시간 Tk>

Tk = k + (N-m / m)

< 슈퍼스칼라에 의한 속도향상 Sp >

Sp = T1 / Tm =

(4) 멀티-코어

: CPU 코어 여러 개를 하나의 칩에 넣은 것

ex) 칩에 2개 코어 삽입 : 듀얼-코어 프로세서

ex) 칩에 4개 코어 삽입 : 쿼드-코어 프로세서

 

: CPU 코어는 별도의 하드웨어 모듈로 구현된 하나의 칩에 포함되는데,

CPU 코어는 프로그램 실행 독립적 수행하여 동시 처리 가능 O

 

*CPU 코어 (ex. ALU, 레지스터 세트 등)

: CPU 칩 내부 회로 중에서 명령어 실행에 반드시 필요한 핵심 부분들로 이루어진 하드웨어 모듈


2-4. 명령어 세트

[명령어 세트]

: 어떤 CPU를 위해 정의되어 있는 명령어들의 집합

<명령어 세트 설계 위해 결정되어야 할 사항들>

 

연산 종류 : CPU 가 수행할 연산들의 종류

데이터 유형 : 연산 수행될 데이터 유형

명령어 형식 : 명령어 길이

주소지정 방식: 오퍼랜드 주소 지정 방식

(1) 연산의 종류

이동

- 데이터 전송

: 레지스터와 레지스터 간, 레지스터와 기억장치 간, 기억장치와 기억장치 간

데이터를 이동하는 동작

- 입출력(I/O)

: CPU와 외부(I/O장치) 간 데이터 이동하는 동작

연산

- 산술 연산 : 기본 연산

- 논리 연산 : AND/OR/NOT 논리 연산

제어

-프로그램 제어 : 명령어 실행 순서 바꾸는 연산 ex분기연산, 서브루틴 호출

CALL : 현재 PC 내용 복귀주소로 스택에 저장시키고 호출 주소로 가서 모두 실행 후//

RET : 스택 Pop 연산해서 복귀 주소 가져와서 복귀

(2) 명령어 형식

op코드 오퍼랜드 다음주소

 

<명령어 형식 기본 요소>

연산코드 (op코드) : 수행될 연산 지정 (ex. LOAD, ADD ...)

오퍼랜드 : 연산 수행에 필요한 데이터의 주소

다음 명령어 주소 : 현재 명령어 실행 이후, 다음 인출할 명령어 위치

 

(3) 주소 지정 방식

: 명령어 실행에 필요한 오퍼랜드(데이터)의 주소 결정하는 방식

 

직접, 간접 / 묵시적, 즉시 / 레지스터, 레지스터 간접 / 변위 주소 지정

 

직접 주소지정 방식

: 명령어 내 오퍼랜드 필드 내용 = 실제 데이터 주소 그대로 저장됨

 

EA = A

(장점) : 데이터 인출 시 1번만 액세스

(단점) : 연산코드 제외하고 남은 비트만으로 주소비트 사용 가능하기에

직접 지정할 수 있는 기억장소의 수는 제한된다.

 

간접 주소지정 방식

: 명령어 내 오퍼랜드 필드 내용 = 간접 주소 저장됨

 

EA = (A)

(장점) : 주소 지정 가능한 기억장치 용량이 확장됨

(단점) : 액세스 2번 필요함

묵시적 주소지정 방식

: 명령어 실행에 필요한 데이터의 위치가 이미 묵시적으로 정해져 있는 방식

(장점) : 오퍼랜드가 없거나 1개 뿐이므로 명령어 길이 짧다

(단점) : 명령어 종류 제한된다.

즉시 주소지정 방식

: 명령어 내 오퍼랜드 필드 내용 = 실제 데이터 자체를 저장

: 메모리 갈 필요 없이 데이터를 명령어 코드 자체에 포함하고 있다.

 

(장점) : 데이터 인출을 위해 메모리에 갈 필요X. 실행 사이클 단축된다.

(단점) : 사용할 수 있는 상수값의 크기는 제한됨

-> 오퍼랜드 필드에 실제 데이터 저장시키므로 배정되는 비트 수 제한

레지스터 주소지정 방식

: 연산에 사용될 데이터가 내부 레지스터에 저장되어 있음

: 명령어의 오퍼랜드 내용 = 해당 레지스터 번호 저장

EA = R

(장점) ; 레지스터는 CPU 내부에 있기 때문에 굳이 메모리까지 들릴 이유 X,

: 명령어 실행 시간 짧아진다.

(단점) : 데이터 저장될 수 있는 위치가 CPU 내부 레지스터로 제한된다.

레지스터 간접 주소지정 방식

: 오퍼랜드 필드가 가리키는 지정된 레지스터 내용을

다시 유효주소로 활용하여 기억장치에 가서 실제 데이터 인출하는 방식

EA = (R)

(장점) : 주소 지정 영역이 앞선 방식에 비해서는 확장됐다.

변위 주소지정 방식

: ‘기준 주소기준으로 상대적 위치 나타냄

: 직접 주소지정 방식과 레지스터 간접 주소지정 방식 조합하여 유효주소를 결정하는 방식

i) 상대 주소지정 방식

: PC 레지스터 사용

-> PC 내용 + 변위 A 더하여 유효주소결정

EA = (PC) + A

ii) 인덱스 주소지정 방식

: IX(인덱스) 레지스터 사용

: 주요 용도 = 배열 데이터 액세스

-> IX 내용 + 변위 A 더하여 유효주소결정

EA= A + (IX)

iii) 베이스-레지스터 주소지정 방식

: BR(베이스) 레지스터 사용

: 주요 용도 = 프로그램 시작 위치 지정

-> BR 내용 + 변위 A 더하여 유효주소결정

 

EA = (BR) + A

728x90