야금야금

#3 컴퓨터 구조 - 명령어를 효과적으로 처리하기 위한 기법 본문

SWING/컴퓨터구조

#3 컴퓨터 구조 - 명령어를 효과적으로 처리하기 위한 기법

hyk0425 2020. 5. 23. 18:58

지난 시간에는 명령어의 형식에 대해 공부하였다.

이번에는 명령어를 효과적으로 실행하기 위한 기법 3가지(주소 지정 방식 / 파이프라인 / 인터럽트)를 살펴보도록 하자

 

 


주소 지정 방식

주소 지정 방식은 주 기억장치에 데이터가 저장된 위치(=주소)를 피연산자 필드(=오퍼랜드 필드)를 사용하여 제공한다.

담을 수 있는 비트 수에 제한이 있기 때문에 효과적으로 명령어를 처리할 수 있는 다양한 주소 지정 방식이 사용된다.

 

주소 지정 방식 표기 방법

 

 

1) 직접 주소 지정 방식

: 가장 일반적인 개념의 간단한 주소 지정 방식으로 오퍼랜드 필드의 내용이 유효 주소가 되는 방식이다. (EA = A)

장점 : 데이터 인출을 위해 오퍼랜드에 저장된 해당 주소의 기억 장치에 한 번만 접근하고 명령어의 형식이 간단하다.

 

단점 : 연산 코드를 제외하고 남은 비트들이 주소 비트로 사용되기 때문에 지정할 수 있는 기억 장소의 수가 제한된다.

따라서 주소가 길면 지정할 수 없고 많은 수의 주소를 지정할 수 없다.

 

 

 

2) 레지스터 주소 지정 방식

: 연산에 사용할 데이터가 레지스터에 저장되어 있는 방식으로 오퍼랜드 필드의 내용이 레지스터 번호를 나타내며 유효 주소가 레지스터 번호가 된다. (EA = R)

 

 

장점 : 직접 주소 지정 방식과 달리 데이터가 레지스터에 존재하기 때문에 데이터 인출을 위하여 기억장치에 접근할 필요가 없다. 따라서 주 기억장치에 접근하는 것보다 접근 속도가 빠르다.

 

단점 : 데이트를 저장할 수 있는 공간이 CPU 내부의 레지스터로 제한된다.

 

 

 

위의 두 방식은 데이터의 주소가 오퍼랜드 필드에 저장되어 있어 한 번의 액세스로 데이터를 인출할 수 있었다.

다음은 두 번의 액세스로 데이터를 인출하는 방법에 대해 살펴보도록 하자

 

 

 

3) 간접 주소 지정 방식

: 직접 주소 지정 방식의 단점인 많은 수의 주소를 사용 할 수 없는 단점을 해결하기 위해 나온 방법으로 오퍼랜드 필드의 내용이 유효 주소의 주소가 되는 방식이다. (EA = (A))

 

 

 1단계 : 유효 주소의 주소 값을 읽기 위해 기억장치에 접근한다.

 

 2단계 : 실제 유효 주소에 접근하여 실질적인 데이터를 얻는다.

 

 

 

 

 

장점 : 최대 기억 장치 용량이 CPU가 한번에 액세스 할 수 있는 단어의 길이에 의해 결정된다. 기억장치 구조 변경 등을 통해 확장이 가능하고 명령어의 주소 필드의 길이가 짧고 제한되어 있어도 긴 주소에 접근이 가능하다.

 

단점 : 두 차례 기억장치 액세스가 필요하기 때문에 직접 주소 지정 방식보다 속도가 느리다. 또한 명령어 형식에서도 주소 지정 방식을 표시하는 간접 비트 필드가 필요하다. (어째튼 오퍼랜드로만 표현해야 하기 때문에 한계가 발생한다)

 

 

 

 ※ 직접 주소 지정 방식과 간접 주소 지정 방식의 구분법

I = 0 : 직접 주소 지정 방식

I = 1 : 간접 주소 지정 방식

 

 

 

 

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

: 오퍼랜드 필드가 레지스터 번호를 나타내며 해당 레지스터에 저장된 내용이 유효 주소가 되는 방식이다. (EA = (R))

