안 쓰던 블로그

컴퓨터구조 -명령어를 효과적으로 실행하기 위한 기법 본문

컴퓨터 구조

컴퓨터구조 -명령어를 효과적으로 실행하기 위한 기법

proqk 2020. 5. 24. 22:16
반응형

1. 주소 지정 방식

주소: 주기억장치에서 데이터가 저장된 위치

주소 지정 방식: 주소를 지정하는 방식

1) 직접 주소지정 방식

가장 일반적인 개념의 간단한 주소 방식

주기억장치의 주소가 오퍼랜드 필드에 들어 있다면 직접 주소 지정 방식이다

(오퍼랜드: 연산코드가 아닌 나머지 부분)

오퍼랜드 필드의 내용이 유효 주소(EA)가 되는 방식 EA=A

(EA=(A)가 실제로 이런 주소를 쓰진 않고 지정방식 설명 할 때 쓰는 표현방식인데 포인터 같은 것)

그냥 그 주소값 그대로 어떤 연산을 거치지 않고 바로 주기억장치에 가서 데이터 가져오면 된다

 

장점

한번만 엑세스: 위에 사진 보면 화살표가 한 번만 간다. 직접 접근하기 때문에 1번만 접근하면 된다

 

컴퓨터에서는 메모리가 데이터 처리 속도가 다 다르니까 속도를 맞추기 위해서 완충제를 넣는다
그래서 주기억장치에 최대한 접근을 안 하는 게 좋은데 직접 주소 지정은 한번만 가니까 효율적이다

 

단점

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

명령어 길이가 n비트, 연산 코드 비트가 p라면 최대 기억 장소의 수는 2^n-p

(만약 명령어에서 16비트를 썼으면 연산코드 비트로 6비트만 남으니까 주소값으로 2^16-6 밖에 지정할 수가 없다)

 

2) 간접 주소지정 방식

데이터의 주소가 있는 주소에 한번 엑세스하고 거기서 실제 주소에 접근하는 방식

(오퍼랜드 필드의 내용이 유효 주소의 주소가 되는 방식)

그래서 주기억장치에 총 두 번 접근한다

 

EA=(A)

->유효 주소(EA)는 A의 주소값

(A는 주소인데 괄호를 치면 그 주소의 데이터에 접근하는 거)

 


장점

기억장치의 최대 용량은 word 길이에 의해 결정

1word = 16bit이기 때문에 n word는 2^(n*16) 주소 공간을 쓸 수 있다

명령어의 주소 필드 길이가 짧고 제한되어 있어도 더 긴 주소에 접근 가능

기억장치의 구조 변경 등을 통해 확장 가능

 

단점

두 번의 기억장치 액세스 필요-직접 주소 지정보다 느리다

명령어 형식에 이 방식이 주소 지정 방식이라는 걸 알려주는 간접 비트 필드가 필요하다

 

 

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

연산에 사용할 데이터가 레지스터에 저장되어 있는 방식

오퍼랜드 부분에 레지스터 번호를 저장, 번호가 가리키는 레지스터의 내용이 실제 데이터

 

EA=R

R에 있는 주소로 바로 레지스터 주소의 데이터로 접근

 

장점

비트 수가 적어도 되며, 데이터 인출을 위해 기억장치에 액세스할 필요가 없음

 

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

CPU내부 레지스터는 제일 비싸고 제일 빠른데 제일 작은 데이터 공간을 가져서 그렇게 효율적이지는 않다

 

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

오퍼랜드 필드가 레지스터 번호를 나타내며, 해당 레지스터에 저장된 내용이 유효주소

 

EA=(R)

(유효주소 = 레지스터에 저장된 내용

(R)은 포인터랑 비슷한 개념)

R에서 주소 타고 가면 실제 주소가 나오고 데이터를 가리킴
레지스터 길이에 따라 주소지정 영역이 결정된다

레지스터의 길이가 16비트라면 주소지정 영역는 2^16비트

 

장점

기억장치에 한 번만 액세스한다

많은 주소 공간을 활용할 수 있다

 

단점

간접 주소 방식보다는 메모리 참조가 적게 일어나지만 여분의 메모리 참조가 필요함
(간접주소방식-주기억장치에 두 번 액세스하는 방식)


메모리 참조가 적게 일어난다:

주기억장치1번 레지스터1번이라 주기억장치엔 1번만 접근하므로 메모리 참조가 적게 일어난다고 한다 

 

여분의 메모리 참조가 필요하다:

주기억1번 레지스터1번으로 두 번 접근하니까 여분의 메모리가 필요하다

 

5) 변위 주소 지정 방식

직접 주소 지정방식과 레지스터 간접 주소 지정 방식을 조합한 방식

오퍼랜드 두 개를 가짐(변위를 나타내는 주소 오퍼랜드, 레지스터 번호 오퍼랜드)

 

EA=(R)+A

R레지스터 값을 보고 주소로 가는데, 거기에 A라는 변위값을 더하고 EA가 실제 주소값이 되어 주기억장치 액세스

 

왜 이런 방식이 나왔을까? 왜냐하면 간접주소지정방식도 16비트라는 한계값이 있었는데

변위값을 더하면 변위값만큼의 주소 영역을 확보할 수 있기 때문이다

 

레지스터의 종류가 엄청 많은데, 무슨 레지스터를 사용하냐에 따라 여러 가지의 변위 주소 지정 방식이 나온다

 

사용하는 레지스터에 따른 변위 주소 지정방식

(1) 상대 주소 지정 방식

프로그램 카운터(PC값)를 레지스터로 사용한다

주로 분기 명령어에서 사용된다

EA=(PC)+A

(유효 주소 = 프로그램 카운터의 내용+기억장치 주소)

 

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

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

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

 

 

(2) 인덱스 주소 지정방식

인덱스 레지스터를 사용함

(인덱스 레지스터-인덱스 값을 저장하는 특수 레지스터)

EA=(IX)+A

(유효 주소=인덱스 레지스터의 내용+기억장치 주소)

 

인덱스 레지스터(IX)의 내용과 변위 A를 더하여 유효 주소를 결정함

IX인덱스 레지스터+변위값=유효주소

 

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

명령어가 실행되면 다음 두 연산이 연속적으로 수행됨

EA=(IX)+A

IX<-IX+1

 

(3) 베이스 레지스터 주소 지정방식

베이스 레지스터를 사용함

베이스 레지스터(BR)의 내용과 변위 A를 더하여 유효 주소를 결정함

EA=(BR)+A

(유효 주소=베이스 레지스터의 내용+기억장치 주소)

 

 

명령어 파이프 라인

하나의 명령어를 여러 단계로 나누어서 실행되는 도중에 다른 명령어 실행을 시작하는 방법으로

동시에 여러 개의 명령어 실행하는 기법

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

 

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

명령어를 실행하는 하드웨어를 인출단계/실행단계 라는 두 개의 독립적인 파이프라인 모듈로 분리해서 수행하는 방법

-명령어를 인출하는 일만 하드웨어-인출 단계
명령어를 실행하는 일만 하는 하드웨어-실행 단계

 

-cpu가 명령어를 처리하는데 한 번에 하나밖에 처리못해서 클록(초)이라는 주기의 일정 텀에 따라 실행됨

한 하드웨어가 1클록에 실행 한 번이나 인출 한 번 가능

 

사진의 명령어1 인출은 인출만 하는 하드웨어가 함
그리고 실행 하드웨어한테 넘기면 실행 하드웨어가 1초 동안 일한다
인출만 하는 하드웨어는 그 사이에 놀 수 없으니까 다음걸 인출하고 있는 식

 

사진에는 동시에 그래프가 나와있지만 사실 독립적으로 병렬적으로 실행되는 형태
1클록이 1파이프고, 파이프들이 모여있다고 하여 명령어 파이프 라인이다

 

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

명령어 인출, 명령어 해독, 오퍼랜드 인출, 명령어 실행의 4단계로 구성된 파이프라인

 

 