레지스터의 크기에 따라 주소 지정 영역이 결정된다

ex ) 레지스터의 길이 : 16비트 => 주소 지정영역 :  2^16 비트 (=64바이트)

 

 

장점 : 많은 주소 공간을 활용할 수 있다.

 

단점 : 간접 주소 방식보다는 메모리 참조가 적게 일어나지만 여분의 메모리 참조가 필요하다.

 

 

 ※ 간접 주소 지정 방식과 레지스터 간접 주소 지정 방식 모두 두 번의 액세스 과정을 거치지만

간접 주소 지정 방식은 기억장치에 두 번 액세스하고 레지스터 간접 주소 지정 방식은 기억장치에 한 번만 액세스 한다

(CPU와 주기억장치의 속도 차이에 의해 주기억장치에 액세스 횟수가 적을수록 처리 속도가 빠르다)

 

 

5) 변위 주소 지정 방식

: 직접 주소 지정 방식과 레지스터 간접 주소 지정 방식을 조합한 방식으로 오퍼랜드가 레지스터 번호 필드와 변위 값 필드로 구성되고

오퍼랜드의 두 필드의 조합으로 유효 주소가 생성된다. (EA = (R) + A)

 

 

변위 주소 지정 방식은 사용하는 레지스터에 따라 다음과 같이 구분된다

- 상대 주소 지정 방식 (프로그램 카운터 사용)

- 인덱스 주소 지정 방식 (인덱스 레지스터 사용)

- 베이스 레지스터 주소 지정 방식 (베이스 레지스터 사용)

 

 

- 상대 주소 지정 방식

: 프로그램 카운터를 레지스터로 사용하며 주로 분기 명령어에서 사용된다. (EA = (PC) + A)

ex) 450 번지에 저장된 JUMP 명령어가 인출된 후에 PC 내용이 451이 된 경우,

=> A = +21인 경우 : 분기 목적지 주소는 472(451 + 21) 번지

=> A = -50인 경우 : 분기 목적지 주소는 401(451 - 50) 번지

 

 

- 인덱스 주소 지정 방식

: 인덱스 값을 저장하는 특수 레지스터인 인덱스 레지스터(IX)를 사용하며

인덱스 레지스터의 내용과 변위(A)를 더하여 유효 주소를 결정한다. (EA = (IX) + A)

명령어가 실행될 때마다 인덱스 레지스터의 내용이 자동적으로 증가 혹은 감소하며

명령어가 실행되면 아래의 연산이 연속적으로 수행된다.

EA = (IX) + A, IX <-IX +1

 

 

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

: 베이스 레지스터(BR)를 사용하며 베이스 레지스터의 내용과 변위(A)를 더하여 유효 주소를 결정한다. (EA = (BR) + A)

 

본 방식은 주로 기억장치 내의 프로그램의 위치를 지정하는 데 사용된다.

 


 

명령어 파이프 라인

하나의 명령어가 실행되는 도중에 다른 명령어 실행을 시작하는 방법으로 동시에 여러 개의 명령어를 실행하는 기법이다.

하나의 명령어를 여러 단계로 나누어서 병렬로 처리할 수 있기 때문에 처리 속도를 향상시킬 수 있다.

 

명령어 실행 단계에 따라 세 종류로 나뉜다

 

 

- 2단계 명령어 파이프 라인 [인출 / 실행]

: 명령어를 실행하는 하드웨어를 인출 단계(fetch stage)와 실행단계(execute stage)라는 두 개의 독립적인 파이프 라인 모듈로 분리하여 수행하는 방법

앞선 명령어의 인출 과정이 종료된 후 명령어 실행 과정과 함께 다음 명령어의 인출이 실행된다.

 

 

 

- 4단계 명령어 파이프 라인 [명령어 인출 / 명령어 해독 / 오퍼랜드 인출 / 명령어 실행]

: 명령을 실행하는 하드웨어를 명령어 인출 / 명령어 해독 / 오퍼랜드 인출 / 명령어 실행의 4단계로 구성하여 수행하는 방법

명령어 인출(IF, Instruction Fetch) 단계
: 명령어를 기억장치에서 인출하는 과정으로 프로그램 카운터에서 제시된 기억장치 주소에 근거해서 명령어를 인출하여 명령어 레지스터로 이동시키는 단계


명령어 해독(ID, Instruction Decode) 단계
: 명령어 해독기(decoder)를 이용하여 첫 번째 단계에서 인출된 명령어를 해석하는 단계


오퍼랜드 인출(OF, Operand Fetch) 단계
: 기억장치에서 오퍼랜드를 인출하는 단계로 오퍼랜드는 피연산자 부분으로 연산에 사용될 변수나 데이터를 지칭함


실행(EX, Execute) 단계
: 명령어에서 지정된 연산을 수행하는 단계

 

- 6단계 명령어 파이프 라인 [명령어 인출 / 명령어 해독 / 오퍼랜드 계산 / 오퍼랜드 인출 / 명령어 실행 / 오퍼랜드 저장]

: 명령을 실행하는 하드웨어를 명령어 인출 / 명령어 해독 / 오퍼랜드 계산 / 오퍼랜드 인출 / 명령어 실행 / 오퍼랜드 저장의 6단계로 구성하여 수행하는 방법

FI(Fetch Instruction) 단계 : 명령어 인출 단계

DI(Decode Instruction) 단계 : 명령어 해독 단계

CO(Calculate Operand) 단계 : 오퍼랜드 계산 단계

FO(Fetch Operand) 단계 : 오퍼랜드 인출 단계

EI(Execute Instruction) 단계 : 명령어 실행단계

WO(Write Operand) 단계 : 오퍼랜드 저장 단계, 연산된 결과를 저장하는 단계

 

 

파이프 라인에 의한 속도 향상

 

명령어 실행 시간 계산

 

k : 파이프 라인의 단계 수

N : 실행할 명령어들의 수

각 파이프 라인의 단계 : 한 클록 주기씩 소요됨

T : 파이프 라인을 적용했을 때, N개의 명령어를 실행하는데 소요되는 시간

T = k + (N - 1)

 

T' : 파이프 라인을 적용하지 않았을 때, N개의 명령어를 실행하는데 소요되는 시간

T' = k * N

 

파이프 라이닝에 의한 속도 향상은 다음과 같다

T'/T=(k*N)/(K+(N-1))

 

ex)

k = 4

N = 10

파이프라인 클록 = 1 MHz (각 파이프라인 단계에서의 소요시간 = 1㎲)

T = 4 + (10 - 1) = 13㎲

T' = (4 * 10) = 40㎲

 

파이프 라이닝에 의한 속도 향상 : 40 / 13  ≒ 3.08배

 

 


 

인터럽트

CPU가 현재 실행 중인 프로그램의 처리를 강제적으로 중단시키고 특정 주소에 위치한 프로그램을 수행하는 것

 

인터럽트가 시작되면, 현재 실행 중인 프로그램의 중요 데이터는 주기억장치에 저장되고 실행 중인 프로그램은 중단된다. 중단된 프로그램은 인터럽트를 처리하기 위해 실행되는 프로그램의 루틴인 인터럽트 서비스 루틴(ISR)이 처리하는 프로그램이 종료된 후에 실행된다.

 

 

인터럽트의 발생 원인과 종류

- 기계 착오 인터럽트

: 프로그램을 실행하는 도중, 갑작스러운 정전이나 컴퓨터 자체 내에서 기계적인 문제로 인해 발생하는 인터럽트

 

- 슈퍼바이저 호출 인터럽트

: 슈퍼바이저 호출(SVC) 명령어를 사용하여 운영체제에 서비스를 요청할 때 발생하는 인터럽트

 

- 외부 인터럽트

: 오퍼레이터나 타이머에 의해 의도적으로 프로그램이 중단된 경우 발생하는 인터럽트

 

- 입출력 인터럽트

: 입출력의 종료나 오류에 의해 CPU의 기능이 요청되는 경우 발생하는 인터럽트

ex) I/O제어기에 의한 프린터 출력, 키보드 입력

 