명령어 인출 IF: 명령어를 기억장치에서 인출

명령어 해독 ID: 명령어 해독기를 이용하여 인출된 명령어를 해석

오퍼랜드 인출 OF: 기억장치에서 오퍼랜드(연산에 사용될 변수나 데이터)를 인출

실행 EX: 명령어에서 지정된 연산을 수행

 

4단계 명령어 파이프 라인이 실제 cpu처리 과정과 비슷하다
각각의 단계를 그 단계만 하는 하드웨어들로 나누고, 한 클록이 지날 때마다 각자 자기 할 일 하나를 한다

 

 

(3) 6단계 명령어 파이프라인

4단계의 4개+오퍼랜드 계산, 오퍼랜드 저장이 추가되어 6단계로 구성된 파이프라인

 

명령어 인출 FI

명령어 해독 DI

오퍼랜드 계산 CO: 간접주소 또는 변위주소 지정방식으로 유효주소를 찾는 계산을 한다

오퍼랜드 인출 FO

명령어 실행 EI

오퍼랜드 저장 WO: 연산된 결과(오퍼랜드)를 저장한다

 

오퍼랜드에서 바로 주기억장치로 간다해도 오퍼랜드를 계산하는 단계는 무조건 필요함

 

그리고 4단계랑 6단계랑 동작은 같은데 이름이 다른 단계들은 이름이 다른 게 맞다

그래서 예를 들어 IF와 FI만 봐도 4단계인지 6단계인지 알 수 있음

 

2,4,6단계의 클록은 다 똑같다

 

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

명령어 실행 시간 계산

k: K단계 파이프라인, 4단계면 4
N: 실행할 명령어들의 수, 위에 사진에서 6단계 명령어 파이프라인에서는 9단계 실행하므로 9

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

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

 

파이프 라인에 의한 속도 비교는 파이프라인을 적용했을 때랑 안 적용했을 때를 비교함

파이프 라인을 적용했을 때, T = k+(N+1)

파이프 라인을 적용 안 했을 때, T' = k*N


예를 들어 2단계와 4단계를 보면
명령어 하나가 실행되는 데에는 인출 1클록 실행 1클록 총 2클록
명령어 라인을 적용하면 총 4클록을 쓰는데
(파이프라인을 적용하면 항상 1클록이 줄어든다)
쓰지 않으면 실행과 인출을 동시에 하지 않으니까 인출/실행이 끝나야 다른 명령어의 인출이 시작됨

예)

k=4, N=10이면

파이프라인 적용 T = 4 + (10 -1)=13

파이프라인 미적용 T' = (4 * 10) = 40

파이프라인을 적용하지 않았을 때보다 적용했을 때 3.08배 정도가 더 빨라진다

 

 

인터럽트

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

 

-동작원리

인터럽트가 시작되면 현재 실행 중인 프로그램의 중요 데이터는 주기억장치에 저장, 실행 중인 프로그램은 중단된다

중단된 프로그램은 인터럽트 서비스 루틴이 처리하는 프로그램이 종료된 후에 실행된다

인터럽트 서비스 루틴(ISR: 인터럽트를 처리하기 위해 실행되는 프로그램 루틴)

 

(1) 기계 착오 인터럽트

정전같은 게 나면 비상전력을 가동시키라는 인터럽트를 실행해서 비상전력을 가동한다 

 

(2) 슈퍼바이저 호출 인터럽트

루트가 갑자기 이거 해 라고 했으면 그걸 해야만 한다

 

(3) 외부 인터럽트

작업관리자에서 작업끝내기 하는 행동이 이런 인터럽트 

 

(4) 입출력 인터럽트

프로그램을 실행하는 중에 scanf같은 게 나오면 사용자가 입력할 때까지 기다려야 하니까 호스트를 키보드한테 넘겨줌 

 

(5) 프로그램 검사 인터럽트

무한 루프에 빠질 것 같으면 멈춤

 

(6) 재시작 인터럽트