- 프로그램 검사 인터럽트

: 프로그램 실행 중 보호된 기억공간 내에 접근하거나 불법적인 명령 수행과 같은 프로그램의 문제로 인해 발생하는 인터럽트

ex) 오버플로우, 0에 의한 나누기

 

- 재시작 인터럽트

: 오퍼레이터 및 다른 프로세서에 의해서 재시작 명령이 도착하였을 때 발생하는 인터럽트

 

 

 

인터럽트 처리

인터럽트 사이클 : 인터럽트 발생을 처리하기 위한 사이클로 CPU가 인터럽트 요구의 존재 여부를 검사하는 과정이다.

 

 

 

 

 

 

 

명령어의 인출과 실행 과정에서

명령어 실행 후 인터럽트 요구가 대기 중인 경우

인터럽트 사이클에 의해서 현재 프로그램의 실행을 중단하고

프로그램 상태를 저장한다.

프로그램 카운터(PC)를 인터럽트 처리 루틴의 시작 주소로 설정하고

인터럽트를 처리한다

 

인터럽트 발생이 없는 경우 다음 명령어를 인출하는 사이클을 수행한다.

 

 

 

 

 

 

 

 

 

다중 인터럽트 처리

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

 

- 순차적인 다중 인터럽트 처리

: 인터럽트 서비스 루틴을 처리하고 있는 도중에는 새로운 인터럽트 처리 요구가 들어오더라도 CPU가 새로운 인터럽트 사이클을 수행하지 않는다. 나중에 발생한 인터럽트는 대기상태에서 현재의 인터럽트에 대한 처리가 종료된 후에 발생한 순서대로 처리된다.

 

순처적인 다중 인터럽트 처리

 

 

- 우선순위 다중 인터럽트 처리

: 인터럽트의 우선순위를 정하고 우선순위가 낮은 인터럽트가 처리되고 있는 동안에 우선순위가 더 높은 인터럽트가 들어오면 현재의 인터럽트 서비스 루틴의 수행을 중단하고 새로운 인터럽트를 처리한다.

우선순위 다중 인터럽트 처리

 

 

참고) 2019 컴퓨터 구조 호준원교수님 강의노트, 디지털논리와 컴퓨터 설계, Harris et al. (조영완 외 번역), 사이텍미디어, 2007, 컴퓨터 구조와 원리 (비주얼 컴퓨터 아키텍처), 신종홍 저, 한빛미디어, 2011

 

 

문제

더보기

Q1. 유효주소란 오퍼랜드에 저장되어있는 주소를 말한다. (O/X)

Q2. 레지스터 주소 지정 방식은 주기억장치에 데이터가 저장되어 있다. (O/X)

 

Q3. 다음 중 주기억장치에 두 번 액세스하여 데이터를 인출하는 방식을 고르시오

① 직접 주소 지정 방식    ② 레지스터 주소 지정 방식    ③ 간접 주소 지정 방식    ④ 레지스터 간접 주소 지정 방식

 

Q4. 다음은 어떤 주소 지정 방식에서 사용되는가?

EA = (IX) + A

답 :____________________

 

Q5. 다음 중 6단계 명령어 파이프 라인의 명령 실행 구성으로 올바른 것은?

① 명령어 인출 - 오퍼랜드 인출 - 오퍼랜드 계산 - 명령어 해독 - 명령어 실행 - 오퍼랜드 저장

명령어 인출 - 명령어 해독 - 오퍼랜드 인출 - 오퍼랜드 계산 - 오퍼랜드 저장 - 명령어 실행

명령어 인출 - 명령어 해독 - 오퍼랜드 계산 - 오퍼랜드 인출 - 명령어 실행 - 오퍼랜드 저장

 

Q6. 다음은 4단계 명령어 파이프 라인 과정의 일부이다. 명령어 2의 실행 단계를 표기하시오.

 

Q7. 4단계 파이프 라인에서 8개의 명령어를 실행하려 한다. 파이프라인 클록이 1 MHz 일 때, 소요되는 시간을 계산하시오.

답 :____________________

 

Q8. 다음 중 프로그램 실행 중 보호된 기억 공간 내에 접근하거나 불법적인 명령 수행과 같은 프로그램의 문제로 인해 발생하는 인터럽트는?

외부 인터럽트    ② 슈퍼바이저 호출 인터럽트    ③ 프로그램 검사 인터럽트    ④ 재시작 인터럽트

 

Q9. 다음은 명령어 실행 후 인터럽트 요구가 대기 중인 경우에 수행되는 과정들이다. 순서에 맞게 번호를 표기하시오

___ 프로그램 카운터를 인터럽트 처리 루틴의 시작 주소로 설정한다.

___ 현재 프로그램의 실행을 중단하고 프로그램 상태를 저장한다.

___ 인터럽트를 처리한다.

 

Q10. 인터럽트 서비스 루틴을 처리하고 있는 도중 새로운 인터럽트 처리 요구가 들어올 경우 새로운 인터럽트 사이클을 수행하지 않고 나중에 발생한 인터럽트는 대기상태에서 현재의 인터럽트에 대한 처리가 종료된 후에 발생한 순서대로 처리하는 다중 인터럽트 처리 방법을 (순차적인 다중 인터럽트 처리 / 우선순위 다중 인터럽트 처리)라고 한다.

 

 

해설

더보기

A1. (X)

: 유효 주소란 해당 데이터가 들어있는 기억장치의 실제 주소를 의미한다.

 

A2. (X)

: 레지스터 주소 지정 방식은 데이터가 레지스터에 존재한다. 따라서 주기억장치에 접근하는 것보다 접근 속도가 빠르다.

 

A3. ③ 간접 주소 지정 방식

: 간접 주소 지정 방식은 오퍼랜드의 필드의 내용에 유효주소의 주소가 저장되어 기억장치에 두 번 접근하여 실질적인 데이터를 얻는다.

 

A4. 인덱스 주소 지정 방식

: 인덱스 주소 지정 방식은 인덱스 값을 저장하는 특수 레지스터인 인덱스 레지스터(IX)를 사용하여 인덱스 레지스터의 내용과 변위(A)를 더하여 유효 주소를 결정한다.

 

A5.  명령어 인출 - 명령어 해독 - 오퍼랜드 계산 - 오퍼랜드 인출 - 명령어 실행 - 오퍼랜드 저장

: 6단계 명령어 파이프라인에서는 위와 같은 6개의 단계로 명령을 실행 과정을 구성한다.

 

A6.

: 4단계 명령어 파이프 라인에서 명령어 1의 명령어 인출 과정이 끝나면 명령어 2의 명령어 인출과정이 병렬적으로 실행된다.  

 

A7. 11

: k=4, N=8이므로 T = k + (N - 1)에 해당 값들을 대입하면 11㎲가 된다.

 

A8. ③ 프로그램 검사 인터럽트

 외부 인터럽트 : 오퍼레이터나 타이머에 의해 의도적으로 프로그램이 중단된 경우 발생하는 인터럽트

 슈퍼바이저 호출 인터럽트 : 슈퍼바이저 호출(SVC) 명령어를 사용하여 운영체제에 서비스를 요청할 때 발생하는 인터럽트

 재시작 인터럽트 : 오퍼레이터 및 다른 프로세서에 의해서 재시작 명령이 도착하였을 때 발생하는 인터럽트

 

A9.

__ 프로그램 카운터를 인터럽트 처리 루틴의 시작 주소로 설정한다.

__ 현재 프로그램의 실행을 중단하고 프로그램 상태를 저장한다.

__ 인터럽트를 처리한다.

 

A10.

인터럽트 서비스 루틴을 처리하고 있는 도중 새로운 인터럽트 처리 요구가 들어올 경우 새로운 인터럽트 사이클을 수행하지 않고 나중에 발생한 인터럽트는 대기상태에서 현재의 인터럽트에 대한 처리가 종료된 후에 발생한 순서대로 처리하는 다중 인터럽트 처리 방법을 (순차적인 다중 인터럽트처리 / 우선순위 다중 인터럽트 처리)라고 한다.