오퍼레이터나 다른 프로세서에서 재시작하라는 명령이 오면 인터럽트 실행

 

 

인터럽트 처리

인터럽트 사이클: CPU가 인터럽트 요구 여부를 검사하는 과정

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

인터럽트 요구가 대기 중인 경우:

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

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

 

 

다중 인터럽트 처리

(1) 순차적인 다중 인터럽트 처리
인터럽트가 걸렸는데 또 걸린 경우
X, Y라는 인터럽트가 동시에 걸리면, 좀 더 빨리 시작된 인터럽트를 무조건 실행하고 그 다음 인터럽트를 수행한다


(2) 우선순위 다중 인터럽트 처리
인터럽트의 우선순위 정해서 실행
X와 Y가 인터럽트가 생겼는데 Y가 더 중요하다면 Y부터 실행한다

 

 

[확인 문제]

1. 직접 주소 지정 방식에서 명령어 길이가 16비트, 그 중 연산 코드 비트가 4면 지정할 수 있는 메모리의 크기는?

더보기

4096

오퍼랜드 필드의 길이: 16-4=12비트

지정 가능한 메모리 크기 2^12=4096

 

2. 명령어가 레지스터 간접 주소지정 방식으로 실행되는 동안 주기억장치에 몇 번 액세스 하는가?

더보기

1번

주기억장치1번+레지스터1번 액세스 하기 때문에

주기억장치에는 1번 액세스 한다

 

3. 상대 주소 지정 방식에서 400번지에 저장된 명령어가 인출된 후에 PC값이 401이 되었을 때, 기억장치 주소가 +30인 경우의 분기 목적지 주소는?

더보기

431번지

401+30=431번지

 

4. 레지스터 간접 주소 지정 방식에서 길이가 16비트인 레지스터를 사용할 때, 주소지정 영역의 크기는?

더보기

2^16비트

n비트인 레지스터의 주소지정영역: 2^n비트

 

5. 4단계 명령어 파이프 라인의 IF 단계와 6단계 명령어 파이프 라인의 FI 단계는 차이가 있는가?

더보기

부르는 용어가 다를 뿐 차이가 없다

 

6. 4단계 명령어 파이프라인에서 파이프 라인을 적용하고 13개 명령어를 실행하면 소요되는 시간은?

더보기

16

T=4+(13-1)=16

 

7. 6단계 명령어 파이프라인에서 파이프 라인을 적용하지 않고 15개 명령어를 실행하면 소요되는 시간은?

더보기

90

T'=6*15=90

 

8. 우선순위 다중 인터럽트 처리 방식에서 사용자에게 입력 받다가 오버플로우가 났다면 무슨 인터럽트가 먼저 실행이 될까?

더보기

사용자 입력을 받는 scanf 등의 입출력 인터럽트보다 오버플로우 같은 걸 감지하는 프로그램 검사 인터럽트가 더 중요하므로 프로그램 검사 인터럽트가 먼저 실행이 된다

 

9. 4단계 명령어 파이프 라인의 명령어 실행 단계을 바르게 나열한 순서는?

1) 명령어 인출->오퍼랜드 인출->명령어 실행->명령어 해독

2) 명령어 인출->명령어 해독->오퍼랜드 인출->명령어 실행

3) 명령어 인출->오퍼랜드 인출->명령어 실행->명령어 해독

4) 명령어 인출->명령어 해독->오퍼랜드 인출->명령어 실행

5) 오퍼랜드 인출->명령어 인출->명령어 해독->명령어 실행

더보기

2번

명령어를 인출하고, 해독하고, 오퍼랜드를 인출해서 피연산자를 인출한 다음에 실행한다

10. 간접 주소지정 방식에서 1워드를 사용하고 있을 때, 기억장치의 최대 용량은?

더보기

2^16

기억장치의 최대 용량은 word 길이에 의해 결정된다

1word = 16bit이기 때문에 n word는 2^(n*16) 주소 공간을 쓸 수 있다

 

반응형
Comments