Issuu on Google+

©copyright 2006

컴퓨터구조(INA200)

교과목 소개

한국기술교육대학교 정보미디어공학부 김상진

교육목표 컴퓨터시스템의 각 구성요소의 특징, 성능, 상호작용 방법을 학습한다. 이를 통해 컴퓨터의 동작 원리에 대한 이해력을 높이며, 나아가 보다 효율적인 프로그램을 작성할 수 있는 능력을 배양한다.

2/16


강의정보 교수 정보 연구실: 제1공학관 F207호 전화번호: 교내 490 (041-560-1490) 전자우편: sangjin@kut.ac.kr 강의홈페이지: http://infosec.kut.ac.kr/sangjin/class/comparch0601/ 교재 William Stallings, Computer Organization & Architecture, 7th Ed., Prentice Hall, 2006

3/16

강의정보

– 부교재

김종현 역, 컴퓨터시스템구조론, 6판, 사이텍미디어, 2004. 김종현, 컴퓨터구조론(개정판), 생능출판사, 2003. L. Null and J. Lobur, The Essentials of Computer Organization and Architecture, Jones and Bartlett, 2003. D.E. Comer, Essentials of Computer Architecture, Prentice Hall, 2004.

4/16


강의정보 – 계속 강의 평가 방법 출석: 10%, 숙제: 10%, 중간: 40%, 기말: 40% 참고. 바뀔 수도 있음 1시간 이상 지각할 경우 지각 처리함 합당한 사유를 사전에 통보하면 결석 처리하지 않음 결석할 경우에도 실습 내용을 숙제로 전부 제출해야 함 강의 준비물 강의 노트를 강의 홈페이지에서 다운받아 준비해야 함.

5/16

개요 컴퓨터의 가장 핵심적인 기능은 프로그램을 실행하는 것이다. 프로그램을 실행하는 핵심 주체는 중앙처리정치(CPU, Central 중앙처리정치 Processing Unit)이다. 중앙처리장치가 프로그램을 실행하기 위해서는 CPU가 직접 접근할 수 있는 주기억장치(main memory)에 프로그램이 적재되어야 한다. 실제 프로그램은 반영구적으로 보관되기 위해 비휘발성 기억장치인 하드 디스크에 저장되어 있다. 이 과목에서는 프로그램을 실행하기 위해 컴퓨터 내부에 있는 여러 구성 요소들이 어떻게 상호작용하는지 강의한다.

6/16


구조와 조직 컴퓨터 구조(computer architecture): 프로그래머에게 보이는 시스템 구조 의 속성(프로그램의 논리적 수행에 직접 영향을 주는 속성) 구조적 속성의 예: 명령어 집합(instruction set), 각종 데이터 표현 (수, 문자 등)에 사용되는 비트 수, 입출력 메커니즘, 주소 지정 (addressing) 기법 예1.1) 곱셈 명령이 존재하는가? 컴퓨터 조직(computer organization): 구조적 속성들을 구현하는 방법 조직 조직적 속성: 제어신호, 컴퓨터와 주변장치(peripheral) 간의 인터페이스, 주기억장치 기술 예1.2) 곱셈 명령을 별도로 구현할 것인가, 혹은 반복 덧셈을 이용하여 구현할 것인가? 이 결정은 곱셈 명령의 예상되는 사용 빈도수, 두 접근의 속도 차이, 비용, 별도 명령 장치의 물리적 크기 등에 의해 결정된다.

7/16

구조와 조직 – 계속 구조와 조직의 구분의 중요성: 많은 컴퓨터 제조업체는 같은 구조를 사용하지만 다른 조직을 사용하는 여러 모델을 제공한다. 따라서 보통 컴퓨터는 모델에 따라 가격과 성능에서 차이가 있다. 컴퓨터 구조는 기술의 발전에 따라 보통 변하지 않지만 조직은 변한다. 이것은 호환성을 유지하는데 도움이 된다. (backward compatibility) 예1.3) IBM System/370 구조: 1970년대 도입, 지금까지 이 구조를 사용함 예1.4) PC용 그래픽카드 인터페이스 (AGP, PCI Express) 마이크로컴퓨터의 경우에는 기술의 발전이 조직뿐만 아니라 구조의 변화도 초래한다.

8/16


구성과 기능 복잡한 시스템을 이해하는 방법은 그것의 계층적 구조를 파악하는 것이다. 계층적 시스템(hierarchical system): 상호연결된 하위 시스템의 집합 시스템 으로서, 각 하위 시스템은 또 다시 계층적으로 구성된 시스템을 말한다. 컴퓨터는 계층적 시스템이다. 각 계층 레벨에서 설계자의 관심 사항 구성(structure): 구성요소의 상호관계 구성 기능(function): 전체 구성의 일부분으로서의 각 구성요소의 기능 기능

9/16

기능적 관점에서 본 컴퓨터 데이터 저장 장치 운영 환경 (데이터의 원천과 목적지)

데이터 이동 장치

제어 메커니즘 데이터 처리 장치

10/16 10/16


기능 컴퓨터의 기본적인 기능 데이터 처리 데이터 저장: 단기간(일시적) 저장, 장기간 저장 데이터 이동 컴퓨터에 직접 연결되어 있는 장치로부터 데이터를 교환하는 과정은 입출력이라 하고, 이런 장치를 주변장치라 한다. 원격에 있는 장치 간에 데이터를 교환하는 과정은 데이터 통신(data communication)이라 한다. 제어 제어장치는 컴퓨터에 제공된 명령에 의해 동작한다. 제어장치는 컴퓨터의 자원을 관리하고, 주어진 명령에 따라 각 기능 요소의 수행을 조절한다.

11/16 11/16

컴퓨터 동작의 예

하나의 주변장치에서 다른 장치로의 데이터 이동 예: 키보드로부터 입력된 문자를 화면에 출력

저장된 데이터를 처리한 후에 다시 저장 예: 은행 계좌의 갱신

외부 환경과 내부 저장 장치 간에 데이터 이동 예: 인터넷으로부터 받은 정보를 디스크에 저장

저장된 데이터를 처리한 결과를 외부 환경으로 이동하거나 외부 환경으로부터 받은 정보를 처리한 후에 저장, 예: 저장된 데이터를 처리한 후 출력 12/16 12/16


컴퓨터의 네 가지 핵심요소 중앙처리장치(CPU, Central Processing Unit): 컴퓨터의 동작을 중앙처리장치 제어하며, 데이터 처리 기능을 수행한다. 단순하게 프로세서(processor)라 한다. 프로세서 주기억장치(main memory): 데이터가 저장되는 곳 주기억장치 입출력장치(I/O): 컴퓨터와 외부 환경 간에 데이터를 이동해 주는 입출력장치 역할을 한다. 시스템 상호연결(system interconnection): CPU, 주기억장치, 상호연결 I/O 간에 통신을 제공하는 메커니즘

13/16 13/16

중앙처리장치의 네 가지 핵심요소 제어장치(control unit): CPU의 동작을 제어한다. 제어장치 산술논리 연산장치(ALU, Arithmetic and Logic Unit): 데이터 처리를 연산장치 수행한다. 레지스터(register): CPU 내부의 저장장치 레지스터 CPU 상호연결: 상호연결 제어장치, 산술논리 연산장치, 레지스터 간에 통신을 제공하는 메커니즘

14/16 14/16


컴퓨터 구조를 학습하는 이유 컴퓨터 전문가 측면에서 학습하는 이유 이유1. 효율적인 프로그램의 작성 이유2. 사용할 컴퓨터 시스템의 선택 [CLEM00]에 제시된 세 가지 이유 이유1. 컴퓨터 구조나 조직에 차이에 따른 컴퓨터 활용의 이해 이유2. 임베디드 시스템에서 사용되는 프로세서의 설계 이유3. 컴퓨터 구조에 사용되는 개념은 다른 컴퓨터 분야에서 많이 응용됨

15/16 15/16

강의계획 1

강의 소개

9

컴퓨터 산술

2

컴퓨터 역사와 성능

10

명령어 집합: 특징과 기능

3

컴퓨터 기능과 상호연결

11

명령어 집합: 주조지정과 형식

4

캐시 메모리

12

CPU 구성과 기능

5

내부 메모리

13

RISC

6

외부 메모리

14

Superscalar 프로세서

7

입출력

15

제어장치

8

중간시험

16

마이크로프로그램된 제어

17

기말시험

16/16 16/16


©copyright 2006

컴퓨터구조(INA210) 강의노트 02

컴퓨터 역사와 성능

한국기술교육대학교 정보미디어공학부 김상진

교육목표 1945년에 처음 제안된 저장 프로그램 방식의 컴퓨터 개념은 오늘날까지 크게 변하지 않고 있다. 직접회로와 반도체 기술의 발전으로 컴퓨터 하드웨어 기술은 놀랍게 발전하였지만 하드웨어적 발전뿐만 아니라 컴퓨터 성능의 발전에 큰 역할을 한 것은 구조적, 조직적 기술의 발달이다. 컴퓨터 설계에 있어 가장 중요한 요소 중 하나는 컴퓨터 하드웨어 요소 간에 성능 차이의 균형을 맞추는 것이다.

2/33


제1세대 – 진공관(Vacuum Tubes) ENIAC(Electronic Numerical Integrator And Computer) 최초의 범용 디지털 컴퓨터 1943년에 개발에 착수하여 1946년에 완성 (1955년까지 운영) ENIAC의 세부사항 10진수 사용 기억장치: 10자리 10진수를 저장할 수 있는 20개의 누산기 (accumulator)로 구성 산술 연산도 10진수 체계에서 수행됨 스위치를 이용하여 수동으로 프로그래밍 Æ 가장 큰 단점 크기: 140m2

3/33

폰 노이만 기계 ENIAC의 수동식 프로그래밍의 문제를 극복하기 위해 저장 프로그램 (stored-program) 개념을 도입 – 1945년 저장 프로그램 방식: 방식 프로그램도 데이터와 마찬가지로 기억장치에 저장하는 방식 이 생각을 처음 제안한 사람이 폰 노이만(John von Neumann)이다. 노이만 같은 시기에 튜링(Alan Turing)도 제안함 폰 노이만은 이 개념에 근거하여 IAS 컴퓨터를 개발하였다. 이 컴퓨터는 모든 범용 컴퓨터의 프로토타입이 되었다.

IAS(Institute for Advance Study)는 Princeton 대학 근처에 위치한 연구소 이름

4/33


IAS 컴퓨터 IAS 컴퓨터의 구성 주기억장치: 데이터와 명령어를 모두 저장함 CC: 주기억장치에 있는 명령어를 해석하여 실행함 ALU: 이진 데이터를 처리함 IAS 컴퓨터의 설계 원리 컴퓨터이므로 기본적인 산술 연산을 가장 빈번하게 수행한다. 따라서 이를 위한 별도 장치가 필요하다. 범용 컴퓨터가 되기 위해서는 특정 명령어와 이것의 수행을 담당하는 것과 구분되어야 하며, 제어장치는 후자만을 담당하도록 해야 한다. 길고 복잡한 일련의 연산을 수행하기 위해서는 상당한 크기의 기억장치가 요구된다. 외부 장치와 입출력이 가능해야 한다. 5/33

IAS 컴퓨터 – 세부 사항 주기억장치는 주기억장치 1000개의 저장 위치로 구성되어 있으며, 각 위치를 워드(word)라 한다. 명령어와 수의 형태는 다음과 같다.

opcode: 명령어의 종류를 나타내는 코드 예: 00000101 ADD 한 워드에 두 개의 명령어를 저장할 수 있으므로 한번에 두 개의 명령어를 인출할 수 있다.

제어장치는 제어장치 기억장치로부터 명령어를 인출하여 한번에 하나씩 실행한다. ALU와 제어장치는 내부에 레지스터라는 저장공간을 가지고 있다. 레지스터

6/33


IAS 컴퓨터 – 레지스터의 종류 기억장치 버퍼 레지스터(MBR, Memory Buffer Register): 레지스터 기억장치에 저장할 워드가 저장되어 있거나 기억장치로부터 받은 워드가 저장되는 레지스터 기억장치 주소 레지스터(MAR, Memory Address Register): 레지스터 MBR에 옮길 워드가 저장되는 있는 기억장치의 위치나 MBR에 있는 워드를 저장할 기억장치의 위치를 기록하는 레지스터 명령어 레지스터(IR, Instruction Register): 실행할 명령어의 레지스터 8 비트 연산코드(opcode)가 저장되는 레지스터 명령어 버퍼 레지스터(IBR, Instruction Buffer Register)}: 레지스터 기억장치로부터 읽은 명령어가 임시로 저장되는 레지스터 프로그램 카운터(PC, Program Counter): 다음 명령어 쌍이 카운터 저장되어 있는 기억장치의 위치가 저장되는 레지스터 누산기(AC, accumulator)와 MQ(Multiplier Quotient): 누산기 ALU 연산의 결과나 피연산자가 저장되는 레지스터

7/33

IAS 컴퓨터 – 상세 구성

AC

MQ

arithmetic-logic circuits

inputoutput equipment

MBR ALU instructions and data

IBR

PC

main memory IR

control circuits

MAR

addresses control signals

control unit

8/33


IAS 컴퓨터 – 동작 원리 명령어 주기(instruction cycle)를 반복적으로 주기 수행 명령어 주기는 인출 주기(fetch cycle)와 주기 실행 주기(execution cycle) 두 주기로 주기 구성되어 있다. 인출 주기는 기억장치에 있는 명령어를 읽어서 중앙처리장치 내부에 옮겨 실행할 수 있도록 준비하는 단계이며, 실행 주기는 준비된 명령어를 실행하는 단계이다.

start

MAR

MBR

PC

M(MAR)

IR MAR

MBR() MBR()

PC

PC + 1

decode IR

LOAD M(X) MBR

AC

M(MAR)

MBR

M(X): contents of memory location whose address is X

9/33

IAS 컴퓨터 – IAS 명령어의 종류 데이터 이동: 기억장치와 ALU 레지스터 간에 또는 ALU 레지스터들 간에 데이터를 이동하는 명령어 무조건 이동: 보통 명령어를 순차적으로 하나씩 실행하지만 때로는 특정 위치로 이동한 다음에 그 위치부터 명령어를 순차적으로 실행해야 하는 경우가 있다. 이 명령어는 무조건적으로 명령어의 실행 위치를 바꿀 때 사용된다. 조건부 이동: 위와 같지만 조건에 따라 실행 위치를 바꾸어 주는 명령어이다. 산술 연산 주소 변경

10/33 10/33


LOAD MQ

MQ의 내용 AC로 옮김

LOAD MQ, M(X)

메모리 X에 있는 내용을 MQ로 옮김

STOR M(X)

AC의 내용을 메모리 X에 저장

LOAD M(X)

메모리 X에 있는 값을 AC에 적재함

LOAD –M(X)

메모리 X에 있는 값의 부호를 바꾸어 AC에 적재함

LOAD |M(X)|

메모리 X에 있는 값의 절대값을 AC에 적재함

LOAD –|M(X)|

메모리 X에 있는 값의 절대값을 음수화하여 AC에 적재함

JUMP M(X,0:19)

메모리 X에 있는 왼쪽 명령어를 다음 명령어로 사용함

JUMP M(X,20:39)

메모리 X에 있는 오른쪽 명령어를 다음 명령어로 사용함

JUMP +M(X, 0:19)

AC의 값이 음수가 아니면 메모리 X에 있는 왼쪽 명령어를 다음 명령어로 사용함

JUMP +M(X, 20:39)

AC의 값이 음수가 아니면 메모리 X에 있는 오른쪽 명령어를 다음 명령어로 사용함

ADD M(X)

메모리 X에 있는 값을 AC와 더하여 그 결과를 AC에 저장함

ADD |M(X)|

메모리 X에 있는 값의 절대값을 AC와 더하여 그 결과를 AC에 저장함

SUB M(X)

AC에 있는 값에서 메모리 X에 있는 값을 빼서 그 결과를 AC에 저장함

MUL M(X)

메모리 X에 있는 값과 MQ의 값을 곱하여 그 결과를 AC와 MQ에 저장함

DIV M(X)

AC에 있는 값을 메모리 X에 있는 값으로 나누어 몫은 MQ, 나머지는 AC에 저장함

LSH

AC에 있는 값에 2를 곱한다. (왼쪽 이동)

RSH

AC에 있는 값을 2로 나눈다. (오른쪽 이동)

STOR M(X,8:19)

AC에 있는 값으로 메모리 X에 있는 왼쪽 명령어의 주소 필드 값을 바꾼다.

STOR M(X,28:39)

AC에 있는 값으로 메모리 X에 있는 오른쪽 명령어의 주소 필드 값을 바꾼다. 11/33 11/33

IAS 컴퓨터 – 프로그램의 예 예2.1) 1부터 10까지 더하기 0 주소에 0, 1 주소에 0, 2 주소에 1, 3 주소에 9가 저장되어 있다. 프로그램이 수행된 후에 0 주소에 결과가 저장되어야 한다. 4: LOAD M(1), AC memory ADD M(2) 0 2 8 3 1 7 9 0 1 3 5: STOR M(1), 0 1 2 LOAD M(0) 1 6: ADD M(1), 9 STOR M(0), 7: LOAD M(3), AC memory SUB M(1) -1 55 0 8: JMP +M(4, 0:19) 10 0 1 9

12/33 12/33


상용 컴퓨터 UNIVAC I (Universal Automatic Computer): 최초의 상용 컴퓨터 이후 향상된 성능을 가진 UNIVAC II, UNIVAC 1100 시리즈가 개발됨 개발추세 기술의 발전에 따라 보다 강력한 컴퓨터의 개발이 가능함. 새 모델을 개발할 때 옛 모델과 호환성을 가지도록 개발함. IBM은 1953년에 IBM 701이라고 하는 최초의 저장 프로그램 방식의 컴퓨터를 개발하였으며, 이 후 IBM 700/7000 시리즈를 개발함

13/33 13/33

제2세대 – 트랜지스터 트랜지스터와 진공관의 차이 크기 축소, 가격 하락, 발열량 감소, 실리콘으로 만든 고체 소자 제2세대의 특징 중 하나는 DEC(Digital Equipment Corporation)의 등장이다. 이 기업은 PDP-1���라는 컴퓨터를 개발하였으며, 이 컴퓨터는 미니컴퓨터의 부흥을 가져왔다. IBM 7094 이 컴퓨터와 IAS 컴퓨터의 차이는 데이터 채널의 사용이다. 이 컴퓨터에서는 CPU가 직접 I/O을 수행하지 않는다.

14/33 14/33


컴퓨터 세대의 분류 세대

연도

기술

속도(연산수/초)

1

1946-1957

진공관

40,000

2

1958-1964

트랜지스터

200,000

3

1965-1971

SSI(Small Scale Integration)

1,000,000

4

1972-1977

LSI(Large Scale Integration)

10,000,000

5

1978-1991

VLSI(Very Large Scale Integration)

100,000,000

6

1991-현재

ULSI(Utra Large Scale Integration)

1,000,000,000

한 칩에 어느 정도의 회로소자를 포함하고 있는지 여부에 따라 구분 VLSI는 104개 이상의 트랜지스터가 들어 있는 것을 의미하며, ULSI는 106개 이상의 트랜지스터가 들어 있는 것을 의미한다.

15/33 15/33

제3세대: 직접회로 마이크로 전자기술(microelectronics): 디지털 전자회로의 크기를 전자기술 축소하는 기술 컴퓨터에서 필요한 두 가지 전자부품은 게이트(gate)와 기억소자 게이트 (memory cell)이다. 게이트: 간단한 불 함수(boolean function)를 구현해 주는 소자 함수 기억소자: 한 비트의 정보를 저장할 수 있는 소자 컴퓨터의 기능에서 두 소자의 역할 데이터 저장: 기억 소자에 의해 제공 데이터 처리: 게이트에 의해 제공 데이터 이동: 소자 간에 연결 경로에 따라 이동 제어: 연결 경로는 데이터 뿐만 아니라 제어 신호의 이동 통로가 되며,이 신호는 게이트의 동작 여부를 결정한다.

게이트

Boolean Logic Function

기억 소자 16/33 16/33


무어의 법칙 직접회로(IC, Integrated Circuit)는 여러 소자를 하나의 회로로 만든 것을 말한다. Moore의 법칙: 집적 밀도가 매년 두 배로 증가할 것이다. 1970년대 이후에는 18개월마다 두 배로 증가함 Moore의 법칙의 결과 집적 밀도가 증가하여도 칩의 가격은 거의 변하지 않았다. 집적 밀도의 증가에 따라 소자 간에 통로가 짧아져 성능이 향상되었다. 컴퓨터 크기가 감소되었다. 전기 소모와 발열량이 감소되었다. 칩 간에 연결이 적어져 신뢰성이 향상되었다.

17/33 17/33

제3세대의 주요 컴퓨터 IBM의 System/360 시리즈 호환성있는 첫 컴퓨터 계열 컴퓨터 계열의 특징 거의 유사하거나 같은 명령어 집합 사용 거의 유사하거나 같은 운영체제 사용 속도, I/O 포트의 수, 기억장치의 크기, 가격 증가 속도 증가 방법: 보다 복잡한 ALU, CPU와 주기억장치 사이의 데이터 통로 크기 DEC의 PDP-8 시리즈 OEM 개발이 가능 최초로 버스 구조 사용: 사용 모든 구성요소가 같은 데이터 통로를 공유하며, 이 통로의 사용권은 CPU가 조절함

18/33 18/33


제3세대 이후 반도체 기억장치 직접회로 기술은 프로세서뿐만 아니라 기억장치에도 적용이 가능하다. 반도체 기억장치는 1970년도에 처음 개발되었다. 이 기억장치는 기존 기억장치보다 크기나 성능면에서는 우수하였으나 가격 경쟁력은 없었다. 1974년 이후부터는 모든 면에서 기존 기억장치를 앞질렀으며, 저장공간의 크기와 성능은 계속 향상되어 현재는 2기가비트 용량의 반도체 메모리 칩이 시중에 판매되고 있다. 마이크로프로세서 인텔은 1971년에 4004 CPU를 개발하였다. 처음으로 하나의 칩에 CPU의 모든 요소를 포함하였다.

19/33 19/33

Intel PC 4004

8086

386DX

486DX

개발연도

71.11.15

74.4.1

85.10.17

89.4.10

클럭속도

108KHz

5-10MHz

16-33MHz

25-50MHz

버스 폭

4 비트

16 비트

32 비트

32 비트

기억장치

640 바이트

1 MB

4 GB

4 GB

64 TB

64 TB

가상기억장치 Pentium

Pentium 4

Pentium D

개발연도

93.3.22

2000. 11

2004. 6

클럭속도

60-166 MHz

1.3-3.73 GHz

2.8-3.4 GHz

버스 폭

32 비트

64 비트

기억장치

4 GB

64 GB

가상기억장치

64 TB

64 TB

버스의 속도(1066MHz), 내부 캐쉬의 크기(2MB L3 cache)

Pentium with MMX, Pentium Pro, Pentium II, Pentium III 20/33 20/33


바이트 단위 단위(IEC 60027-2)

SI(국제단위 규격)

1 KiB(kibibyte)

210 byte 1024 byte

1 KB(kilobyte)

103 byte

1 MiB(mebibyte)

210

1000 byte

1 MB(megabyte)

103

KB

106 byte

1 GiB(gibibyte)

210 MB

230 byte

1 GB(gigabyte)

103 MB

109 byte

1 TiB(tebibyte)

210 GB

240 byte

1 TB(terabyte)

103 GB

1012 byte

1 PiB(pebibyte)

210 TB

250 byte

1 PB(petabyte)

103 TB

1015 byte

1 EiB(exbibyte)

210 PB

260 byte

1 EB(exabyte)

103 PB

1018 byte

1 ZiB(zebibyte)

210 EB

270 byte

1 ZB(zettabyte)

103 EB

1021 byte

1 YiB(yobibyte)

210 ZB

280 byte

1 YB(yottabyte)

103 ZB

1024 byte

KB

220

byte

21/33 21/33

Hz, sec 단위 주파수(frequency): 어떤 사건이 주어진 시간 단위 내에 반복되는 회수를 나타내며, Hz 단위를 사용한다. 1 Hz는 보통 1초에 클럭이 진동하는 회수를 나타낸다. 마이크로프로세서의 속도는 주로 클럭 속도에 의해 결정된다. SI 1 KHz(kilohertz)

SI 103 hertz 1000 hertz

1 msec(milisecond)

10-3 sec

1 MHz(megahertz) 103 KHz

106 hertz

1 μsec(microsecond) 10-6 sec

1 GHz(megahertz) 103 MHz

109 hertz

1 nsec(nanosecond)

10-9 sec

1012 hertz

1 psec(picosecond)

10-12 sec

1 THz(terahertz)

103 GHz

컴퓨터의 속도를 측정하기 위해 MIPS(Millions of Instructions Per Second)라는 척도를 사용한다. CPU의 클럭이 한 번 진동할 때마다 한 명령어가 실행된다고 가정하자. 이 때 CPU가 Pentium 4 3.0GHz이면 이 컴퓨터의 속도는 3,000 MIPS 가 된다.

22/33 22/33


CPI CPU의 클럭이 한번 진동할 때마다 한 명령어를 실행하지 못한다. 명령어마다 그 명령어를 실행하기 위해 소요되는 시간이 다를 수 있다. 이 때문에 CPI(average Cycles Per Instruction) 단위를 사용한다. 예2.2) 클럭이 10 MHz이고 성능 5 MIPS인 컴퓨터의 CPI는? CPI = (10 MHz) / (5 MIPS) = 2 예2.3) 클럭이 100 MHz이고, 5 CPI이면 이 컴퓨터의 성능을 MIPS로 표현하면? 100 MHz / (5 CPI ±106) = 20 MIPS

23/33 23/33

성능을 위한 설계 컴퓨터 하드웨어 기술은 놀랍게 발전하였고 지금도 발전하고 있다. 컴퓨터 구조와 조직 측면에서 보았을 때 이런 사실이 더욱 놀라운 것은 다음 때문이다. 오늘날 컴퓨터의 기본 골격은 아직도 50년 전의 IAS 컴퓨터와 유사하다. 주어진 재료에서 최대한의 성능을 얻기 위한 기술이 점점 복잡해지고 있다.

24/33 24/33


마이크로 프로세서의 속도 놀라운 능력을 발휘하는 현재의 마이크로프로세서도 수행할 명령을 지속적으로 공급해 주지 못하면 그 능력은 아무 소용이 없다. 따라서 집적회로의 집적밀도뿐만 아니라 다음과 같은 기술이 프로세서 발전에 중요하다. 분기 예측(branch prediction): 프로세서가 기억장치로부터 인출한 예측 명령어를 미리 관찰하여 다음에 실행할 분기나 명령어 집합을 예측 하여 이들을 미리 인출하여 버퍼에 보관하는 기술을 말한다. 만약 매번 프로세서가 올바르게 예측한다면 성능이 많이 향상될 것이다. 데이터 흐름 분석: 분석 명령어들 사이에 의존관계를 파악하여 원래의 프로그램 순서와 무관하게 명령어 실행 스케줄을 최적화하는 기술을 말한다. 선행 실행(speculative execution): 원래의 프로그램 순서와 실행 상관없이 필요한 것으로 판단되면 미리 실행하여 그 결과를 임시로 보관한 다음에 나중에 사용하는 기술을 말한다.

25/33 25/33

성능의 균형 프로세서의 성능은 눈부시게 발전하였지만 컴퓨터의 다른 중요 구성요소는 프로세서만큼은 발전하지 못하였다. 그 결과 성능의 균형을 맞추는 것이 필요하다. 대표적인 예 프로세서와 주기억장치 간에 인터페이스 가장 문제가 되는 부분 프로세서와 주변장치 간에 인터페이스 프로세서와 주기억장치의 발전 불균형에 따른 문제를 극복하기 위한 방안 버스 폭 증가(예: 메모리의 핀 수 증가, DDR2 SDRAM 240pin) 비고. 듀얼 채널 기법 메모리 칩의 인터페이스 향상을 위한 캐시(cache) 사용 CPU 내부 캐시 사용 고성능 버스 사용

26/33 26/33


성능의 균형 – 계속 프로세서와 주변장치간에 발전 불균형에 따른 문제를 극복하기 위한 방안 캐쉬의 사용. 예: 디스크 캐쉬 버퍼링 고성능 상호연결 버스 사용. 예: AGP, PCI Express x16 다중 프로세서 사용

27/33 27/33

칩 조직과 구조의 최근 발전방향 프로세서의 하드웨어 속도 증가 근본적으로는 회로 밀접도의 증가 캐쉬의 크기와 속도 증가 CPU 내에 캐쉬를 유지한다. 캐쉬 접근 속도 향상 Pentium 4는 크기의 50%을 캐쉬에 할애한다. 새로운 프로세서 조직과 구조 도입 Intel의 HT(Hyper Threading) 기술 다중 코어 기술

28/33 28/33


HT 기술 개요

single-threaded SMP

single-threaded CPU

hyper-threaded CPU

29/33 29/33

칩 조직과 구조의 발전에 따른 문제점 문제점 전력 회로 밀접도가 높아지고 클럭 속도가 빨라질 수록 power density가 증가하며, 이것은 열 발생량을 높여준다. RC 지연 전자의 흐름은 저항과 정전용량에 의해 제한된다. 선이 얇아질 수록 저항이 높아지며, 선들이 가깝게 위치할 수록 capacitance가 높아진다. 메모리와 속도 갭이 더욱 증가한다. 조직과 구조적 접근이 보다 강조됨 (하드웨어 속도의 발전보다는 HT와 같은 신기술 개발이 보다 중요함)

30/33 30/33


칩 조직과 구조의 발전에 따른 문제점

31/33 31/33

보다 복잡한 실행 방식 최근의 컴퓨터 성능 향상을 위한 조직적과 구조적 접근 방법 1. 캐쉬 용량 증가 방법 2. 여러 명령어를 동시에 수행함 여러 명령어를 동시에 수행하는 방법 방법 1. 파이프라인 기법: 공장 라인처럼 명령어를 지속적으로 실행함. 인출 실행 CPU의 idle time을 없앰 인출 실행 즉, 다른 명령어 실행의 단계를 중첩함 방법 2. Superscalar 기법: 다중 파이프라인을 하나의 CPU 내에 만들 수 있다. 서로 의존하지 않는 명령은 동시에 수행할 수 있다. 캐쉬 용량을 증가시키는 기법이나 여러 명령어를 동시에 수행하는 기법 들의 거의 기술적 한계까지 진보하였다. 즉, 더 이상 획기적인 발전을 기대하기 어렵다.

32/33 32/33


새 접근 방식 다중 코어: 단일 칩에 다중 프로세서 구현 한 프로세서 내에서 성능의 증가는 복잡성의 증가의 제곱근과 비례하여 증가한다. 소프트웨어가 다중프로세서를 활용할 수 있도록 구현되었다면 프로세서의 수에 비례하여 성능이 증가한다. 따라서 하나의 복잡한 프로세서보다는 여러 개의 단순한 프로세서가 보다 높은 성능을 가져다 줄 수 있다. 다중 코어는 다중 프로세서 시스템보다 저렴하다.

33/33 33/33


©copyright 2006

컴퓨터구조(INA200) 강의노트 03

컴퓨터 기능과 상호연결: 최상위 관점에서 한국기술교육대학교 정보미디어공학부 김상진

교육목표 최상위 수준에서 컴퓨터의 구성요소: CPU, 주기억장치, I/O 장치 컴퓨터의 기본 기능인 프로그램 수행을 위해 이들 요소들은 상호연결 되어 있다. 이 장에서는 각 구성요소의 외부적으로 나타나는 행위를 설명한다. 즉, 각 구성요소 간에 교환되는 데이터와 제어 신호를 설명한다. 또한 상호연결 구조와 상호연결 구조를 관리하는 방법을 설명한다.

2/39


컴퓨터 구성요소 프로그램을 실행하는 두 가지 방법 하드웨어 방식: 작업마다 필요한 하드웨어 요소들을 물리적으로 연결하여 사용하는 방식 소프트웨어 방식: 작업마다 필요한 요소들을 실제 결합하여 사용하기 보다는 작업마다 다른 신호를 요소들에게 보내 작업을 수행하는 방식 하드웨어 방식 소프트웨어 방식

소프트웨어 방식에서는 하드웨어 방식과 달리 각 프로그램마다 하드웨어를 재구성하지 않고 각 프로그램을 수행하기 위해 필요한 일련의 코드인 소프트웨어만 다시 작성하면 된다.

3/39

소프트웨어 방식 소프트웨어 방식에서 필요한 신호를 발생하기 위해 가능한 모든 신호마다 독특한 코드를 부여한 다음 이 코드를 받으면 코드에 해당하는 신호를 발생하는 하드웨어를 사용한다. 소프트웨어 방식에서 CPU는 CPU 명령어 해석기와 해석기 범용 산술 및 논리 기능 모듈로 모듈 구성되며, 컴퓨터는 CPU 외에 외부 상호작용을 위한 입출력 모듈과 모듈 프로그램과 데이터를 임시 저장할 수 있는 주기억장치가 주기억장치 필요하다. CPU는 주기억장치와 데이터 교환을 위해 MAR과 MBR 레지스터를 사용하며, 주변장치와 데이터 교환을 위해 I/O AR과 I/O BR 레지스터 를 사용한다. I/O AR은 특정 I/O 장치를 지정하기 위해 사용되며, I/O BR은 I/O 간에 데이터를 교환하기 위해 사용된다.

4/39


최상위 관점에서 컴퓨터 구성요소

5/39

컴퓨터 기능 컴퓨터의 기본 기능은 프로그램의 실행이다. 컴퓨터 입장에서 프로그램은 주기억장치에 적재되어 있는 일련의 명령어 집합이다. 명령어의 실행은 기본적으로 명령어를 인출하는 단계와 그것을 실행하는 단계로 나누어진다. 이 두 단계를 합쳐 명령어 주기 (instruction cycle)라 하며, 각 세부 단계를 인출 주기(fetch cycle)와 주기 실행 주기(execution cycle)라 한다. 주기 명령어의 실행은 여러 개의 연산으로 구성될 수 있다.

6/39


인출과 실행 명령어 주기가 시작되면 먼저 주기억장치에서 다음 명령어를 인출한다. 다음 명령어가 저장되어 있는 위치는 PC 레지스터에 저장되어 있다. 보통 명령어를 인출한 다음에는 PC 레지스터 값을 하나 증가한다. 인출된 명령어는 IR 레지스터에 저장된다. 명령어는 프로세서가 수행할 동작을 지정해주는 코드를 포함한다. 프로세서는 이것을 해석한 다음 적절한 동작을 취한다. 프로세서가 취하는 동작의 예 프로세서와 주기억장치 간에 데이터 이동 프로세서와 입출력 모듈 간에 데이터 이동 산술 또는 논리 연산 수행 실행 순서의 변경

7/39

가상적 기계에서 프로그램 실행의 예 명령어 형식

memory 300 1 9 4 0 301 5 9 4 1 302 2 9 4 1

940 941

정수 형식 opcode 의미 0001

메모리에 있는 값을 AC에 적재

0010

AC에 있는 값을 메모리에 적재

0101

메모리에 있는 값을 AC에 더함

CPU PC AC 1 9 4 0 IR 3 0 0

940 941

0 0 0 3 0 0 0 2

memory 300 1 9 4 0 301 5 9 4 1 302 2 9 4 1

memory 300 1 9 4 0 301 5 9 4 1 302 2 9 4 1

Step 1 CPU 3 0 1 PC 0 0 0 3 AC 5 9 4 1 IR

CPU 3 0 1 PC 0 0 0 3 AC 1 9 4 0 IR

0 0 0 3 0 0 0 2

memory 300 1 9 4 0 301 5 9 4 1 302 2 9 4 1

Step 2 CPU 3 0 2 PC 0 0 0 5 AC 5 9 4 1 IR 3+2=5

940 941

memory 300 1 9 4 0 301 5 9 4 1 302 2 9 4 1

940 941

940 941

0 0 0 3 0 0 0 2 Step 3 CPU 3 0 2 PC 0 0 0 5 AC 2 9 4 1 IR

memory 300 1 9 4 0 301 5 9 4 1 302 2 9 4 1

940 941

0 0 0 3 0 0 0 2 Step 5

0 0 0 3 0 0 0 2 Step 4 CPU 3 0 3 PC 0 0 0 5 AC 2 9 4 1 IR

0 0 0 3 0 0 0 5 Step 6

8/39


PDP-11의 예 예3.1) ADD B, A 메모리 B에 있는 값과 메모리 A에 있는 값을 더하여 그 결과를 메모리 A에 저장한다. 이 명령어의 명령어 주기는 다음과 같이 구성된다. 단계 1. ADD 명령어 인출 단계 2. 메모리 A에 있는 값을 레지스터로 옮김 단계 3. 메모리 B에 있는 값을 레지스터로 옮김 두 개의 AC가 필요함 단계 4. 두 값을 더함 ���계 5. 결과를 메모리 A에 저장함

9/39

명령어 주기 상태도 operand store

operand fetch

instruction fetch

multiple operand

instruction address calculation

instruction operation decoding

instruction complete, fetch next instruction

operand address calculation

multiple result

data operation

operand address calculation

Return for string or vector data

IAC(Instruction Address Calculation): 다음 명령어의 위치를 계산하는 과정으로서, 보통 이전 주소에 고정된 값을 더하여 계산된다.

10/39 10/39


인터럽트 인터럽트(interrupt)는 프로세서의 정상적인 처리 과정을 일시적으로 인터럽트 중단시키는 방법이다. 인터럽트의 종류 프로그램: 명령어 실행의 결과 때문에 발생 예3.2) 산술 넘침(overflow), 0 나누기 등 타이머: 주기적으로 무엇인가 실행하고 싶을 때 사용 입출력: 입출력 제어기가 연산의 끝이나 오류를 알리기 위해 발생 하드웨어 고장: 예3.3) 전원 부족 인터럽트는 처리 효율성을 높이기 위해 도입된 기법이다. 예3.4) 느린 주변장치가 작업을 완료할 때까지 CPU가 대기하는 것은 비효율적이다.

11/39 11/39

인터럽트의 예

인터럽트를 사용하지 않는 경우

입출력의 실행은 보통 다음과 같은 세 단계로 구성된다. 이 중 인트럽트를 사용하면 입출력의 실행단계는 사용자 프로그램의 실행을 병행할 수 있다. 준비단계(④): 출력할 내용을 버퍼에 저장 하거나 장치 명령에 필요한 파라미터를 준비하는 단계 실행단계: 실제 입출력 명령이 실행되는 단계 종료단계(⑤): 입출력 명령의 실행 결과를 알리는 플래그 등을 설정하는 단계 인트럽트를 사용하지 않고 입출력을 할 경우에는 그것이 완료될 때까지 CPU는 TEST 연산을 반복적으로 수행하면서 대기해야 한다.

12/39 12/39


인터럽트의 예 – 계속 인터럽트를 사용하면 입출력이 이루어지는 동안에 CPU는 계속 명령어를 실행할 수 있다. 이 때 준비단계가 끝나면 제어권이 다시 사용자 프로그램으로 복귀된다. 입출력 명령의 실행단계가 완료되면 인터럽트를 통해 CPU에게 알린다. CPU는 현재 프로그램의 실행을 잠시 중단하고, 발생된 인터럽트를 처리하기 위한 코드를 수행한다. 입출력 시간이 길 때 현재 수행 중인 입출력이 끝나기도 전에 다시 같은 종류의 입출력 요청이 발생할 수 있다. 이 경우에는 인트럽트를 사용하더라도 CPU는 이전 입출력이 끝날 때까지 대기해야 한다.

13/39 13/39

인터럽트 – short I/O wait 1

1

4

4

CPU

5

2a 5 2b

2 4 4 CPU

5

인터럽트를 사용하는 경우 short I/O wait

3

3a 5 3b

인터럽트를 사용하는 경우 short I/O wait

14/39 14/39


인터럽트 – long I/O wait 1

1

4

4

CPU

2 CPU

5

5 4

2 3 4 CPU CPU

인터럽트를 사용하는 경우 long I/O wait

5

3

5

인터럽트를 사용하는 경우 long I/O wait

15/39 15/39

인터럽트 주기

인터럽트를 수용하기 위해 명령어 주기에 인터럽트 주기가 추가되었다. 명령어를 실행한 다음에 CPU는 대기중인 인터럽트가 있는지 검사한다. 대기중인 인터럽트가 없으면 다음 명령어를 인출하여 실행한다. 대기중인 인터럽트가 있으면 현재 프로그램을 중단하고, 그 인터럽트를 처리한 후에 다시 현재 프로그램을 실행한다.

16/39 16/39


인터럽트 주기 대기중인 인터럽트가 있으면 CPU는 구체적으로 다음과 같은 일을 수행한다. 현재 수행중인 프로그램을 일시 중단하고 그 문맥(context)을 보관 문맥 한다. 문맥이란 다음에 실행할 명령어의 주소와 현재 프로세서의 동작과 관련된 데이터를 말한다. PC 레지스터에 인트럽트 처리기 루틴의 시작 주소를 적재한다. 인터럽트 처리 루틴이 종료되면 문맥을 복원하여 프로그램의 실행을 재개한다. 하나의 프로그램 실행 도중에 다른 프로그램을 실행해야 할 때에도 문맥 교환이 이루어진다. 따라서 인터럽트의 처리 과정에는 문맥의 보관/복원 과정이라는 오버헤드가 포함되어 있다. 하지만 CPU가 입출력을 하는 동안 무조건 대기하는 것보다는 효율적이다.

17/39 17/39

다중 인터럽트 인터럽트를 처리하는 도중에 인터럽트가 발생할 경우 처리 방법 방법 1. 인터럽트를 처리하는 도중에 발생하는 인터럽트는 무조건 무시하는 방법 대기중인 인터럽트는 현재 인터럽트를 처리한 후에 처리한다. 장점. 처리 방법이 단순하다. 단점. 인터럽트의 우선순위를 고려하지 못한다. 방법 2. 우선순위에 따라 인터럽트를 처리하는 방법 우선순위에 따라 현재 인터럽트를 중단하고 먼저 우선순위가 높은 인터럽트를 처리한다.

18/39 18/39


상호연결 구조 상호연결 구성(interconnection 구성 structure): 컴퓨터 내부 여러 모듈을 연결하는 경로들의 집합 상호연결의 설계는 모듈 간에 교환되는 정보에 의해 결정된다. 각 모듈의 입력과 출력은 옆 그림과 같다. 주기억장치: 주소로 접근할 수 있는 N개의 워드로 구성 입출력 모듈: 하나의 입출력 모듈이 여러 개의 외부장치를 제어할 수 있다. 이 때 각 외부장치는 포트(port)를 통해 식별된다. 포트

19/39 19/39

상호연결 구조 교환되는 데이터의 종류 주기억장치에서 프로세서: 프로세서는 주기억장치로부터 명령어 또는 데이터를 읽는다. 프로세서에서 주기억장치: 프로세서는 주기억장치에 데이터를 저장할 수 있다. 입출력에서 프로세서: 프로세서는 입출력 모듈을 통해 입출력 장치로부터 데이터를 읽는다. 프로세서에서 입출력: 프로세서는 입출력장치에 데이터를 전송한다. 입출력과 주기억장치 사이: DMA (Direct Memory Access) 방식에서는 입출력 모듈은 CPU를 거치지 않고 직접 주기억장치와 데이터를 교환할 수 있다.

20/39 20/39


버스 상호연결 버스(bus): 둘 이상의 장치를 연결하는 통신 경로 버스 버스는 공유 전송 매체이며, 한 번에 하나의 장치만 전송할 수 있지만 이 매체를 공유하는 모든 장치는 그 데이터를 수신할 수 있다. 버스는 보통 여러 개의 통신 경로로 구성되어 있으며, 각 경로는 한 비트를 전송할 수 있다. 버스를 사용하는 이유 쉽게 장치를 연결할 수 있다. 비용이 저렴함 시스템 버스: CPU, 주기억장치, 입출력과 같은 컴퓨터 주요 구성요소를 연결하는 버스

21/39 21/39

버스의 구성 버스는 교환하는 데이터의 종류에 따라 데이터 버스, 주소 버스, 제어 버스로 나누어진다. 이외에 전원을 공급하는 기타 버스가 있을 수 있다. 데이터 버스: 버스 실제 데이터가 전송된다. 주소 버스: 버스 데이터 버스를 통해 교환될 데이터의 위치 정보가 전송된다. 제어 버스: 버스 이 버스를 통해 연결된 각 모듈을 제어하고, 데이터 버스와 주소 버스의 사용을 제어한다. 많은 모듈이 버스를 공유하기 때문에 제어가 중요하다. 버스를 구성하는 선로의 수를 버스의 폭(width)이라 한다. 이 폭은 컴퓨터 성능에 큰 영향을 준다.

22/39 22/39


버스의 구성 – 계속 주소 버스의 폭은 시스템의 최대 주기억장치의 크기를 결정한다. 예3.5) 주소 버스의 폭이 16 비트이면 최대 참조 가능한 주기억장치 크기는 216 byte = 64 KB이다. 컴퓨터의 명령어 크기가 32 비트이고, 데이터 버스의 크기가 16 비트 이면 각 명령어 주기 동안에 두 번 주기억장치 모듈을 접근해야 한다. 예3.6) 데이터 버스가 10 MHz로 동작하고, 버스의 폭이 16 비트이다. 버스로부터 데이터를 받기 위해 최소 2 클럭 주기가 필요하다. 그러면 이 버스의 최대 데이터 전송률은? 클럭 주기 = 1/10 MHz = 100 ns 버스 주기 = 2 ± 100 ns = 200 ns 데이터 전송률 = 16 비트 / 200 ns = 8 ± 107 bit/s = 10 Mbytes/s 한번의 읽기 실행 후 한 클럭 주기 동안 대기해야 할 경우 데이터 전송률은? 버스 주기 = 3 ± 100 ns = 300 ns 데이터 전송률 = 16 비트 / 300 ns ≈ 7 Mbytes/s 23/39 23/39

버스의 구성 – 계속 입출력의 경우에는 주소 비트로 전달되는 상위 비트는 입출력 모듈을 식별하기 위해 사용되며, 하위 비트는 이 모듈에 연결된 입출력 장치(포트) 또는 모듈 내의 메모리 위치를 식별하기 위해 사용된다. 주기억장치와 입출력 모듈이 주소 버스를 공유하면 상위 비트들을 이용하여 특정 모듈을 식별한다. 예3.7) 주소 버스의 폭이 8 비트이면 0000 0000 부터 0111 1111 까지는 주기억장치 내에 주소 정보로 인식되고, 1000 0000부터 1111 1111까지는 입출력 모듈에 연결된 장치를 식별하기 위한 정보로 인식된다. (강의노트 07 참조) 이 경우 주소 버스의 폭이 8이지만 최대 참조 가능한 주기억장치의 위치는 27 = 128이다.

24/39 24/39


버스의 구성 – 계속 제어 버스를 통해 교환되는 제어 신호의 종류 기억장치 쓰기 기억장치 읽기 입출력 쓰기 입출력 읽기 ACK 전송: 데이터를 잘 받았음을 또는 데이터를 버스에 적재하였음을 알릴 때 사용 버스 사용 요청 버스 사용 승인 인트럽트 요청 인터럽트 ACK: 인터럽트가 대기중임을 인식하였다는 것을 알릴 때 사용 클럭: 연산을 동기화하기 위해 사용 재설정(reset): 모든 모듈을 초기화할 때 사용 25/39 25/39

버스의 구성 – 계속 버스를 통해 데이터를 전송하는 절차 단계 1. 버스 사용 권한 획득 단계 2. 제어 버스와 주소 버스를 통해 목적지를 알리고, 데이터 버스를 통해 데이터 전송 버스를 통해 데이터를 수신하는 절차 단계 1. 버스 사용 권한 획득 단계 2. 제어 버스와 주소 버스를 통해 데이터 요청 단계 3. 데이터 버스를 통해 실제 데이터가 전송될 때까지 대기

26/39 26/39


다중 버스 계층구조 많은 장치를 하나의 버스에 연결할 때 발생할 수 있는 문제점 문제점 1. 버스의 길이가 길어져 전송 속도가 느려지며, 버스 사용을 조정하는데 걸리는 시간이 길어진다. 문제점 2. 전체 데이터 전송 용량이 버스의 용량에 접근할 수록 병목현상이 발생한다. 이것은 버스에 연결된 전체 장치들의 단위 시간당 전송 요구량의 총합을 버스가 감당하지 못한다는 것을 말한다. 위 문제를 극복하기 위해 다중 버스 계층구조를 사용한다.

27/39 27/39

다중 버스 계층구조

전통적인 버스 구조

캐시 사용 목적: CPU가 주기억장치를 빈번히 접근하는 것을 줄이기 위함 이 구성에서 시스템 버스를 통한 입출력과 주기억장치 간에 데이터 교환은 CPU의 동작을 방해하지 않음 입출력 모듈을 바로 시스템 버스에 연결할 수 있지만 확장 버스에서 연결하고, 확장 버스 인터페이스를 사용하는 방법을 많이 사용한다. 확장 버스 인터페이스는 시스템 버스와 입출력 모듈 간에 데이터를 버퍼링한다. 이를 통해 프로세서와 버스의 속도 차이를 극복할 수 있다. 이 구성을 사용하면 입출력과 주기억장치와 프로세서 간의 데이터 교환을 분리할 수 있으며, 다양한 입출력 장치를 지원할 수 있다. 다양한 장치를 지원할 수 있는 이유는 확장 버스 인터페이스에서 다양한 입출력 장치의 속도와 데이터 형태를 맞추어 주기 때문이다.

28/39 28/39


다중 버스 계층구조 이 구성에서 캐시 제어기는 시스템 버스와 연결되어 있을 뿐만 아니라 고속 버스와 시스템 버스 간에 브리지(bridge) 역할을 한다. 브리지 브리지 역할을 한다는 것은 고속 버스와 시스템 버스 간에 데이터를 버퍼링한다는 것을 말한다. 이 구성의 장점: 고속 버스를 사용하여 요구량이 많은 장치는 프로세서와 더욱 밀접하게 구성하는 동시에 프로세서와 독립적으로 운영 할 수 있다는데 있다. 고성능 버스 구조 FireWire: IEEE1394

29/39 29/39

버스 설계 쟁점 – 버스의 종류 버스의 종류 전용 버스(dedicated bus): 영구히 한 가지 기능만 수행하도록 버스 지정된 버스 기능적 측면의 예: 데이터 버스, 주소 버스 물리적 측면의 예: 시스템 버스, 고속 버스, 확장 버스 장점: 처리율 증가 단점: 비용 증가, 시스템 크기 증가 다중화 버스(multiplexed bus): 여러 용도로 사용되는 버스 버스 시분할 다중화(time multiplexing) 방식: 버스의 선로 중 하나를 주소 유효 제어선으로 사용하여 이 값에 따라 데이터 또는 주소를 전송하는 방식 시분할 다중화 방식의 장단점 장점: 공간 절약, 비용 절감 단점: 회로의 복잡성, 성능 하락

30/39 30/39


버스 설계 쟁점 – 중재 방법 여러 모듈이 하나의 버스를 공유하면 이들 간에 사용을 중재할 방법이 필요하다. 버스 트랜잭션: 요청과 실제 데이터 전송으로 구성 버스 개체의 종류 버스 마스터: 버스 트랜잭션을 시작할 수 있는 개체 버스 슬레이브: 요청에 응할 수만 있는 개체 버스 중재 방식은 다음 두 요인의 균형을 맞추어야 함 우선순위: 우선순위가 높은 장치는 먼저 서비스가 되어야 함 공정성: 아무리 우선순위가 낮더라도 결국에는 서비스가 되어야 함

31/39 31/39

버스 설계 쟁점 – 중재 방법(계속) 버스 중재 방식의 종류 중앙집중 방식: 방식 버스 제어기 또는 버스 중재자(bus arbiter)라는 단일 하드웨어 장치가 홀로 중재하는 방식 직렬 연결(daisy-chain) 방식: 연결 방식 우선순위가 높은 것부터 차례로 버스를 선점할 수 있는 방식으로 단순하지만 공정성을 보장하지 못함

BPRN(Bus PRiority iN) BPRO(Bus Priority Out)

중앙집중 병렬 방식: 방식 중재자에게 요청하여 사용하는 방식으로 중재자가 공정성을 보장해줄 수 있다. 예3.8) Intel PCI

32/39 32/39


버스 설계 쟁점 – 중재 방법(계속) 분산 방식: 방식 각 모듈에 접근 제어 논리가 내장되어 있는 방식 자체 선택 방식: 방식 각 장치가 버스에 자신의 코드를 적재한 다음 누가 가장 우선순위가 높은지 자체적으로 결정 충돌 탐지(collision detection) 방식: 탐지 방식 버스로 데이터를 무조건 전송하고 만약 다른 장치의 전송과 충돌하면 임의 시간을 기다린 후에 다시 시도하는 방식. 예3.9) Ethernet

33/39 33/39

버스 설계 쟁점 – 타이밍 버스 주기: 한 장치가 버스를 이용하고 나서 다른 장치에 넘겨주는 데 걸리는 시간 타이밍: 버스에서 일어나는 사건을 조정하는 방법 동기식 타이밍: 사건의 발생은 시스템의 클럭에 의해 결정된다. 비동기식 타이밍: 사건의 발생이 이전 사건의 발생에 의해 결정된다. 동기식 타이밍 대부분의 사건은 한 클럭 주기 동안에 일어난다. 신호를 전송한 후에 약간의 시간이 흘러야 선로가 안정화된다. address enable 신호는 주소 버스에 주소 정보가 있음을 알리는 신 호이다. 동기식 타이밍은 구현하기 쉽지만 유연성이 떨어지는 방식이다.

34/39 34/39


타이밍 도표 버스의 각 선은 보통 두 가지 레벨의 신호(0 또는 1)를 전송할 수 있다. 타이밍 도표는 한 선에서 시간의 흐름에 따른 신호의 변화를 도식화 하기 위해 사용된다. 보통 1은 0보다 높은 레벨에 표시하며, 기본은 0이다.

신호��� 변화는 즉시 일어나지 않고 어느 정도의 시간이 필요하다. 그러나 신호가 유지되는 시간에 비해 전이 시간(0에서 1로, 1에서 0으로 바뀌기 위해 필요한 시간)은 상대적으로 매우 짧다. 여러 선을 하나의 그룹으로 묶어 표현할 수 있다. 신호 이름 위에 선이 있으면 이 신호는 0을 1처럼, 1를 0처럼 사용한다는 것을 나타낸다. 원인과 결과 의존성 35/39 35/39

버스 설계 쟁점 – 타이밍(동기식 타이밍) 버스에 연결된 모든 장치는 클럭신호를 수신한다. 이 클럭 신호에 따라 동기화 한다. 즉, 모든 사건은 클럭 주기가 시작 될 때마다 시작된다. 예3.10) 프로세서는 첫 번째 클럭 주기에서 주소 버스에 주기억장치의 주소를 보낸다. 주소 버스가 안정화되면 주소 활성화 신호를 보낸다. 읽기의 경우 두 번째 클럭 주기에 읽기 명령을 보낸다. 주기억장치는 주소 활성화 신호를 감지한 다음에 그 다음 주기에 데이터를 데이터 버스로 전송한다. 프로세서가 데이터를 모두 읽으면 읽기 명령 신호를 없앤다.

36/39 36/39


버스 설계 쟁점 – 타이밍(비동기식 타이밍) 한 사건의 시작은 이전 사건에 의해 결정된다. 예3.11) 프로세서는 주소 버스에 주소 정보를 전송한다. 이 신호가 안정되면 읽기 명령 신호를 전송한다. 주기억장치는 주소 정보를 해석한 다음 데이터를 데이터 버스를 통해 전송한다. 이 신호가 안정되면 ACK 신호를 보낸다. 프로세서가 데이터를 모두 수신하면 읽기 명령 신호를 중단하게 되며, 주기억장치도 ACK 신호를 중단하게 된다.

37/39 37/39

버스 설계 쟁점 – 데이터 전송 유형 버스는 전용 버스인지 다중화 버스인지에 따라 다양한 데이터 전송 유형을 지원한다. 읽기와 쓰기가 여러 가지 방법으로 조합될 수 있다. 읽기 수정 쓰기(read-modify-write): 읽기를 한 다음에 같은 주소에 쓰기 바로 쓰기를 수행하는 경우이다. 이 때 주소는 한 번만 전송된다. 쓰기 후 읽기(read-after-write): 쓰기를 한 다음에 같은 주소에 바로 읽기 읽기를 수행하는 경우이다. 어떤 버스는 블록 데이터 전송을 지원한다. 이 경우 하나의 주소 주기가 수행된 후에 n개의 데이터 주기가 연속적으로 수행된다.

38/39 38/39


PCI PCI(Peripheral Component Interconnect): 프로세서와 독립적인 고속 버스로서 고속 버스 역할이나 주변장치 버스 역할을 한다. 현재 표준은 버스 폭이 최대 64(기본 32)이며 66MHz로 동작한다. 대략 전송률은 528 MBytes/s이다. PCI는 속도뿐만 아니라 구현하기 쉽기 때문에 현재 가장 널리 사용되고 있다. 중앙 집중 방식의 중재방법을 사용 동기식 타이밍 기법을 사용

39/39 39/39


©copyright 2006

컴퓨터구조(INA210) 강의노트 04

캐쉬 기억장치

한국기술교육대학교 정보미디어공학부 김상진

교육목표 컴퓨터 기억장치는 계층(hierarchy)으로 조직된다. 계층 기억장치 계층에서 아래쪽으로 갈수록 비트당 가격은 떨어지고, 용량이 증가하며, 접근 시간은 더 느리다. 즉, 가격/용량/접근시간을 고려하여 가장 최적으로 구성하기 위해 기억장치를 계층으로 조직한다. 프로세서 속도는 주기억장치의 속도에 비해 상대적으로 빠르다. 이것을 극복하기 위해 프로세서와 주기억장치 사이에 캐쉬 기억장치를 사용한다. 캐쉬를 사용하여 성능을 향상시킬 수 있는 요인은 참조의 지역성 원리 때문이다.

2/36


기억장치 시스템의 특성 특성

특성

위치

프로세서 내부 (main) 외부 (secondary)

성능

접근 시간 주기 시간 전송률

용량

워드의 크기 워드의 개수

물리적 유형

반도체 자기 광 자기-광

전송 단위

워드 블록

물리적 특성

휘발성/비휘발성 삭제가능/삭제불가능

접근 방법

순차(sequential) 직접(direct) 임의(random) 연관(associative)

조직

임의 접근 방식의 경우에는 워드의 물리적 배열을 말한다.

3/36

위치, 용량 위치 내부 기억장치라 하면 보통 주기억장치를 말한다. 프로세서도 레지스터라는 형태의 내부 기억장치를 필요로 하며, 프로세서의 제어장치도 내부적으로 데이터를 임시적 저장하기 위한 기억장치를 가지고 있다. 캐쉬도 내부 기억장치의 한 형태이다. 외부 기억장치라 하면 주변 저장장치로서 디스크, 테이프 등을 말한다. 용량 보통 바이트나 워드 단위로 표현된다. 내부/외부 기억장치는 모두 보통 바이트 단위로 용량을 표현한다. 워드의 일반적인 크기는 8, 16, 32 비트이다.

4/36


전송 단위 내부 기억장치의 경우에는 버스의 폭이 전송 단위를 결정한다. 전송 단위는 워드의 크기와 일치할 수 있지만 종종 워드보다 크다. 전송 단위 측면에서 내부 기억장치와 관련된 개념 워드: 워드 보통 정수 또는 명령어를 표현하기 위해 사용되는 비트의 수와 일치한다. 주소 지정 단위: 단위 주소 지정 단위는 보통 워드이지만 워드보다 작은 바이트 단위를 사용하는 경우도 있다. A가 주소를 나타내기 위해 사용되는 비트 수이고, 주소를 지정할 수 있는 총 위치가 N이면 N = 2A이다. 전송 단위: 단위 한번에 읽거나 쓰는 비트의 수를 말하며, 전송 단위는 반드시 워드의 크기나 주소 지정 단위의 크기와 일치할 필요는 없다.

5/36

접근 방법 순차 접근(sequential access): 기억장치는 레코드라는 단위로 조직되어 접근 있으며, 특정 순서(선형 순서)에 따라 접근할 수 밖에 없는 방식 접근 시간: 일정하지 않다. 예4.1) 4.1) 자기 테이프 직접 접근(direct access): 어떤 특정 영역으로는 바로 이동할 수 있지만 접근 그 영역 내에서는 순차 접근을 해야 하는 방식 접근 시간: 일정하지 않다. 예4.2) 4.2) 자기 디스크 임의 접근(random access): 어떤 위치나 바로 접근할 수 있는 방식 접근 접근 시간: 접근 위치나 이전에 접근한 위치와 상관없이 일정하다. 예4.3) 4.3) 주기억장치 연관 접근(associative access): 주소 대신에 위치에 저장된 내용을 기반하여 접근 접근하는 방식 내용 비교가 모든 워드에 대해 동시에 이루어진다. 접근시간: 접근 위치나 이전에 접근한 위치와 상관없이 일정하다. 예4.4) 캐시 6/36


성능 접근 시간(access time): 시간 임의 접근: 읽기와 쓰기 연산을 수행하는데 걸리는 시간이다. 임의 접근이 아닌 경우: 특정한 위치까지 읽기-장치 메커니즘을 옮기는데 걸리는 시간이다. 주기 시간(cycle time): 임의 접근에만 해당하는 것으로서, 접근 시간과 시간 그 다음 접근이 시작되기 위해 필요한 시간을 합친 시간이다. 전송률(transfer rate): 기억장치에 데이터가 전송되어 들어가거나 전송률 나오는데 걸리는 시간이다. 임의 접근: 1/(cycle time) 비임의 접근: TN = TA + N/R TN: N 비트를 읽거나 쓰기 위해 필요한 평균 시간 TA: 평균 접근 시간 N: 비트의 수 R: 전송률 7/36

물리적 특성 휘발성(volatile): 전력 공급이 중단되면 저장된 데이터가 소멸되거나 휘발성 전력 공급과 상관없이 자연적으로 소멸되는 기억장치를 휘발성 기억장 치라 한다. 보통 반도체 기억장치는 휘발성이지만 비휘발성(nonvolatile)도 비휘발성 있다. 삭제불가능(nonerasable): 한 번 기록한 후에는 내용을 변경할 수 삭제불가능 없는 기억장치이다. 이와 같은 반도체 기억장치를 읽기 전용 기억장치 (ROM, Read-Only Memory)라 한다.

8/36


기억장치의 계층 구조 컴퓨터 시스템의 기억장치를 어떻게 구성할 것인가? 용량: 용량 많으면 많을 수록 좋다. 속도: 속도 프로세서의 속도에 보조를 맞출 수 있어야 한다. 가격: 가격 실용성 측면에서 보면 다른 구성요소에 비해 가격 경쟁력이 있어야 한다. 용량, 속도, 가격 간에 상관 관계 접근 속도가 빠를수록 비트 당 가격은 높아진다. 용량이 커질수록 비트 당 가격은 낮아진다. 용량이 커질수록 접근 속도는 느려진다. 이런 문제의 해결책은 기억장치 계층 구조를 사용하는 것이다. 9/36

기억장치의 계층 구조 – 계속 계층 구조에 아래에 있을 수록 다음 현상이 나타난다. 조건 1. 비트당 가격 감소 조건 2. 용량 증가 조건 3. 접근 시간 증가 조건 4. 프로세스가 기억장치를 접근하는 빈도 감소 프로세서가 두 계층으로 구성된 기억장치를 접근한다고 가정하자. 만약 얻고자 하는 데이터가 첫 레벨에 있으면 직접 접근할 수 있지만, 두 번째 레벨에 있으면 먼저 그 데이터를 첫 레벨 기억장치로 옮겨야 한다. 첫 레벨의 접근 시간은 T1, 두 번째 레벨의 접근 시간은 T2, 첫 레벨의 적중률(hit ratio)이 H이면 평균 접근 시간 Ts는 다음과 같다. Ts = H ± T1 + (1-H) ± (T1+T2) = T1 + (1-H) ± T2 적중률이란 접근하고자 하는 데이터가 그 레벨에 있을 확률

10/36 10/36


기억장치의 계층 구조 – 계속 예4.5) 시스템이 두 계층으로 구성되어 있다. 첫 레벨은 1000 워드로 구성되어있고 접근 시간은 0.01 μs이다. 두 번째 레벨은 100,000 워드로 구성되어 있고 접근 시간은 0.1 μs이다. 만약 적중률이 95%이면 평균 접근 시간은 다음과 같다. 0.95 ± 0.01 μs + 0.05 ± (0.01 μs + 0.1 μs) = 0.015 μs 보는 바와 같이 평균 접근 시간은 첫 레벨의 접근 시간에 근접하다. T1+T2 T2 평균 접근시간

T1 0

레벨 1의 적중률

1

11/36 11/36

기억장치의 계층 구조 – 계속 조건 4가 유효한 증거 중 하나는 참조의 지역성(locality of reference) 지역성 원리이다. 이 원리에 의하면 프로그램이 실행되는 동안 데이터나 명령어에 대한 프로세서의 주기억장치 참조는 한 묶음 단위로 이루어지는 경향이 있다. 분기 또는 호출 명령을 제외하고는 명령어는 순차적으로 실행된다. 이전에 호출된 함수를 종료하지 않은 채 계속적으로 다른 함수를 호출하는 경우는 드물다. 보통 루프에 포함되는 프로그램 문장의 수는 적다. 배열(array)과 같은 데이터 구조를 사용하는 경우, 이 배열에 대한 지속적인 참조를 하는 경우가 많다. 참조의 지역성은 보통 공간적 측면의 지역성을 말하지만 시간적 측면에서도 성립한다. 즉, 프로세서는 최근에 참조한 것을 다시 또 참조하는 경향이 있다.

12/36 12/36


기억장치의 계층 구조 – 계속 참조의 지역성 원리에 따라 하위 레벨에서 상위 레벨로 한번에 한 클러스터 단위로 데이터를 옮기면 프로세서는 그 이후에는 한동안 계속 하위 레벨에 대한 요구 없이 상위 레벨만 사용하게 된다. 이 현상은 기억장치 계층구조 전반에 걸쳐 이루어진다. 예4.6) C/C++ 언어에서 변수 선언시 register 키워드의 사용 소프트웨어를 이용하여 효과적으로 레벨을 추가할 수 있다. 예4.7) 디스크 캐시 디스크 캐시는 주기억장치의 일부분을 활용하여 디스크에 기록할 데이터를 임시로 보관하는 버퍼이다. 디스크 캐시의 장점 디스크 쓰기를 묶어서 한 번에 처리할 수 있다. 디스크 쓸 데이터 중 실제 쓰기가 이루어지기 전에 다시 접근될 수 있다.

13/36 13/36

캐시 기억장치의 원리 캐시의 목적은 저렴한 비용으로 주기억장치에 대한 접근 시간을 향상 시키는데 있다. 캐시의 기본 원리 주기억장치보다 속도가 빠른 소용량의 캐시 기억장치를 유지한다. 캐시는 주기억장치에 있는 내용의 복사본을 유지한다. 프로세서가 주기억장치로부터 데이터를 읽을 때 먼저 그 데이터가 캐시에 있는지 검사한다. 데이터가 캐시에 있으면 캐시로부터 데이터를 얻지만, 없으면 그 데이터가 포함된 한 블록을 캐시로 옮겨온 다음에 캐시로부터 데이터를 얻는다. 참조의 지역성 원리 때문에 이런 구성이 효과가 있다.

14/36 14/36


캐시와 주기억장치의 구조 주기억장치는 주소를 지정할 수 있는 2n개의 워드로 구성되어 있다. K개의 워드들의 묶음을 블록이라 하며 총 M = 2n/K개의 블록이 있다. 캐시는 K개의 워드로 구성된 C개의 라인으로 구성되며, C는 M 보다 훨씬 적다. 주기억장치로부터 하나의 워드를 memory address tag block 읽으면 그 워드를 포함한 전체 0 0 1 1 블록이 캐시 라인 중 하나로 block 2 (K words) 먼저 복사된다. C가 M보다 훨씬 적으므로 각 라인에 주기억장치의 어느 C-1 block length 블록이 적재되어 있는지 식별할 (K words) 수 있어야 한다. 이를 위해 block 태그를 사용한다. (K words) 2n-1 word length

15/36 15/36

캐시 읽기 연산

system bus

CPU RA .

RA RA ?

.

캐시 적중: 적중 데이터와 주소 버퍼는 차단 되고 프로세스와 캐시 간에만 통신이 이루어진다. 따라서 시스템 버스에는 트래픽이 발생하지 않는다.

RA CPU .

RA CPU

.

캐시 부적중: 부적중 원하는 데이터의 주소를 시스템 버스에 적재하면 데이터는 데이터 버퍼를 통해 프로세서와 캐시에 모두 전달된다.

16/36 16/36


캐시 설계 요소 특성

특성

크기

쓰기 정책

매핑 방법

직접 연관 집합 연관(set associative)

라인 크기

교체 알고리즘

LRU(Least Recently Used) FIFO(First In First Out) LFU(Least Frequently Used) Random

캐시의 수

write through write back write once

단일 또는 다중 레벨 통합 또는 분리

17/36 17/36

캐시 크기 캐시의 크기는 비트 당 평균 비용이 주기억장치만을 사용하였을 때와 같도록 충분히 적어야 하며, 평균 접근 시간이 캐시만을 사용하였을 때와 같도록 충분히 커야 한다. 캐시의 크기가 클수록 회로가 복잡해지며, 이 경우는 속도가 저하된다. L1 캐시

도입 년도

명령어

데이터

Pentium

1993

8 KB

8 KB

256 – 512 KB

Pentium 4

2000

12 K μ-op

8 – 16 KB

512 KB – 2 MB

Pentium D

2004

16 KB

16 KB

2 ± 2 MB

4 MB

Itanium 2

2002

256 KB

3 MB – 9 MB

프로세서

32 KB

L2 캐시

L3 캐시

execution trace cache

18/36 18/36


매핑 함수 캐시의 라인 수가 주기억장치의 블록 수에 비해 상대적으로 적으므로 주기억장치 블록을 캐시 라인에 매핑하는 알고리즘이 필요하다. 주기억장치의 어떤 블록들이 현재 캐시에 있는지 결정하는 방법도 필요하다. 매핑 방법 설명에 사용될 캐시의 구성 캐시의 크기: 64 KBytes 주기억장치의 크기: 16 Mbytes = 224 bytes 주기억장치 블록의 크기: 4 Bytes 캐시의 라인 수: 64/4 = 16 K = 214 주기억장치의 블록 수: 16/4 = 4M = 222 주기억장치의 각 바이트를 24 비트 주소로 직접 지정할 수 있다.

19/36 19/36

매핑 함수 – 직접 매핑(direct mapping) 매핑함수: i = j mod m i: 캐시 라인 번호, j: 주기억장치 블록 번호, m: 캐시의 총 라인 수 이 방식은 주소를 이용하여 매핑한다. 이를 위해 주소를 다음과 같이 세 부분으로 나눈다. 최하위 w비트: 블록 내의 워드 또는 바이트의 위치 최상위 s비트: 주기억장치 내의 블록 위치 최상위 s – r비트: 태그 나머지 r비트: 캐시 내의 라인 위치 장점. 단순하며 구현 비용이 저렴하다. 단점. 주어진 주기억장치 블록이 저장되는 캐시의 위치가 고정되어 있다. 따라서 같은 위치로 매핑되는 두 블록을 자주 읽으면 계속 캐시 내용이 바뀌어야 하는 문제점이 있다. 이 문제를 thrashing이라 한다.

20/36 20/36


매핑 함수 – 직접 매핑(direct mapping) s+w memory address tag line

s-r

tag

CACHE data

MAIN MEMORY

word

L0

w

r

W0 W1 W2 W3

B0

W4j W(4j+1) W(4j+2) W(4j+3)

Bj

s-r

compare

w

Li

s w

cache hit

Lm-1 cache miss

21/36 21/36

매핑 함수 – 연관 매핑(associative mapping) 이 방법은 직접 매핑과 달리 주기억장치의 블록은 캐시의 아무 라인에 적재될 수 있다. 주소를 태그와 워드 필드로 나누어 사용한다. 따라서 주소 내에 캐시 라인 번호를 결정하는 필드가 없다. 캐시 내에 블록이 있는지 검사하기 위해 한 번에 모든 태그를 동시에 비교하여야 한다. 장점. 주기억장치의 블록은 캐시의 아무 라인에 적재될 수 있다. 따라서 성능은 교체 알고리즘에 의해 결정되며, thrashing은 발생하지 않는다. 단점. 복잡한 회로가 필요하다.

22/36 22/36


매핑 함수 – 연관 매핑(associative mapping) s+w memory address tag

s

tag

CACHE data

MAIN MEMORY

word

L0

w

s

s

W0 W1 W2 W3

B0

W4j W(4j+1) W(4j+2) W(4j+3)

Bj

compare

w

s

Li

w cache hit

Lm-1

s cache miss

23/36 23/36

매핑 함수 – 집합 연관 매핑(set associative mapping) 이 방법은 직접 매핑과 연관 매핑의 장점만을 수용한 방식이다. 이 방법에서 캐시는 각 k개의 라인으로 구성된 v 집합으로 나뉘어진다. 캐시의 집합 번호 i와 주기억장치의 블록 번호 j의 관계는 다음과 같다. i = j mod v 연관 매핑에서는 태그를 모든 라인하고 비교해야 하지만 이 방법에서는 집합 내에 있는 라인의 태그하고만 비교하면 된다. 주소를 태그, 집합, 워드 필드로 나누어 사용한다. 극단적인 경우 v = m, k = 1: 직접 매핑과 같음 가장 흔한 경우: (2-way) v = m/2, k = 2 또는 (4-way) v = m/4, k = 4 세트 당 라인의 수를 4이상 늘리면 성능 향상에 도움이 되지 않는다.

(2-way)

m = 214 v = 213

직접 매핑에서는 같은 라인으로 매핑되는 두 개의 블록을 번갈아 접근하면 thrashing이 발생하지만 집합 연관 매핑에서는 발생하지 않는다. 또한 비교 회로가 연관 매핑에 비해 훨씬 단순하다. 24/36 24/36


매핑 함수 – 집합 연관 매핑(set associative mapping) s+w memory address tag set

s-d

d

tag word

CACHE data

MAIN MEMORY

F0

w

B0

F1

B1 Set 0

FK-1 s-d

FK

s+w

Bj

FK+1 Set 1

F2K-1 compare

cache hit cache miss

25/36 25/36

교체 알고리즘 새로운 블록을 캐시로 가지고 왔을 때 빈 라인이 없으면 기존 라인 중 하나와 교체되어야 한다. 직접 매핑의 경우 교체할 라인이 정해져 있으므로 별도의 교체 알고리즘이 필요 없다. 연관 매핑 또는 집합 연관 매핑의 경우에는 교체 알고리즘이 필요하다. 가장 널리 사용되는 네 가지 알고리즘 LRU(Least Recently Used): 가장 오랫동안 사용되지 않은 블록이 있는 라인을 선택한다. FIFO(First-In-First-Out): 가장 오래 전에 캐시에 들어온 블록이 있는 라인을 선택한다. LFU(Least Frequently Used): 가장 적게 사용된 블록이 있는 라인을 선택한다. 임의(random): 임의로 라인을 선택한다.

26/36 26/36


교체 알고리즘 – LRU 2-way 집합 연관 방식에서는 각 라인마다 USE 비트를 사용한다. 사용하면 1로 설정하고 그 때 집합 내에 다른 라인은 0으로 설정한다. 4-way 집합 연관 방식에서 카운터를 이용한 LRU 구현 방법 각 라인마다 2 비트의 카운터를 연결한다. 접근이 이루어지면 그 라인의 카운터는 0으로 설정되고, 그 라인의 원래 값보다 카운터 값이 적은 라인들은 카운터를 하나 증가한다. 집합에 있는 모든 라인에 블록이 적재되어 있을 때 블록 교체가 필요하면 카운터 값이 3인 것을 교체한다.

27/36 27/36

교체 알고리즘 – LRU(계속) 예4.7) 접근 순서(4-way): 같은 집합으로 매핑되는 4개의 주기억장치 블록이 L0, L1, L2, L3에 각각 적재되었다고 가정하자. 적재된 순서는 L0, L1, L2, L3이다. 그 다음 L1, L2에 있는 블록을 접근하였다. 현재 이 집합에 적재되어 있지 않은 이 집합으로 매핑되는 새 블록을 접근 하였다고 가정하자. 이 때 각 라인의 카운터 값은 옆 표와 같다.

순서 1 2 3 4 5 6 7

필드

L0

L1

L2

L3

유효비트

1

0

0

0

카운터

0

0

0

0

유효비트

1

1

0

0

카운터

1

0

0

0

유효비트

1

1

1

0

카운터

2

1

0

0

유효비트

1

1

1

1

카운터

3

2

1

0

유효비트

1

1

1

1

카운터

3

0

2

1

유효비트

1

1

1

1

카운터

3

1

0

2

유효비트

1

1

1

1

카운터

0

2

1

3

28/36 28/36


교체 알고리즘 – FIFO, LFU, Random FIFO(First-In-First-Out): 가장 오래 전에 캐시에 들어온 블록이 있는 라인을 선택한다. 순환 버퍼를 사용하여 구현한다. 이것은 캐시 자체를 순환 버퍼로 만든다는 것이다. LFU(Least Frequently Used): 가장 적게 사용된 블록이 있는 라인을 선택한다. 각 라인마다 카운터를 연관시켜 구현한다. 단점. 가장 최근에 들어온 것이 계속 교체될 수 있다. 임의(random): 임의로 라인을 선택한다. 시뮬레이션 결과 이 방식을 사용하여도 다른 방식에 비해 성능이 크게 저하되지 않는다는 것이 증명되어 있다.

29/36 29/36

쓰기 정책 – 계속 캐시에 있는 어떤 블록의 내용이 변경되었지만 주기억장치에는 아직 변경이 반영되지 않았을 수 있다. 이 때 교체가 일어나면 일관성에 문제가 발생한다. 따라서 블록을 교체하기 전에 이런 문제가 발생하지 않도록 확인해야 한다. 쓰기 정책의 고려 사항 여러 장치가 주기억장치에 직접 쓰기와 읽기가 가능할 수 있다. 여러 프로세서가 같은 버스에 연결된 다중 프로세서 시스템에서는 각 프로세서는 각자의 캐시를 가지고 있을 수 있다.

30/36 30/36


쓰기 정책 – 계속 쓰기 정책의 종류 Write through: 모든 쓰기는 주기억장치와 캐시에 모두 반영된다. 다른 장치는 시스템 버스를 관찰하여 스스로 사용하는 캐시를 갱신할 수 있다. 장점. 항상 일관성을 유지한다. 단점. 트래픽이 많이 발생한다. Write back: 캐시에만 우선 반영되고, 각 캐시의 라인마다 UPDATE 비트를 설정한다. 주기억장치에 대한 쓰기는 라인이 교체될 때 이루어진다. 장점. 트래픽이 적게 발생한다. 단점. 다른 장치는 항상 캐시를 통해 데이터를 접근해야 한다. 따라서 회로가 복잡해진다.

31/36 31/36

쓰기 정책 – 계속 다중 프로세서 시스템에서 각 프로세서가 각자의 캐시를 가지고 있는 경우 Write through + 버스 감시: 모든 캐시 제어기는 주소 라인과 제어 라인을 감시하여 다른 캐시 제어기가 쓰기 연산을 수행하는지 감시 한다. 하드웨어 투명성: 별도의 하드웨어를 사용하여 하나의 캐시에 대한 갱신이 주기억장치 뿐만 아니라 다른 모든 캐시에 반영되도록 하는 방식이다. 캐시 불가능 기억장치: 주기억장치의 일부분만 모든 프로세서가 공유하도록 하고, 이 부분은 캐시할 수 없도록 하는 방식이다.

32/36 32/36


라인의 크기 라인의 크기를 늘리면 참조의 지역성 원리 때문에 캐시 적중률은 증가 한다. 하지만, 크기가 어느 정도 이상이 되면 적중률은 오히려 감소한다. 이것은 새롭게 인출된 정보를 이용할 확률이 교체된 정보를 이용할 확률보다 적어지기 때문이다. 블록의 크기가 커질수록 캐시에 적재될 수 있는 블록의 수는 적어진다. 따라서 교체되는 빈도가 빨라진다. 블록의 크기가 커질수록 요청한 워드와 관련이 없는 워드가 포함될 확률이 높아진다. 블록의 크기와 적중률 간에 관계는 복잡하며, 특정 프로그램의 참조 지역성 특성에 따라 다르다. 따라서 최적의 값이 아직 발견되지 않고 있다.

33/36 33/36

다중 레벨 캐시 기술의 발달에 따라 최근에는 CPU 칩 내에 캐시를 내장한다. 이런 캐시를 온 칩 캐시(on-chip cache)라 한다. 캐시 온 칩 캐시의 사용은 외부 버스 트래픽을 줄여주며, 칩 내에 있으므로 성능 향상에도 도움이 된다. 온 칩 캐시를 사용하여도 오프 칩 캐시(off-chip cache)를 계속 사용하는 것이 성능 향상에 도움이 된다. 이 때 온 칩 캐시를 레벨 1 캐시(L1 cache)라 하고, 오프 칩 캐시를 보통 레벨 2 캐시(L2 cache)라 한다. 최근에는 L2 cache도 CPU 내에 내장하며, L3 cache까지 제공하고 있다. 오프 칩 캐시를 사용하는 이유: L1 cache만 사용하였을 때 데이터가 L1에 없으면 직접 시스템 버스를 통해 주기억장치로부터 데이터를 인출해야 한다. 보통 주기억장치는 DRAM(Dynamic RAM)을 사용하지만 오프 칩 캐시는 보다 빠른 SRAM(Static RAM)을 사용한다. 또한 오프 칩 캐시와의 통신은 시스템 버스를 사용하지 않고 별도의 빠른 전용 버스를 사용한다. 34/36 34/36


통합 또는 분리 캐시 처음 온 칩 캐시를 도입하였을 때에는 단일 캐시에 데이터와 명령어를 모두 저장하였다. 이렇게 하나의 칩에 데이터와 명령을 모두 저장하는 것을 통합 캐시(unified cache)라 한다. 캐시 최근에는 데이터용 캐시와 명령어용 캐시를 분리하여 사용한다. 통합 캐시 사용의 장점 장점 1. 적중률이 분리된 캐시보다 높다. 장점 2. 구현이 용이하다. 분기 예측과 같은 명령어 실행과 관련된 고급 기능을 구현하기에는 분리된 캐시(split caches)가 더 유리하다. 캐시 핵심 생각. 분리된 캐시를 사용하면 명령어 인출/해석 과정과 명령어 실행 과정간에 캐쉬 경쟁을 제거할 수 있다.

35/36 35/36

펜티엄 4의 캐시 조직 L3 Cache (1 MB)

L2 Cache (512 KB)

instruction fetch/decode unit

L1 Instruction Cache (12K µop)

out-of-order execution logic

L1 Data Cache (16 KB)

인출/해석 장치: 프로그램 명령어를 순서에 따라 L2 캐시로부터 인출한 다음에 그것을 일련의 micro 연산으로 해석하여 L1 캐시에 저장한다. out-of-order execution logic: micro 연산의 실행 순서를 스케줄한다. micro 연산은 파이프라인 기법을 적용하기 적합한 형태로 펜티엄 기계어를 보다 더 단순한 연산단위로 세분화한 것이다. 기계어를 micro 연산으로 해석하는 것이 복잡하기 때문에 L1과 L2 캐시 사이에 인출/해석 장치를 두는 것이 효과적이다. L2/L3 캐시는 모두 라인 크기가 128 바이트인 8-way 집합 연관 방식을 사용한다.

36/36 36/36


©copyright 2006

컴퓨터구조(INA210) 강의노트 05

내부 기억장치

한국기술교육대학교 정보미디어공학부 김상진

교육목표 반도체 형태의 기억장치는 크게 DRAM과 SRAM으로 나뉘어진다. SRAM은 DRAM보다 가격이 비싸고, 밀도가 낮다. 밀도는 기억장치를 구성하는 소자의 크기를 말하며, DRAM은 SRAM보다 작은 소자를 사용하므로 같은 크기이면 DRAM이 SRAM보다 용량이 크다. SRAM은 캐시, DRAM의 주기억장치를 구현하기 위해 사용된다. 기억장치는 보통 오류 정정 기술을 사용한다. DRAM의 성능을 향상시키기 위해 새로운 고급 DRAM 조직이 개발되고 있다. 예) 동기식 DRAM(SDRAM)

2/24


반도체 기억장치의 조직 반도체 기억장치의 기본 요소는 기억장치 셀(memory cell)이다. 기억장치 셀의 특징 두 개의 안정된 상태를 가진다. 상태를 설정(최소 한번)할 수 있다. 현재 상태를 감지할 수 있다. 각 셀은 세 개의 단자를 가지고 있다. 선택 단자: 기억장치 셀을 선택하기 위해 사용 제어 단자: 연산의 종류(읽기, 쓰기)를 나타내기 위해 사용 입출력 단자: 상태를 바꾸기 위한 신호를 받거나 현재 상태를 외부로 전달하기 위해 사용

3/24

반도체 기억장치의 종류 유형

분류

RAM

읽기/쓰기

ROM PROM

Flash

방법

수준

전자적

바이트 수준

읽기 전용

EPROM EEPROM

삭제가능성

주로 읽기

불가능 자외선

칩 수준

전자적

바이트 수준

전자적

블록 수준

쓰기 메커니즘

휘발성

전자적

휘발성

masks

전자적

비휘발성

RAM(Read Access Memory) ROM(Read Access Memory) PROM(Programmable ROM) EPROM(Erasable PROM) EEPROM(Electrically Erasable PROM)

4/24


DRAM 동적(dynamic) RAM은 동적 RAM 커패시터(capacitor)를 이용하여 기억장치 셀을 구현한다. 커패시터는 근본적으로 방전하는 성질을 가지고 있으므로 주기적으로 재충전해주어야 한다. 재충전이 필요하기 때문에 DRAM이라 한다. 커패시터는 아날로그 장치이다. 전형적인 DRAM의 메모리 셀 구성 트랜지스터는 스위치 역할을 한다. 주소 선에 전압을 적용하면 이 스위치는 닫힌다. 읽기 연산의 경우에는 셀이 충전 정도를 감지하여 그 정도에 따라 값(0 또는 1)을 결정한다. 이런 감지는 셀을 방전시키므로 읽기 연산이 끝나기 전에 다시 충전해주어야 한다.

5/24

DRAM 예5.1) 주어진 DRAM이 1 ms 동안 100번 재충전을 해야 한다고 가정하자. 재충전하는데 100 ns가 소요되며, 전체 기억장치 주기는 200 ns이다. 전체 기억장치 동작 시간 중 재충전에 소요되는 시간 비율은? 1 ms 동안 재충전에 소요되는 시간: 100±100ns = 10,000 ns = 0.01 ms 전체 시간 중 1%는 재충전에 사용됨

6/24


SRAM 정적(static) RAM은 정적 RAM 디지털 장치이며, 전통적인 플립-플롭 논리 게이트 (flip-flop logic gate)를 이용하여 기억장치 셀을 구현한다. 정적 RAM은 전원이 계속 공급되면 DRAM과 달리 재충전과 같은 것을 해주지 않아도 값을 유지한다.

7/24

DRAM vs. SRAM 둘 다 휘발성 기억장치이다. 셀의 크기: 정적 RAM > 동적 RAM 밀도: 정적 RAM < 동적 RAM 동적 RAM은 충전 회로가 추가로 필요하다. 가격: 정적 RAM > 동적 RAM 성능: 정적 RAM > 동적 RAM 동적 RAM은 주기억장치를 구현하기 위해 정적 RAM은 캐시를 구현하기 위해 주로 사용된다.

8/24


ROM의 종류 ROM(Read-Only Memory): 비휘발성 읽기 전용 반도체 기억장치 ROM 장점. 데이터 또는 프로그램을 주기억장치에 영구적으로 유지할 수 있다. 보통 ROM은 제작 과정에서 데이터를 기록한다. 이것의 문제점은 다음과 같다. 한 개를 제조하든 수천 개를 제조하든 데이터 기록 과정에 비교적 높은 고정된 비용이 소요된다. 오류를 범할 여유가 없다. PROM(Programmable ROM)은 ROM과 같지만 제조 과정에서 데이터를 기록하지 않고 나중에 전자적으로 기록한다. 하지만 오직 한 번만 기록할 수 있다. 비용이 ROM보다는 저렴하다. 읽기가 쓰기보다 월등히 많을 경우에는 주로 읽기 기억장치(readmostly memory)를 사용할 수 있다.

9/24

주로 읽기 기억장치 주로 읽기 기억장치의 종류 EPROM(Erasable PROM) EEPROM(Electrically EPROM), 플래시 메모리 EPROM은 쓰기 연산을 수행하기 전에 자외선을 이용하여 기존 데이터를 전부 지워야 하며, 이 과정이 느리다. PROM보다는 가격이 비싸다. EEPROM은 EPROM과 달리 쓰기 전에 기존 데이터를 지울 필요가 없다. 또한 EPROM과 달리 바이트 단위의 쓰기가 가능하다. 쓰기 연산은 읽기 연산보다 많은 비용이 소요된다. EEPROM이 EPROM보다 가격이 비싸다. 플래시 메모리는 가격과 기능면에서 모두 EPROM과 EEPROM의 중간 정도의 기억장치이다. 플래시 메모리도 EPROM과 마찬가지로 쓰기 전에 기존 데이터를 지워야 하지만 EPROM보다는 휠씬 빠르게 데이터를 지울 수 있다. 뿐만 아니라 블럭 단위로 지우고 쓸 수 있다.

10/24 10/24


칩 논리 다른 집적 회로 제품과 마찬가지로 반도체 기억장치도 칩 형태로 제공된다. 한 번에 읽거나 쓸 비트의 수를 결정하는 것이 반도체 기억장치 설계에 있어 중요한 설계 쟁점 중 하나이다. 예5.2) 16Mbit DRAM 칩의 조직 1M ± 16 비트로 구성 워드가 16인 경우: 하나의 칩을 하나의 모듈로 사용 가능 4M ± 4 비트로 구성 워드가 16인 경우: 4개의 칩을 하나의 모듈로 사용 16M ± 1 비트로 구성 워드가 16인 경우: 16개의 칩을 하나의 모듈로 사용

11/24 11/24

칩 논리 – 계속 예5.3) 한 번에 4비트를 읽고 쓸 수 있는 16 Mbit DRAM의 전형적인 조직 RAS CAS WE

refresh counter

OE

RAS(Row Address Select), CAS(Cable Address Select): 행과 열을 선택 WE(Write Enable), OE(Output Enable): 읽기와 쓰기 연산을 구분 A0, …, A11: 주소 정보 D0, …, D3: 데이터 입출력

M U X A0

D0 A10 D3

12/24 12/24


칩 논리 – 계속 기억장치 배열의 구성: 4비트 ± 2048 ± 2048 이 배열은 수평과 수직 선으로 연결되어 있다. 수평 선은 각 셀의 선택 단자에 연결되어 있고, 수직 선은 각 셀의 Data-In/Sense 단자에 연결 되어 있다. 주소 선은 선택할 워드의 주소를 공급한다. 전체 log2W 선이 필요하다. 여기서 W는 기억장치의 전체 워드 수이다. 이 예에서는 행을 선택하기 위한 11개의 주소 선과 그 행의 열을 선택하기 위한 11개의 주소 선을 사용한다. 칩의 핀 수를 줄이기 위해 11개의 주소 선을 사용하고 RAS와 CAS 제어 선을 이용하여 행과 열을 차례로 입력한다. 모든 DRAM은 충전을 위한 메커니즘이 필요하다. 이를 위해 재충전 계수기(refresh counter)와 재충전 회로를 이용하며, 재충전 동안에는 기억장치를 사용할 수 없도록 한다. 한 번에 4비트 단위로 읽기와 쓰기를 하므로 16 비트 워드를 사용하기 위해서 네 개의 DRAM을 병행으로 사용해야 한다. 13/24 13/24

모듈 조직 RAM 칩이 1비트 워드를 사용하면 컴퓨터의 워드 단위를 나타내기 위해서는 여러 개의 칩을 사용하여야 한다. 예5.4) 1비트 워드를 사용하는 RAM 칩을 이용하여 256 Kbyte 기억장치 모듈을 구성하는 방법 이런 모듈을 여러 개 사용하여 보다 큰 메모리를 구성할 수 있다.

단일칩: 256Kbit 모듈: 256Kbit±8=256Kbyte 14/24 14/24


모듈 조직 – 계속 예5.5) 1비트 워드를 사용하는 RAM 칩을 이용하여 256 Kbyte 기억장치 모듈 4개를 이용하여 1 Mbyte 기억장치를 구성하는 방법

15/24 15/24

오류 정정 반도체 기억장치에도 오류가 발생할 수 있다. 오류의 종류 하드 결함(hard failure): 실제 기억장치 셀에 하드웨어적 문제가 결함 발생하여 더 이상 신뢰할 수 없는 경우 소프트 오류(soft error): 하드웨어적인 영구 오류는 아니지만 전원 오류 문제 등으로 인해 내용이 바뀔 수 있다. 기억장치의 오류는 프로그램 실행에 심각한 영향을 주므로 이런 오류를 발견하고 수정할 수 있는 메커니즘을 기억장치 모듈에 포함되어야 한다.

16/24 16/24


오류 정정 메커니즘의 원리 오류 정정 메커니즘의 원리 M 비트 워드 사용 K: 워드 당 코드의 길이

데이터를 메모리에 기록할 때에는 오류 정정 코드를 함께 계산하여 같이 저장한다. 데이터 읽기 요청이 들어오면 데이터를 전달해주기 전에 현재 저장되어 있는 데이터를 이용하여 오류 정정 코드를 계산하고, 계산된 코드 값과 저장된 코드 값이 같은지 비교한다. 만약 다르면 오류를 정정하다. 이 때 오류가 많아 정정할 수 없으면 그 사실을 통보한다.

17/24 17/24

해밍 코드 해밍 오류 정정 코드의 원리

원이 교차하는 구획에 있는 값이 데이터 값이고, 나머지는 패리티 비트(parity bit)이다. 비트 각 패리티 비트의 값은 그것이 속한 원 내의 1의 개수가 짝수가 되도록 선택한다. (홀수가 되도록 할 수도 있다.) 18/24 18/24


해밍 코드 – 계속 8비트 워드에서 하나의 오류를 정정할 수 있는 해밍 코드를 만들고 싶다. 필요한 코드의 길이는? 보통 저장되어 있는 코드 값과 새롭게 계산한 값을 XOR하여 오류 여부를 검사한다. 이 때 두 값을 XOR한 결과 값을 신드롬 워드 (syndrome word)라 한다. 신드롬 워드의 값이 0이면 오류가 없는 것이다. 신드롬 워드가 0이면 오류가 없는 것이므로 이 워드가 가질 수 있는 나머지 값의 경우의 수 2K-1을 이용하여 오류와 그것의 위치를 나타내야 한다. 오류는 M 데이터 비트와 K 검사 비트 중 아무 위치에서 발생할 수 있으므로 2K-1 ≥ M+K가 M+K 성립해야 한다. 예5.6) 8비트 데이터 워드에서 하나의 오류를 정정하고자 하면 다음에 의해 최소 4비트가 필요하다는 것을 알 수 있다. K = 3: 23-1 < 8+3 K = 4: 24-1 > 8+4 19/24 19/24

해밍 코드 – 계속 다음 역할을 할 수 있는 4비트 신드롬을 생성하고 싶다. 신드롬의 값이 0이면 오류가 없다는 것을 의미한다. 신드롬의 한 비트만 1이면 이것은 코드에 오류가 발생하였다는 것을 의미한다. 신드롬의 두 비트 이상이 1이면 신드롬의 값이 오류가 발생한 데이터 비트의 위치를 나타내도록 함. 이를 위해 다음과 같은 배치도를 생각한다. 비트위치

12

11

10

9

8

7

6

5

4

3

2

1

위치번호

1100

1011

1010

1001

1000

0111

0110

0101

0100

0011

0010

0001

데이터

D8

D7

D6

D5

D4

D3

D2

C2

C1

코드

C8

D1 C4

이 신드롬은 다음과 같이 생성한다. C1 = D1 ⊕ D2 ⊕ D4 ⊕ D5 ⊕ D7 C2 = D1 ⊕ D3 ⊕ D4 ⊕ D6 ⊕ D7 C4 = D2 ⊕ D3 ⊕ D4 ⊕ D8 C8 = D5 ⊕ D6 ⊕ D7 ⊕ D8 20/24 20/24


해밍 코드 – 계속 이렇게 코드를 생성하는 이유 D1에 오류가 발생하면 신드롬의 값이 0011이 되어야 한다. 따라서 C1과 C2 값이 바뀌어야 한다. 그러므로 이들 계산에 D1이 포함되어야 한다. 예5.7) 데이터 워드의 값이 00111001이다. 이 워드의 세 번째 비트에 오류가 발생하였다고 하자. 오류 전 코드 값

C1 = 1 ⊕ 0 ⊕ 1 ⊕ 1 ⊕ 0 = 1 C2 = 1 ⊕ 0 ⊕ 1 ⊕ 1 ⊕ 0 = 1 C4 = 0 ⊕ 0 ⊕ 1 ⊕ 0 = 1 C8 = 1 ⊕ 1 ⊕ 0 ⊕ 0 = 0

오류 후 코드 값

C1 = 1 ⊕ 0 ⊕ 1 ⊕ 1 ⊕ 0 = 1 C2 = 1 ⊕ 1 ⊕ 1 ⊕ 1 ⊕ 0 = 0 C4 = 0 ⊕ 1 ⊕ 1 ⊕ 0 = 0 C8 = 1 ⊕ 1 ⊕ 0 ⊕ 0 = 0

두 개의 검사 코드를 비교하면 결과는 다음과 같다. 0111 ⊕ 0001 = 0110 따라서 세 번째 비트에 오류가 있음을 알 수 있다. 이와 같은 오류 정정 코드를 단일 오류 정정(SEC, Single-Error정정 Correcting) 코드라 한다.

21/24 21/24

해밍 코드 – 계속 현재 대부분의 반도체 메모리는 단일 오류 정정 및 이중 오류 검출(DED, Double-Error-Dectecting) 코드(SEC-DED code)를 내장하고 있다. 이중 오류 검출을 위해서는 추가로 패리티 비트를 하나 더 사용하여 1인 전체 비트 수가 짝수가 되도록 설정해야 한다. 해밍 코드를 사용하면 신뢰성은 향상되지만 회로가 복잡해지며 비용이 증가한다. a b c 0 1

1

0 0

0 1

1

1

1 1

0

1

1 1

0 0

f

1

0

0

1

e

1

0 0

0

d

1

0

1

0

0 1

1

0 0

1

1

1

0 1

1

0

1 1

0

22/24 22/24


SDRAM 일반 DRAM은 비동기식으로 쓰기 또는 읽기 요청을 하면 CPU는 DRAM이 이것을 처리하는 동안 기다려야 한다. 그러나 SDRAM은 CPU 클럭과 동기화되어 동작되므로 CPU는 서비스를 요청한 후에 DRAM이 그것을 처리할 동안 다른 작업을 할 수 있다. SRAM은 첫 비트 출력 이후 추가적인 주소 준비 시간과 같은 부수적인 작업 없이 일련의 데이터 비트를 클럭에 맞추어 신속하게 출력해 줄 수 있는 버스트 모드(burst mode)를 제공한다. 현재는 삼성에서 개발한 기존 SDRAM을 확장한 DDR(Double Data Rate)-SDRAM이 널리 사용하고 있다. DDR-SDRAM은 SDRAM보다 전력을 적게 소비하며 클럭 주기의 각 edge마다 데이터를 전송할 수 있어 기존 SDRAM 보다 두 배 빠르게 데이터를 전송할 수 있다.

23/24 23/24

Rambus DRAM, 캐쉬 DRAM Rambus DRAM RDRAM은 Rambus가 개발한 DRAM으로 최대 800MHz까지 작동 할 수 있다. 현재 주기억장치에 뿐만 아니라 비디오 카드에서도 널리 사용하고 있다. 참고. 비디오 카드는 RDRAM 이전에는 VRAM(Video RAM)을 사용 하였다. VRAM은 두 장치가 동시에 사용할 수 있다. 캐시 DRAM 일반 DRAM 칩 내에 작은 SRAM으로 구현한 캐시를 내장한 DRAM 이다. Mitsubishi가 개발한 것으로서 칩 내에 내장한 캐시는 두 가지 용도로 사용할 수 있다. 하나는 일반 캐시로 사용하는 것이고, 다른 하나는 블럭 단위 전송을 위한 버퍼로 사용하는 것이다.

24/24 24/24


©copyright 2006

컴퓨터구조(INA210) 강의노트 06

외부 기억장치

한국기술교육대학교 정보미디어공학부 김상진

교육목표 자기 디스크는 현재 가장 널리 사용되는 보조기억장치이다. 성능과 가용성을 높이기 위해 RAID 디스크 기술을 사용한다. RAID는 여러 개의 디스크를 병행으로 사용하는 기술을 말한다. CD, DVD와 같은 광 디스크도 현재 중요한 보조기억장치로 널리 사용되고 있다.

2/30


자기 디스크 디스크는 substrate이라고 하는 자성 물질이 아닌 원형 평판(circular platter) 위에 자성 물질로 코팅한 것이다. 원형 평판은 초창기에는 알루미늄이었나 최근에는 유리판(glass substrate)을 사용하고 있다. 데이터는 헤드(head)라고 불리는 전도성 코일을 이용하여 기록되고 검색된다. 읽기 또는 쓰기 동작 중에는 헤드가 정지되어 있고 평판은 회전한다. 쓰기 동작은 코일에 전기가 흐를 때 발생하는 자장을 이용하며, 헤드에 보내지는 펄스의 종류에 따라 다른 형태의 자성 패턴이 표면에 기록된다. 읽기 동작은 자장 내에서 코일이 이동할 때 코일에 전류가 발생하는 성질을 이용한다.

3/30

자기 디스크 – 데이터 조직과 형식 디스크는 트랙(track)이라는 동심원으로 이루어지며, 각 트랙의 폭은 트랙 같다. 또한 이 트랙의 폭은 헤드의 폭과 같다. 트랙과 트랙 사이에는 틈이 있으며, 이 틈은 자장의 간섭 또는 헤드가 잘못 정렬되어 발생하는 오류를 방지 또는 최소화 해준다. 트랙은 다시 섹터(sector)로 나누어지며, 섹터와 섹터 사이에도 틈이 섹터 있다. 섹터의 크기는 가변적이거나 고정되어 있다. 대부분의 시스템은 512 바이트 크기의 고정된 섹터를 사용한다.

4/30


자기 디스크 – 데이터 조직과 형식 안쪽 트랙에 있는 비트는 바깥쪽 트랙에 있는 비트보다 느리게 회전한다. 따라서 항상 같은 속도로 비트를 읽기 위해서는 이런 속도의 다양성을 보상하기 위한 방법이 필요하다. CAV(Constant Angular Velocity) 방법: 바깥쪽 트랙일 수록 비트 사이에 간격을 넓혀 모든 트랙에 동일한 수의 비트를 기록하는 방법이다. 단점. 바깥쪽 트랙에는 원래 기록할 수 있는 비트보다 적은 수의 비트만을 저장하므로 공간이 낭비된다. 다중 영역 기록(multiple zone recording) 방법: 기록 CAV 방법의 단점을 극복하기 위해 도입된 방법으로 디스크를 여러 영역으로 나누고, 각 영역에 있는 트랙에는 같은 수의 비트가 기록된다. 이 때 바깥쪽 영역일 수록 비트의 수는 증가한다. 장점. 전체 저장 용량이 증가한다. 단점. 보다 복잡한 회로가 필요하다.

5/30

자기 디스크 – 물리적 특성 특성

특성

헤드 움직임

고정(트랙 당 하나) 유동(기판 당 하나)

평판

단일 평판 다중 평판

이동성

고정 이동

헤드 메커나즘

접촉(플로피) 고정 틈 공기 틈

단일면 이중면

움직임 방향

기판7 평판 헤드 기판6

디스크 드라이브의 구성요소

6/30


자기 디스크 – 물리적 특성 다중 평판을 사용할 경우에 같은 위치에 있는 트랙의 모음을 실린더 (cylinder)라 한다. 헤드의 폭이 작으면 그만큼 더 평판에 가깝게 위치해야 한다. 헤드의 폭이 작으면 그만큼 트랙의 폭이 작으므로 하나의 평판에 보다 많은 트랙을 수용할 수 있다. 그러나 헤드가 평판에 가까워질 수록 오류가 발생할 확률은 높다. 이런 문제를 극복하기 위해 현재는 공기틈(aero-dynamic gap)을 사용 한다.

7/30

디스크 성능 파라미터 – 계속 디스크 입출력 동작의 세부사항은 컴퓨터시스템, 운영체제, 입출력 채널, 디스크 제어기 하드웨어에 의해 결정된다. 디스크 입출력의 일반적인 타이밍 다이어그램은 다음과 같다.

읽거나 쓰기 위해서는 먼저 헤드가 해당 트랙에 위치하여야 한다. 이동 헤드 방식에서는 실제 헤드가 해당 트랙으로 이동해야 하며, 고정 헤드 방식에서는 전자적으로 특정 헤드를 선택해야 한다. 이동 헤드 방식에서 헤드를 트랙으로 이동하는 시간을 탐색 시간(seek 시간 time)이라 한다. 디스크를 회전하여 원하는 섹터가 헤드 아래 놓여야 한다. 이 시간을 회전 지연(rotational delay, rotation latency)이라 한다. 지연 접근 시간(access time): 탐색 시간과 회전 지연을 합친 시간 시간

8/30


디스크 성능 파라미터 – 계속 헤드가 원하는 트랙의 특정 섹터에 위치하면 이 순간부터 데이터 읽기나 쓰기가 시작된다. 이 때 데이터를 전송하는데 걸리는 시간을 전송 시간(transfer time)이라 한다. 탐색 시간과 전송 시간 외에 디스크 입출력과 관련된 몇 개의 대기 지연 시간이 존재한다. 입출력 요청을 하면 보통 그 장치가 사용될 수 있을 때까지 기다려야 한다. 만약 여러 장치가 같은 입출력 채널을 공유하면 채널을 사용할 수 있을 때까지 추가로 기다려야 한다. RPS(Rotation Positional Sensing) 방식에서는 탐색 명령이 내려진 다음에 계속 채널을 점유하지 않고 다른 입출력이 사용할 수 있도록 해제한다. 탐색과 회전 지연이 완료되면 채널을 다시 요구하는데 이 때 채널을 다른 장치가 사용하고 있으면 다시 한 바퀴를 회전한 다음에 채널을 다시 요구한다.

9/30

디스크 성능 파라미터 – 계속 탐색 시간 이 시간은 측정하기가 쉽지 않다. 탐색 시간은 초기 시작 시간과 접근 암이 가속된 후에 트랙을 통과 하는데 걸리는 시간으로 구성된다. 최근에 많이 사용되는 디스크 평판의 직경은 3.5 인치(일반 하드디스크)와 2.5/1.8 인치(노트북)이다. 직경이 작을 수록 탐색 시간은 적다. 보통 평균 탐색 시간은 10 ms보다 적다. 회전 지연 최근에 가장 많이 사용되는 하드 디스크의 회전 속도는 7200 rpm(rotation per minute)이다. 이 경우 한 번 회전하는데 대략 8 ms가 소요된다. 따라서 평균 회전 지연 시간은 4 ms가 된다. 참고. 7200 rpm이므로 120 r/sec이다. 따라서 1/120=0.0083 sec ≈ 8 ms이다.

10/30 10/30


디스크 성능 파라미터 – 계속 전송 시간: 전송 시간은 회전 속도에 의존한다. T = b / rN T: 전송시간 b: 전송할 바이트의 수 N: 트랙에 있는 바이트의 수 r: 회전 속도(1초 당 회전 수) b 바이트를 읽거나 쓰기 위해 필요한 전체 평균 시간은 다음과 같다. T = Ts + 1/2r + b/rN Ts: 평균 탐색 시간

11/30 11/30

디스크 성능 파라미터 – 계속 예6.1) 디스크에서 2500 섹터를 읽는데 소요되는 시간을 계산하고 싶다. 이 디스크의 특성은 다음과 같다. 7200 rpm, 평균 탐색 시간: 4ms, 섹터의 크기: 512 바이트, 트랙 당 섹터의 수: 500 가정. 최적으로 저장되어있다. 즉, 인접한 5개의 트랙에 저장되어 있다. 첫 트랙을 읽는데 걸리는 시간 평균 탐색 시간: 4 ms 평균 회전 지연: 4 ms 전송 시간: 8 ms = 16 ms 나머지 트랙을 읽는데 탐색 시간은 무시할 수 있다고 하면 각 트랙을 읽는데 걸리는 시간 4+8 = 12 ms이다. 따라서 전체 파일을 읽는데 걸리는 시간은 다음과 같다. 16 + 4 ±12 = 64 ms

12/30 12/30


디스크 성능 파라미터 – 계속 가정. 2500 섹터가 임의로 분산되어 있다. 한 섹터를 읽는데 걸리는 시간 평균 탐색 시간: 4 ms 평균 회전 지연: 4 ms 전송 시간: 0.016 = 8.016\text{ ms} 참고. 전송시간 = 60 / 7200 ± 512 / (512 ± 500) 따라서 전체 파일을 읽는데 걸리는 시간은 다음과 같다. 2500 ± 8.016 = 20040 ms = 20.04 sec

13/30 13/30

최근 자기 디스크 성능 규격

용량

회전속도

버퍼

평균 탐색시간

인터페이스

WD 3000JS

3.5

300 GB

7200rpm

8 MB

8.9ms

S-ATA300

ST3200827AS

3.5

200 GB

7200rpm

8 MB

11ms

S-ATA300

MK6006GAH

1.8

60 GB

4200rpm

2 MB

15ms

ATA-100

ST98823AS

2.5

80 GB

5400rpm

8 MB

12.5ms

S-ATA150

ST3146854LW

3.5

146 GB

15000rpm

8 MB

3.5ms

Ultra320 SCSI

HD300LD/DOM

3.5

300 GB

7200rpm

8 MB

8.9ms

ATA-133

모델

14/30 14/30


RAID 프로세서와 주기억장치의 발전 속도에 비해 보조기억장치의 발전 속도는 상대적으로 매우 느리다. 기술적 발전이 없을 때 성능을 향상시키기 위해 일반적으로 사용하는 방법은 여러 개를 병렬로 연결하여 사용하는 것이다. 예) 다중 프로세서시스템 디스크도 마찬가지이다. 두 개의 디스크가 있고, 두 디스크 입출력에서 필요로 하는 데이터가 서로 다른 디스크에 있다면 이 두 입출력을 병렬로 수행할 수 있다. 필요한 데이터 블록이 여러 디스크에 분산되어 있으면 단일 입출력도 병렬로 수행할 수 있다. 다중 디스크는 여러 가지 방법으로 구성하여 사용할 수 있다. 컴퓨터들이 다양한 방법을 사용한다면 이들 모두에서 수행될 수 있는 응용을 만드는 것이 어렵다. 따라서 다중 디스크 설계하는 표준이 도입 되었다. 이 표준이 RAID(Redundant Array of Independent(inexpensive) Disk)이다.

15/30 15/30

RAID – 계속 RAID는 7개의 레벨(0에서 6)로 구성되어 있다. 계층적 레벨을 의미하는 것은 아니고, 구성하는 7가지 방법이 있다는 것을 의미한다. 각 레벨의 공통점은 다음과 같다. 특징 1. RAID는 물리적 디스크들의 집합이지만 운영체제는 이것을 하나의 디스크로 인식한다. 특징 2. 데이터는 물리적 디스크에 분산된다. 특징 3. 여분 디스크는 패리터 정보를 저장하는데 사용된다. 이를 이용하여 디스크에 오류가 발생하였을 때 복구한다. 특징 2와 3은 RAID 레벨에 따라 다른 특성을 가지며, 레벨 0은 세 번째 특성을 제공하지 않는다.

16/30 16/30


RAID 0 RAID 레벨 0은 성능 향상을 위한 여분 정보가 들어 있지 않으므로 실제 RAID 계열에 속한다고 하기 어렵다. 하지만 이 방식은 신뢰성을 희생하는 대신 적은 비용으로 성능 향상을 얻을 수 있다. 사용자와 시스템 데이터를 스트립(strip) 단위로 나누어 분산하여 저장 한다. 이것의 효과는 스트립의 크기에 따라 다르다. 스트립의 크기가 크면 필요한 데이터가 하나의 디스크에만 있을 확 률이 높으므로 여러 다른 입출력을 병렬로 수행할 수 있다. 스트립의 크기가 작으면 필요한 데이터가 여러 디스크에 분산되어 있을 확률이 높으므로 단일 입출력을 병렬로 수행할 수 있다. 즉, 데이터 전송 속도를 높일 수 있다.

17/30 17/30

RAID 0 장점 단순하므로 구현하기가 용이하다. 패리티 계산에 대한 오버헤드가 없다. 단점 여분 정보가 없으므로 하나의 디스크가 실패하면 전체 배열에 있는 데이터가 손실된다.

18/30 18/30


RAID 1 RAID 레벨 1은 데이터를 분산하는 동시에 전체 데이터를 중복하여 여 분 정보를 만든다. 장점 읽기 요청은 두 디스크 중 하나에서 서비스를 받을 수 있다. 쓰기 요청은 두 디스크를 모두 갱신하여야 하지만 병행으로 갱신할 수 있다. 즉, 다른 RAID 레벨(2부터 6)은 갱신할 때 패리티를 계산해야 하지만 RAID 1은 그런 추가 비용이 소요되지 않는다. 복구가 단순하다. 단점. 단점 전체를 중복하므로 많은 저장 공간이 요구된다. 따라서 아주 중요한 데이터를 저장할 때에만 사용된다. RAID 레벨 1은 읽기가 많을 때에 가장 성능이 좋다.

19/30 19/30

RAID 2 RAID 레벨 2와 3은 병렬 접근 기술을 사용한다. 병렬 접근 기술에서는 각 입출력마다 모든 디스크가 참여한다. 어떤 특정 순간에 각 디스크의 헤드는 같은 위치에 위치한다. 같은 위치에 있는 비트에 대한 해밍 코드를 코드 계산하여 이 코드의 각 비트를 다중 패리티 디스크의 같은 위치에 기록한다. RAID 레벨 2와 3은 매우 작은 스트립을 사용한다. RAID 레벨 2는 레벨 1보다는 작은 공간을 요구하지만 다른 방식에 비해 상대적으로 많은 저장 공간이 필요하다. 특히 오늘날 디스크의 높은 신뢰성을 고려하면 너무 많은 패리티 정보를 유지하는 것으로 볼 수 있어 거의 사용되지 않는다.

20/30 20/30


RAID 3 레벨 3은 레벨 2와 유사하지만 다중 패리티 디스크를 사용하지 않고 디스크 배열의 크기와 상관없이 항상 단일 패리티 디스크를 사용한다. 여분 정보의 계산은 해밍 코드 대신에 단순 패리티를 이용한다. 5개의 디스크를 사용한다고 하자. 그리고 X4가 패리티 디스크이면 패리티는 다음과 같이 계산한다. X4(i) = X3(i) ⊕ X2(i) ⊕ X1(i) ⊕ X0(i) 읽기 연산 중에 디스크 1이 실패하면 다음과 같이 X1(i)를 계산할 수 있다. X1(i) = X3(i) ⊕ X2(i) ⊕ X0(i) ⊕ X4(i) 장점. 레벨 2와 레벨 3은 데이터를 병렬로 읽고 쓰므로 데이터 전송 속도는 매우 빠르다. 단점. 레벨 2와 레벨 3은 한 번에 하나의 입출력만 처리할 수 있다.

21/30 21/30

RAID 4 레벨 4에서 6은 독립 접근 기술을 기술 사용한다. 독립 접근 기술에서는 디스크 배열에 있는 각 디스크는 독립적으로 동작한다. 따라서 여러 입출력을 병렬로 처리해 줄 수 있다. 레벨 3과 유사하게 비트 단위 패리티 비트를 계산한다. 하지만 레벨 3과 다르게 데이터의 접근은 하나의 디스크로부터 이루어진다. 이 방식에서 쓰기는 다른 방식에 비해 복잡하다. 5개의 디스크를 사용한다고 하자. 그리고 X4가 패리티 디스크이면 패리티는 다음과 같이 계산한다. X4(i) = X3(i) ⊕ X2(i) ⊕ X1(i) ⊕ X0(i)

22/30 22/30


RAID 4 디스크 1에 대한 쓰기 연산을 수행하면 대응되는 패리터도 다시 계산해야 한다. X4'(i) = X3(i) ⊕ X2(i) ⊕ X1'(i) ⊕ X0(i) = X3(i) ⊕ X2(i) ⊕ X1'(i) ⊕ X0(i) ⊕ X1(i) ⊕ X1(i) = X3(i) ⊕ X2(i) ⊕ X1(i) ⊕ X0(i) ⊕ X1(i) ⊕ X1'(i) = X4(i) ⊕ X1(i) ⊕ X1'(i) 즉, 패리티를 새롭게 계산하기 위해서는 옛 스크립 데이터와 옛 패리티 데이터를 읽어야 한다. 따라서 총 두 번의 읽기와 두 번의 쓰기가 필요하다. 모든 쓰기는 패리티 디스크에 대한 접근이 필요하므로 병목현상 문제가 발생할 수 있다.

23/30 23/30

Raid 5 이 방식은 RAID 레벨 4의 문제점을 극복하기 위해 패리티 데이터를 분산한다. 따라서 두 개의 쓰기 연산도 병렬로 수행될 수 있다. 전체를 재구성하는 비용이 비싸다.

24/30 24/30


Raid 6 패리티 데이터를 분산하는 동시에 이중으로 패리티를 계산한다. 이중으로 계산된 패리티는 서로 다른 디스크에 저장된다. 이를 통해 두 개의 디스크 오류까지 극복할 수 있다. 사용자 데이터가 N개의 디스크를 필요로 하면 총 N+2개의 디스크가 필요하다. 쓰기 연산은 두 개의 패리티를 갱신해야 되므로 많은 시간이 소요된다.

25/30 25/30

S-ATA 기존 하드 디스크는 병렬 인터페이스를 통해 시스템 버스에 연결되어 있다. (Parallel Advanced Technology Attachment) 다른 말로 IDE(Integrated Drive Electronics), E-IDE로 표현된다. 현재 이 인터페이스를 통해서는 최대 133Mbytes/sec의 전송률을 제공하고 있다. 최근에 병렬 인터페이스 대신에 직렬 인터페이스를 사용한다. 병렬 인터페이스에서 전송률 증가시키는 것은 한계에 도달하고 있다. 기본 S-ATA는 150Mbytes/sec의 전송률을 지원하며, S-ATA 2는 300Mbytes/sec을 지원한다. 현재 목표는 600Mbytes/sec을 지원하는 것이다.

26/30 26/30


27/30 27/30

CD-ROM 데이터 CD는 음악 CD와 달리 오류 정정 기능이 있다는 것을 제외하고는 같은 기술을 사용한다. 대략 650 Mbyte 이상으로 저장할 수 있다. CD-ROM은 일반 디스크에서 사용하는 CAV 방식이나 다중 영역 기록 방식을 사용하지 않고, 나사선 모양의 저장 방식을 사용한다. 따라서 회전 속도가 안쪽에 있는 데이터를 읽을 때와 바깥쪽에 있는 데이터를 읽을 때가 다르다. 이런 방식을 CLV(Constant Linear Velocity)라 한다. CLV CLV 방법을 사용하기 때문에 임의 접근이 더 어렵다. 먼저 접근하고자 근처에 가서 회전 속도를 조절한 다음 정확한 위치로 이동해야 한다. 장점

단점

대량 복제 용이 휴대의 편리성

읽기만 가능하다. 접근 속도가 느리다

28/30 28/30


CD-ROM – 계속 CD-ROM 드라이브에서 몇 배속의 의미는? 1배속은 150 Kbyte/sec을 의미한다. 배속은 평균속도가 아니라 최대지원속도이다. 현재는 52 배속까지 출시되어 있다. CD-R: 한 번만 쓸 수 있다. CD나 CD-ROM과는 다른 매체이다. 백업용 으로 현재 널리 사용되고 있다. CD-RW: 여러 번 쓸 수 있다. 대략 500,000에서 1,000,000 번을 쓸 수 있다. 52x32x52x: 기록은 52배속, 재기록은 32배속, 재생은 52배속이라는 것을 말함

29/30 29/30

DVD DVD(Digital Versatile Disk) 두 면을 사용하는 DVD는 최대 17 Gbyte를 저장할 수 있다. 기존 비디오 테이프를 대체하기 위해 개발된 매체이다. DVD와 CD의 차이점 비트가 더 조밀하게 기록되어 있다. 4.7 GB 이중층을 사용한다. 8.5 GB 양면을 사용할 수 있다. 17 GB DVD-R, DVD-RW, DVD+R, DVD+RW: 규격이 다르다. DVD-RAM: 별도 소프트웨어 없이 쓰기가 가능하다. 최근 동향: LG GSA-H10A DVD-ROM

DVD+R/RW

DVD-R/RW

DVD-RAM

CD-R/RW

16x

더블: 8x 싱글: 16x 재기록: 8x

더블: 4x 싱글: 16x 재기록: 6x

5x

재생: 48x 기록: 48x 재기록: 32x

30/30 30/30


컴퓨터구조(INA210) 강의노트 07

©copyright 2006

입출력

한국기술교육대학교 정보미디어공학부 김상진

교육목표 컴퓨터 시스템의 I/O 구조는 외부 세계와의 인터페이스이다. 입출력 기법의 종류 프로그램 방식(programmed I/O): 프로그램이 입출력 제어 인터럽트 구동 방식(interrupt-driven I/O): 프로그램의 실행과 입출력을 병행하는 방식 직접 기억장치 접근 방식(DMA): 특수 I/O 프로세서 사용 인터럽트 사용하지 않음 인터럽트 사용 프로세서 통제에 의한 입출력과 주기억장치 간 데이터 교환 직접 입출력과 주기억장치 간 데이터 교환

프로그램 방식

인터럽트 구동 방식

DMA

2/31


입출력 모듈 입출력 모듈: 주변장치와 시스템 버스 간에 인터페이스 역할을 해주는 장치로서, 여러 개의 주변장치가 하나의 입출력 모듈에 연결될 수 있다. 주변장치를 시스템 버스에 바로 연결하지 않는 이유 주변장치의 다양성: 다양한 장치를 제어하기 위한 모든 논리를 프로세서 내에 모두 내장하는 것은 실용적이지 못하다. 주변장치의 데이터 전송률의 다양성 주변장치는 프로세서와는 다른 워드 크기나 데이터 형식을 사용할 수 있다. 입출력 모듈은 프로세서가 다양한 주변장치를 단순하고 통일된 방법으로 접근할 수 있도록 해준다. 입출력 모듈이 프로세서를 대신하여 입출력과 관련된 복잡한 일을 처리해주면 입출력 채널(I/O channel) 또는 입출력 프로세서(I/O 채널 프로세서 processor)라 한다. 반대로 모듈이 단순하여 프로세서가 입출력과 관련된 많은 일을 담당해야 하면 입출력 제어기(I/O controller) 또는 제어기 장치 제어기(device controller)라 한다. 제어기 3/31

외부 장치 외부 장치는 링크를 통해 입출력 모듈에 연결되어 있다. 외부 장치의 종류 사람이 읽을 수 있는 장치: 사용자와 통신을 위한 장치 예7.1) 모니터, 프린터 기계가 읽을 수 있는 장치: 장치와 통신을 위한 장치 예7.2) 디스크 통신: 원격 장치와 통신을 위한 장치 예7.3) 랜카드

4/31


입출력 장치의 기본 구조 제어신호: 입출력 장치가 수행할 기능을 결정 예7.4) 데이터 전송, 데이터 수신, 상태 보고 등 데이터: 입출력 장치와 입출력 모듈 간에 교환되는 비트로 구성 상태신호: 장치의 상태를 나타내는 정보 예7.5) READY/NOT-READY 제어논리: 장치의 동작을 제어하는 요소 signals status signals data bits 변환기(transducer): 수신한 데이터를 control from I/O module to I/O Module to and from I/O module 장치에 맞는 형태로 변환하거나 장치 형태의 데이터를 전기적 데이터로 변환하는 요소 buffer control logic 예7.6) 사운드카드: 디지털 신호를 아날로그 신호로 변환 transducer 버퍼: 입출력 장치와 모듈 간에 교환되는 데이터를 일시적으로 보관하는 요소 data(device specific) to and from environment

5/31

키보드 교환 단위: 문자 IRA(International Reference Alphabet) 표준 코드를 사용한다. 이 코드는 모든 문자를 7 비트로 표현한다. IRA에 대응되는 미국 표준은 ASCII이다. 문자는 인쇄가능 문자와 제어 문자로 구분된다. 사용자가 키보드의 키를 누르면 전기 신호가 발생되며, 키보드의 변환기는 이 신호를 IRA 코드로 변환하여 준다.

6/31


입출력 모듈의 기능 제어와 타이밍 프로세서와의 통신 명령 해석: 예7.7) 디스크: 섹터 읽기, 섹터 쓰기 등 데이터 교환 상태 보고 주소 인식: 한 모듈에 연결되어 있는 여러 장치를 구분 장치와의 통신 데이터 버퍼링: 버퍼링 주기억장치와 모듈 간에 데이터 전송 속도와 모듈과 장치 간에 데이터 전송 속도의 차이를 극복하기 위해 필요하다. 오류 검출 입출력 모듈은 주기억장치 속도와 기계적 전자적 오동작 입출력 장치 속도로 모두 동작해야 한다. 예7.8) 종이 걸림, 불량 섹터 데이터 전송 중 오류(패리티 비트와 같은 오류 정정 코드 사용)

7/31

입출력 모듈의 구성 데이터 레지스터: 데이터 버퍼 역할 상태 레지스터: 현재 상태를 제공하기 위해 사용한다. 이 레지스터는 또한 복잡한 제어 정보를 프로세서로부터 수신하기 위해 사용한다. 입출력 논리: 이 요소는 프로세서로부터 받은 명령에 따라 입출력 모듈을 제어한다. 이 요소는 또한 연결되어 있는 장치를 구분하기 위한 주소를 인식할 수 있어야 한다. 장치 인터페이스: 연결되어 있는 ��� 장치와 인터페이스를 하기 위한 Interface to Interface to 요소 external device

system bus

data registers data lines status/control registers

address lines control lines

I/O logic

external device interface logic

data

external device interface logic

data

status control

status control

8/31


입출력 방식 CPU to I/O CPU to I/O

I/O to CPU I/O to CPU not ready

ready

ready

I/O to CPU

I/O to CPU

DMA 방식 CPU to memory

?

CPU to memory

?

프로그램 방식

인터럽트 구동 방식 9/31

프로그램 입출력 인터럽트를 사용하지 않는 방법으로 입출력을 요청하면 그것이 처리될 때까지 기다려야 한다. 프로세서 시간이 낭비된다. 프로그램을 수행하는 도중에 입출력과 관련된 명령어를 만나면 프로세서는 해당 입출력 모듈에게 입출력을 요청한다. 프로그램 방식에서 입출력 모듈은 요청된 것을 처리한 다음에 결과를 데이터 레지스터와 상태 레지스터에 저장한다. 이것이 입출력 모듈이 프로세서를 위해 해주는 일의 전부이다. 따라서 프로세서는 입출력이 완료되었는지 주기적으로 입출력 모듈을 검사하여야 한다.

10/31 10/31


프로그램 입출력 – 입출력 명령 입출력 관련 명령어를 실행하기 위해 프로세서는 주소(입출력 모듈과 그 모듈에 연결된 장치를 식별하기 위해 사용)와 입출력 명령을 입출력 모듈에게 전달한다. 입출력 명령의 종류 제어: 주변장치를 활성화하고 할 일을 지시하기 위해 사용한다. 검사: 입출력 모듈과 장치와 관련된 여러 상태 정보를 검사하기 위해 사용한다. 읽기: 주변장치로부터 데이터를 받기 위해 사용한다. 쓰기: 주변장치에게 데이터를 전달하기 위해 사용한다.

11/31 11/31

프로그램 입출력 – 입출력 명령어 프로그램 방식의 입출력에서는 입출력 명령어(프로그램을 구성하는 명령어 중 하나)와 입출력 명령(프로세서가 입출력 모듈에게 보내는 명령) 간에 밀접한 관계가 형성된다. 프로세서는 입출력 명령어를 해석하여 필요한 입출력 명령을 제어 버스를 통해 입출력 모듈에 전달한다. 각 입출력 모듈은 주소 버스에 있는 주소 정보를 검사하여 자신에 해당하는 명령인지 파악한다. 프로세서, 주기억장치, 입출력 모듈이 모두 공통된 버스를 공유하면 다음 두 가지 방법으로 주소를 지정할 수 있다. 기억장치-사상 방식(memory-mapped I/O) 방식 고립형 방식(isolated I/O) 방식

12/31 12/31


프로그램 입출력 – 입출력 명령어 (계속) 기억장치-사상 방식 주기억장치와 입출력 장치는 모두 같은 단일 주소 공간을 사용한다 프로세서는 입출력 모듈의 상태와 데이터 레지스터를 주기억장치의 위치와 동일하게 취급하며, 같은 명령을 명령 이용하여 주기억장치와 입출력 모듈에 접근한다. 장점. 주기억장치 명령과 입출력 명령을 구분하기 위한 제어선이 필요없다. 다양한 주기억장치 명령을 입출력에 활용할 수 있다. 단점. 가능한 주기억장치 주소 범위를 일부 사용할 수 없다. 고립형 방식 주기억장치와 입출력 모듈이 다른 주소 공간을 사용한다. 보통 주소 버스는 공유하지만 별도의 제어 버스를 사용한다. 장점. 가능한 주기억장치 주소 범위를 모두 사용할 수 있으며, 보다 간편한 입출력 명령을 사용할 수 있다. 단점. 회로가 복잡해진다.

13/31 13/31

프로그램 입출력 – 입출력 명령어 (계속) 10비트 주소를 사용 0-511: 주기억장치 512-1023: 입출력

14/31 14/31


인터럽트 구동 방식 프로그램 방식의 문제점: 프로세서는 입출력 모듈이 데이터를 수신 또는 전송할 준비가 될 때까지 장시간 기다려야 한다. 해결책. 요청을 한 후에 프로세서는 계속 다른 작업을 처리한다. 입출력 모듈은 준비가 되면 인터럽트를 통해 프로세서에게 그 사실을 알린다. 예7.9) 입력 동작 입출력 모듈 관점 프로세서로부터 READ 명령을 받으면 주변장치에게 데이터를 요청한다. 입력 데이터가 입출력 모듈의 데이터 레지스터에 들어오면 인터럽트를 통해 프로세서에게 알린다. 프로세서로부터 요청이 들어오면 데이터 레지스터에 있는 데이터를 전달한다.

프로세서 관점 입출력 모듈에게 READ 명령을 보낸 후에 다른 작업을 처리한다. 명령어 주기가 끝날 때마다 인터럽트가 발생 여부를 검사한다. 인터럽트가 발생하면 현재 프로그램의 문맥을 저장하고, 입출력 모듈로부터 데이터를 받아 주기억장치에 저장한다. 그 다음 문맥을 복원한 다음에 계속 프로그램을 실행한다.

15/31 15/31

인터럽트 처리 입출력 장치가 입출력 연산을 완료하였을 때 일어나는 일련의 사건 단계 1. 입출력 모듈은 프로세서에게 인터럽트 신호를 보낸다. 단계 2. 프로세서는 현재 진행 중인 명령어의 실행을 완료한다. 단계 3. 프로세서는 인터럽트 발생 여부를 검사하여 그것을 인지하게 되면 입출력 모듈에게 인터럽트 확인 신호를 보낸다. 단계 4. 현재 실행 중인 프로그램을 나중에 다시 그 위치부터 실행할 수 있도록 필요한 정보를 보관한다. 최소한 현재 프로세서 상태 (PSW 레지스터)와 다음 실행할 명령어의 주소를 보관해야 한다. 보통 이 정보는 시스템 스택에 스택 저장된다. 단계 5. 프로세서는 발생한 인터럽트를 처리할 인트럽트 처리 프로그램의 시작 주소를 프로그램 카운터 레지스터에 적재한다.

16/31 16/31


인터럽트 처리 – 계속 인트럽트 처리 프로그램이 실행된 후에 일어나는 일련의 사건 단계 6. 단계 4에서 PSW와 PC 레지스터의 값은 시스템 스택에 보관하였지만 나중에 프로그램 실행을 속개하기 위해서는 다른 정보도 필요할 수 있다. 따라서 인터럽트 처리 루틴을 실행하기 전에 다른 모든 레지스터의 정보도 스택에 보관한다. 단계 7. 인터럽트를 실제 처리한다. 단계 8. 입출력 처리가 완료되면 보관한 레지스터 값을 다시 레지스터에 복원한다. 단계 9. PSW와 PC를 복원하고 인트럽트 처리하기 전에 실행하던 프로그램을 다시 실행한다.

17/31 17/31

인터럽트 설계 쟁점 문제 1. 인터럽트 신호를 받았을 때 프로세서는 어떤 입출력 모듈에 연결된 어떤 장치가 신호를 보냈는지 알 수 있어야 한다. 해결책 1. 다중 인터럽트 선: 각 입출력 모듈마다 전용선을 할당 가장 쉬운 해결책이나 실용적이지 못하다. 해결책 2. 소프트웨어 폴(software poll): 범용 인터럽트 처리 루틴을 사용하는 방식 이 루틴은 어느 장치가 인터럽트를 발생하였는지 각 입출력 모듈에 문의한다. 이를 통해 신호를 발생시킨 장치를 찾으면 그 특정 장치를 처리하기 위한 인터럽트 처리 루틴을 실행한다. 시간이 많이 소요된다.

18/31 18/31


인터럽트 설계 쟁점 – 계속 해결책 3. 하드웨어 폴(직렬 연결 방법, 벡터 방법): 공유된 인터럽트 요청 선과 직렬 연결된 인터럽트 확인 선을 사용하는 방식 공유된 요청 선을 통해 인터럽트 신호가 들어오면 프로세서는 인터럽트 확인 신호를 전달한다. 인터럽트를 발생한 모듈은 더 이상 확인 신호를 중계하지 않고, 데이터 버스에 특정 워드를 적재한다. 이 워드를 벡터라 하며, 프로세서는 이 벡터를 통해 인터럽트를 발생시킨 특정 장치를 식별할 수 있으며, 이를 이용하여 실행할 특정 처리 루틴을 결정 한다. 소프트웨어 폴 방식에 비해 시간이 적게 소요되며, 범용 인터럽트 처리 루틴이 필요 없다. VECTOR CPU

INTA I/O module

I/O module

I/O module

19/31 19/31

인터럽트 설계 쟁점 – 계속 해결책 4. 버스 중재(벡터 방법): 버스의 사용 권한 획득해야 중재 인터럽트 신호를 보낼 수 있는 방식 따라서 한 번에 하나의 모듈만 인터럽트를 보낼 수 있으며, 프로세서는 어느 모듈이 인터럽트를 보냈는지 알 수 있다. 문제 2. 다중 인터럽트의 처리 다중 인터럽트 선: 프로세서가 가장 우선순위가 높은 모듈을 선택한다. 소프트웨어 폴: 우선순위가 높은 모듈 순으로 문의한다. 하드웨어 폴: 직렬 연결된 순서가 우선순위를 결정한다. 버스 중재: 중재 버스 중재기가 우선순위를 결정한다. 즉, 버스를 중재할 때 우선순위가 결정된다.

20/31 20/31


인텔 82C59A 인트럽트 제어기 인텔 80386은 단일 인터럽트 요청 선과 단일 인터럽트 확인 신호 선을 제공 여러 장치의 인터럽트를 처리하기 위해 82C59A라는 인터럽트 제어기를 사용 한 개의 82C59A는 최대 8개의 입출력 모듈을 수용 가능하며, cascading 구성을 이용하여 최대 64개까지 지원 입출력 모듈이 인터럽트를 발생하면 82C59A는 인터럽트 요청 선을 통해 80386에게 전달 프로세서가 확인 신호를 보내면 82C59A는 데이터 버스에 발생시킨 장치를 식별할 수 있는 벡터를 적재 82C59A는 프로그램될 수 있어 몇 가지 종류로 우선순위를 설정할 수 있다.

external device

slave 82C59A

INT

slave 82C59A

master 82C59A INT

processor INTR

INT

INTA

slave 82C59A

INT

21/31 21/31

직접 기억장치 접근 방식 인터럽트 방식의 문제점 입출력 전송률이 프로세서가 장치를 검사하고 서비스하는 속도에 제약을 받는다. 프로세서가 입출력 전송을 위하여 많은 시간을 소모한다. DMA 방식도 인터럽트를 사용하지만 블록 단위로 인터럽트를 사용한다. DMA 기능

22/31 22/31


직접 기억장치 접근 방식 – 계속 DMA를 사용하기 위해서는 시스템 버스에 DMA 모듈을 추가로 장착해야 한다. DMA 모듈은 시스템 버스를 통해 입출력 모듈과 주기억장치 간에 데이터를 전송해준다. 따라서 DMA 모듈은 프로세서가 버스를 사용하지 않을 때 또는 프로세서가 버스를 잠시 사용하지 못하도록 하고 사용해야 한다. 보통 후자 방법을 사용하며, 이것을 사이클 훔치기(cycle stealing)이라 훔치기 한다. 프로세서가 데이터의 블록을 쓰거나 읽고 싶으면 DMA 모듈에게 다음 정보를 전달하여 명령을 전달한다. 프로세서와 DMA 모듈 간에 읽기/쓰기 제어선을 통해 읽기/쓰기를 요청한다. 입출력 장치를 식별하는 주소를 데이터 버스를 통해 전달한다. 읽을 데이터가 있는 주기억장치의 위치나 주기억장치에 쓸 위치를 데이터 버스를 통해 전달한다. (DMA 모듈의 주소 레지스터) 읽을 또는 쓸 블록의 크기(워드의 개수)를 데이터 버스를 통해 전달 한다. (DMA 모듈의 데이터 계수 레지스터(data count register))

23/31 23/31

직접 기억장치 접근 방식 – 계속 DMA에게 입출력 요청을 전달한 후에는 인터럽트 방식과 마찬가지로 프로세서는 다른 작업을 한다. DMA는 프로세서의 관여 없이 지정된 크기의 블록을 이동한 다음에 프로세서에게 인터럽트 신호를 보낸다. 명령어 주기 동안 DMA가 프로세서를 잠시 중단시킬 수 있는 위치

DMA 때문에 프로세서가 잠시 중단될 때에는 문맥 보관이 필요 없다. 프로세서는 단순하게 한 클럭 주기 동안 쉬며, 이 때 DMA는 한 워드를 전송한다. 따라서 프로세서의 진행 속도는 느려지지만 인트럽트 방식에 비해 상대적으로 매우 효율적인 방법이다.

24/31 24/31


직접 기억장치 접근 방식 – 계속 예7.10) DMA 모듈이 사이클 훔치기 기법을 이용하여 전송 속도가 10,000byte/sec인 장치로부터 한 바이트씩 전송한다고 가정하자. 또한 이 프로세서는 명령어를 1MIPS 속도로 인출한다고 가정하자. 그러면이 프로세서는 사이클 훔치기 때문에 얼마나 느려지는가? 1byte을 전송하는데 10–4 = 100±10–6 = 100μs 소요된다. 이 프로세서는 1μs마다 한 명령어 인출하며, 피연산자의 인출과 저장을 무시하면 99개의 명령어 인출하면 한번은 DMA 때문에 쉬어야 한다. 따라서 대략 1/100 = 1% 느려진다.

25/31 25/31

DMA 메커니즘을 구성하는 방법 단일 버스 분리 DMA 방식: 방식 모든 모듈이 공통된 시스템 버스를 공유 비용이 저렴하지만 효율성은 떨어진다. 각 워드의 전송은 항상 두 개의 버스 사이클이 필요하다. I/O Æ DMA, DMA Æ memory 따라서 CPU는 항상 두 번 쉬어야 한다.

26/31 26/31


DMA 메커니즘을 구성하는 방법 – 계속 단일 버스 통합 DMA 방식: 방식 DMA 모듈과 몇 개의 입출력 모듈 간에 전용선으로 통신하는 형태 DMA 모듈을 입출력 모듈과 결합하여 사용할 수 있다. 각 워드의 전송은 하나의 버스 사이클만 사용한다. DMA Æ memory 따라서 CPU는 항상 한번만 쉬면 된다.

27/31 27/31

DMA 메커니즘을 구성하는 방법 – 계속 입출력 버스 방식 DMA 모듈에 포함해야 하는 입출력 모듈의 인터페이스의 수를 하나로 줄일 수 있으며, 확장이 용이하다. 효과는 단일 버스 통합 DMA 방식과 같다. system bus processor

DMA

memory

I/O bus I/O

I/O

I/O

28/31 28/31


입출력 기능의 발전 단계 1. CPU가 직접 주변장치를 제어 단계 2. 입출력 모듈을 이용한 프로그램 방식 사용 CPU는 입출력 장치의 자세한 세부 사항을 알 필요가 없다. 단계 3. 입출력 모듈을 이용한 인터럽트 구동 방식 사용 입출력의 실행과 CPU의 프로그램 실행을 병행 단계 4. DMA 방식 사용 블록 단위의 전송이 가능 단계 5. (입출력 채널) 채널 입출력 모듈에 보다 강력한 프로세서를 내장한다. 이 프로세서는 주기억장치로부터 명령어를 인출하여 직접 실행한다. 모듈은 CPU의 관여 없이 명령어를 인출하고 실행한다. 따라서 CPU는 일련의 입출력 동작을 입출력 프로세서가 이해하는 명령어로 제공하면 나머지는 입출력 모듈이 CPU의 관여 없이 처리한다. 단계 6. (입출력 프로세서) 프로세서 입출력 모듈에 내부 기억장치를 포함한다. 이 구성에서는 CPU의 관여를 가장 최소화할 수 있다.

29/31 29/31

입출력 채널의 특징 입출력 채널의 구성 방법 선택기 채널 방식: 방식 다중 고속 장치를 한 번에 하나씩만 처리해준다. 멀티플랙서 채널 방식: 방식 여러 장치를 동시에 처리해준다. 바이트 수준의 멀티플랙서와 블록 수준의 멀티플랙서가 있다.

30/31 30/31


외부 인터페이스 입출력 모듈과 주변장치 간의 인터페이스 병렬 인터페이스: 여러 선을 이용하여 데이터를 교환한다. 직렬 인터페이스: 하나의 선을 이용하여 데이터를 교환한다. 전통적으로 병렬 인터페이스는 고속 주변장치를 연결하기 위해 사용하였고, 직렬 인터페이스는 저속 주변장치를 연결하기 위해 사용되었다. 최근에는 USB, FireWire와 같은 고속의 직렬 인터페이스가 등장하면서 점차 병렬 인터페이스의 사용이 줄어들고 있다. 병렬 인터페이스는 선이 직렬 인터페이스에 비해 고가이며, 선 간에 동기화 문제도 발생한다. 입출력 모듈은 그 내부의 버퍼를 이용하여 시스템과 주변장치의 속도 차이를 극복하여 준다. 입출력 모듈과 주변장치를 연결하는 방법 일대일: 입출력 모듈과 주변장치 간에 전용선을 사용하는 방식 일대다: 버스와 같은 형태로 ���러 주변장치가 하나의 모듈에 연결되어 있다. (USB, FireWire) 31/31 31/31


컴퓨터구조(INA210) 강의노트 08

©copyright 2006

컴퓨터 산술

한국기술교육대학교 정보미디어공학부 김상진

교육목표 컴퓨터 산술의 핵심 요소 수의 표현 방식 부동소수점 수: IEEE 754 표준 기본 산술 연산에 사용되는 알고리즘

2/45


산술논리 연산장치 ALU: 데이터에 대한 산술과 논리 연산을 수행하는 CPU의 구성요소 제어장치, 레지스터와 같은 CPU의 다른 구성요소의 주 기능은 ALU에게 데이터를 제공하고 데이터를 받는 것이다. ALU는 기본적으로 이진 데이터를 처리한다. ALU는 CPU 내부의 레지스터를 있는 데이터에 대한 산술 또는 논리 연산을 수행하고 그 결과를 레지스터에 저장한다. ALU는 연산을 수행한 결과에 대한 추가 정보를 나타내는 flag을 설정 할 수 있다. 예8.1) overflow flag 제어장치는 ALU에게 신호를 보내 수행할 연산을 지시한다.

3/45

정수 표현 0, 1, 음수 기호, 소수점을 이용하면 모든 10진수를 2진수로 표현할 수 있다. 예8.2) -1101.01012 = -13.312510 그러나 컴퓨터로 표현할 때에는 이렇게 간단하지 않다. n비트 이진 숫자 배열 an−1an− 2 … a1a0 은 다음과 같이 부호가 없는 10진수 A로 해석된다. n −1 A = ∑ 2 i ai i =0

4/45


부호 크기 표현 방식 보통 최상위 비트를 부호 비트로 사용하여 부호를 나타낸다. 즉, 최상위 비트가 0이면 양수이고, 1이면 음수이다. 예8.3) +18 = 00010010, -18 = 10010010 이와 같은 표현 방식을 부호 크기(sign-magnitude) 방식이라 한다. 이것을 일반화하면 다음과 같다.

⎧ n− 2 i ⎪ ∑ 2 ai if an−1 = 0 ⎪ i =0 A = ⎨ n− 2 ⎪ − 2i a if a = 1 i n −1 ⎪⎩ ∑ i =0 문제점 1. 덧셈과 뺄셈을 할 때 부호 비트를 고려해야 한다. 문제점 2. 0의 표현이 두 개 존재한다. 예8.4) +0 = 00000000, -0 = 10000000 이 문제점 때문에 실제 컴퓨터에서는 거의 사용하지 않는다. 5/45

2의 보수 표현 방식 2의 보수(twos complement) 표현 방식: 부호 크기 표현 방식과 마찬가지로 최상위 비트를 부호 비트로 사용한다. 그러나 이 방법에서는 음수일 때 나머지 비트를 다르게 해석한다. n− 2 최상위 비트가 0일 경우 A = ∑ 2 i ai i =0

즉, 2의 보수 표현 방식에서는 0도 양수로 취급한다. 따라서 n비트로 표현할 수 있는 양의 정수는 0부터 2n-1-1이다. 최상위 비트가 1일 경우 첫 비트는 수 표현에 포함되지 않으므로 표현할 수 있는 수의 범위는 -1부터 -2n-1까지 이다. 2의 보수는 음수와 양수를 모두 다음과 같이 계산할 수 있다. n− 2

A = − 2 n −1 a n − 1 + ∑ 2 i a i i =0

예8.5) 10000011, 예8.6) 10001000, -128+23=-120

-128+21+20=-125

6/45


4비트 정수의 다른 표현 10진수 표현

부호 크기 표현

2의 보수 표현

바이어스된 표현

+8

1111

+7

0111

0111

1110

+6

0110

0110

1101

+5

0101

0101

1100

+4

0100

0100

1011

+3

0011

0011

1010

+2

0010

0010

1001

+1

0001

0001

1000

+0

0000

0000

0111

–0

1000

–1

1001

1111

0110

–2

1010

1110

0101

–3

1011

1101

0100

–4

1100

1100

0011

–5

1101

1011

0010

–6

1110

1010

0001

–7

1111

1001

0000

–8

1000

7/45

비트 길이가 다른 경우의 변환 부호 크기 표현 방식: 변환하기 쉬움 10진수

+18

–18

8비트

0001 0010

1001 0010

16비트

0000 0000 0001 0010

1000 0000 0001 0010

2의 보수 표현 방식 10진수

+18

–18

8비트

0001 0010

1110 1110

16비트

0000 0000 0001 0010

1111 1111 1110 1110

변환에 사용되는 규칙: 규칙 최상위 비트를 그대로 옮기고 나머지 부분을 최상위 비트와 같은 값으로 채운다.

8/45


비트 길이가 다른 경우의 변환 – 계속 2의 보수 표현 방식은 다음과 같이 해석된다. n− 2

A = − 2 n −1 a n − 1 + ∑ 2 i a i i =0

따라서 양수의 경우에 변환에 사용되는 규칙이 올바르다는 것을 쉽게 알 수 있다. 음수의 경우 n 비트의 수를 m>n 비트의 수로 변환하였을 때 다음이 성립해야 규칙이 올바르다는 것이 증명된다.

−2

m −1

m−2

+ ∑ 2 ai = −2 i

i =0

n −1

n− 2

+ ∑ 2 i ai i =0

이것을 전개하면 다음과 같다.

−2

m −1

m−2

∑2a

+

i

i = n −1 m−2

2 n −1 +

∑2a i

i = n −1 n −1

m−2

i =0

i = n −1

1 + ∑ 2i +

m−2

i = n −1

2 i ai

i

i

=

− 2 n −1

=

2 m −1 m−2

2 i ai = 1 + ∑ 2 i i =0

=

m−2

∑2

i

i = n −1

9/45

정수 산술 – 음수화 부호 크기 표현 방식에서 수의 부호를 바꾸는 방법: 부호 비트를 바꿈 2의 보수 표현 방식에서 수의 부호를 바꾸는 방법 단계 1. 모든 비트의 보수를 취한다. 단계 2. 1을 더한다. 예8.7) 18 = 00010010 단계 1. 11101101 단계 2. 11101101+1=11101110 예8.8) -18 = 11101110 단계 1. 00010001 단계 2. 00010001+1=00010010

10/45 10/45


정수 산술 – 음수화(계속) 2의 보수에서 음수화 알고리즘 유효성 증명 n− 2

A = − 2 n −1 a n − 1 + ∑ 2 i a i i =0

A를 부호 변환하면 다음과 같다. B = −2

n −1

n− 2

a n −1 + 1 + ∑ 2 i a i i =0

2의 보수 표현의 부호를 변환하는 규칙이 유효하다면 A+B=0이어야 한다. n− 2 n −1 A + B = − (an−1 + an−1 )2 + 1 + ∑ 2i (ai +ai ) i =0

n− 2

= − 2 n −1 + 1 + ∑ 2 i = −2

n −1

i =0 n −1

+1+ 2

−1

= 0

11/45 11/45

정수 산술 – 음수화(계속) 특수한 경우 예8.9) 0 = 0000 0000 단계 1. 11111111 단계 2. 00000000+1=100000000 이 경우 자리 올림(carry)이 발생하는데 이것은 무시한다. 예8.10) –128=10000000 단계 1. 01111111 단계 2. 01111111+1=100000000 이것에 대한 해결책은 없다. 전체적으로 표현할 수 있는 수의 종류는 짝수이다. 따라서 음수와 양수의 수를 동일하게 사용하면 0의 표현이 두 개 존재하게 되며, 0의 표현을 하나만 사용하면 음수와 양수의 수가 다르게 된다.

12/45 12/45


정수 산술 – 덧셈,뺄셈 2의 보수에서 덧셈과 뺄셈 덧셈: 일반적인 2진수 덧셈 덧셈에서 자리 올림이 발생하면 무시한다. 양수에 양수를 더하거나 음수에 음수를 더할 경우에만 넘침 (overflow)이 발생할 수 있다. 두 경우에 결과값의 부호가 바뀌면 넘침이 발생하였다는 것을 알 수 있다. 뺄셈은 덧셈으로 바꾸어 계산함 B register A register 예8.11) a – b = a + (–b) 따라서 덧셈과 부호변경 회로만 complementer 필요하다. SW

OF

adder

13/45 13/45

정수 산술 – 덧셈,뺄셈(계속) 예8.12) (–7)+(+5) 1 0 0 1 = −7

01 01 = 5 1 1 1 0 = −2 예8.13) (–4)+(+4) 1 1 0 0 = −4 01 0 0 = 4 1 0 0 0 0 = 0 예8.14) (+3)+(+3)

예8.15) (–4)+(–1) 1 1 0 0 = −4

1 1 1 1 = −1 1 1 0 1 1 = −5 예8.16) (+5)+(+4) 01 01 = 5 01 0 0 = 4 1 0 0 1 = overflow 예8.17) (–7)+(–6)

0 01 1 = 3

1 0 0 1 = −7

01 0 0 = 4

1 0 1 0 = −6

01 1 1 = 7

1 0 0 1 1 = overflow

14/45 14/45


정수 산술 – 덧셈,뺄셈(계속) 예8.18) (+2)–(+7) 0 01 0 = 2

예8.21) (5)–(–2) 01 01 = 5

01 1 1 = 7

1 1 1 0 = −2

1 0 0 1 = −7

0 01 0 = 2

1 0 1 1 = −5

01 1 1 = 7

예8.19) (+5)–(+2) 01 01 = 5

예8.22) (+7)–(–7) 01 1 1 = 7

0 01 0 = 2

1 0 0 1 = −7

1 1 1 0 = −2

01 1 1 = 7

1 0 01 1 = 3 예8.20) (–5)–(+2) 1 0 1 1 = −5 0 01 0 = 2 1 1 1 0 = −2 1 1 0 0 1 = −7

1 1 1 0 = overflow 예8.23) (–6)–(+4) 1 0 1 0 = −6 01 0 0 = 4 1 1 0 0 = −4 1 0 1 1 0 = overflow 15/45 15/45

정수 산술 – 곱셈

1 0 1 1 = 11 1 1 0 1 = 13

양의 정수 곱셈: 곱할 수의 비트가 0이면 1 01 1 부분곱은 0이고, 곱할 수의 비트가 1이면 0 0 0 0 부분곱은 곱해질 수와 같다. 1 01 1 컴퓨터를 이용한 곱셈 1 01 1 모든 부분곱을 구한 다음에 더하여 1 0 0 0 1 1 1 1 = 143 최종 결과를 구하면 중간에 계산한 부분곱을 모두 일시적으로 보관해야 한다. 따라서 컴퓨터의 경우에는 저장 공간을 절약하기 위해 부분곱을 계속 더한 축적된 값만을 보관한다. 곱할 수의 비트가 1이면 이동과 덧셈이 모두 필요하고, 곱할 수의 비트가 0이면 오른쪽으로 한 비트만 이동하면 된다.

16/45 16/45


정수 산술 – 곱셈(계속) Mn-1

M0

n

C

shift and add control logic

adder

An-1

A0

Qn-1

Q0

C

A

Q

M

0

0000

1101

1011

0

1011

1101

1011

덧셈

0

0101

1110

1011

이동

0

0010

1111

1011

이동

0

1101

1111

1011

덧셈

0

0110

1111

1011

이동

1

0001

1111

1011

덧셈

0

1000

1111

1011

이동

초기값 주기 1 주기 2 주기 3 주기 4 17/45 17/45

정수 산술 – 곱셈(계속) 2의 보수로 표현된 수의 곱셈 곱해질 수와 곱할 수 중 하나만 음수이어도 두 개의 양의 정수를 곱할 때 사용한 알고리즘을 사용할 수 없다. 양의 정수 곱셈과 2의 보수 곱셈 비교

1 0 01 = 9

1 0 0 1 = −7

0 01 1 = 3

0 01 1 = 3

0 0 0 01 0 01

1001 × 2

0 0 01 0 01 0

1001 × 21

0 0 0 1 1 0 1 1 = 27 양의 정수 곱셈

0

1111 1 0 01

( −7) × 20 = ( −7)

1111 0 01 0

( −7) × 21 = ( −14)

1 1 1 0 1 0 1 1 = ( −21) 2의 보수 곱셈 주목. 부분곱은 양의 정수를 곱할 때처럼 한 다음에 왼쪽을 1로 채우면 우리가 원하는 부분곱을 얻을 수 있다.

18/45 18/45


정수 산술 – 곱셈(계속) 해결책 곱해질 수와 곱할 수를 모두 양수로 바꾸어 곱셈을 한 다음에 필요에 따라 결과 값의 부호를 바꾼다. Booth의 알고리즘: 결과 값의 부호를 바꿀 필요가 없다. Booth 알고리즘 곱해질 수와 곱할 수는 각각 M과 Q 레지스터에 적재한다. 곱셈을 위해 M과 크기가 같은 A 레지스터와 한 비트 크기의 Q–1 레지스터를 사용한다. 이 두 레지스터는 0으로 초기화한다. 양의 곱셈과 달리 한 비트 레지스터의 위치가 Q 다음에 놓인다.

19/45 19/45

Booth 알고리즘 A = 0, Q-1 = 0 M= Q= Count = n

= 10

A=A-M

Q0, Q-1

= 11 = 00

= 01

A=A+M

: A, Q, Q-1 Count = Count - 1

No

Count ?= 0

yes

A

Q

Q–1

M

0000

0011

0

0111

1001

0011

0

0111

AÅA–M

1100

1001

1

0111

이동

1110

0100

1

0111

이동

0101

0100

1

0111

AÅA+M

0010

1010

0

0111

이동

0001

0101

0

0111

이동

초기값 주기 1 주기 2 주기 3 주기 4

양의 정수 곱과 마찬가지로 곱할 수의 각 비트를 하나씩 검사한다. Booth 알고리즘에서는 현재 비트와 Q-1 비트를 함께 검사한다. 만약 두 비트가 같으면 오른쪽 이동만 하고, 다르면 곱해질 수를 A에 더하거나 (01) A로부터 곱해질 수를 뺀다(10). 여기서 이동은 산술 이동(arithmetic shift)을 한다. 산술 이동을 하면 최상위 비트는 그 값을 유지한다. 이것은 중간 결과 값의 부호를 유지하기 위해 필요하다. 20/45 20/45


Booth 알고리즘 – 계속 Booth 알고리즘의 동작 원리 연속된 1이 0에 의해 둘러싸인 곱할 수를 생각하여 보자. M ± (00011110) = M ± (24+23+22+21) = M ± (16+8+4+2) = M ± (30) 따라서 (M ± 24)+ (M ± 23)+ (M ± 22)+ (M ± 21) 을 이용하여 곱셈을 할 수 있다. 그런데 다음 성질을 이용하면 보다 적은 연산으로 곱셈을 구할 수 있다. 2n+2n-1+…+2n-K = 2n+1 – 2n–K 즉, M ± (00011110) = M ± (25-21) = M ± (32-2) = M ± (30) 따라서 M ± 25 - M ± 21을 이용하여 곱셈을 할 수 있다. 이것은 쉽게 일반적인 경우로 확장할 수 있다. M ± (01111010) = M ± (26+25+24+23+21) = M ± (27-23+ 22-21) = M ± (120+2) Booth 알고리즘은 이 원리를 이용하여 1의 블록을 처음 만나면(10) 뺄셈을 하고 이 블록이 끝나면(01) 덧셈을 한다. 21/45 21/45

Booth 알고리즘 – 계속 음수에 대해서도 같은 원리를 적용할 수 있음을 알아보자. X가 음수이면 X는 다음과 같이 표현된다. X = {1xn–2xn–3…x0 } 이 때 X의 값은 다음과 같다. X = –2n–1 + (xn–2 ± 2n–2) + (xn–3 ± 2n–3) + … + (x1 ± 21) + (x0 ± 20) X의 최상위 비트는 X가 음수이므로 당연히 1이다. X의 비트 표현에서 0이 처음 나오는 최상위 비트의 위치가 k라고 가정하자. X = 111…10xk–1xk–2…x1x0 그러면 X의 값은 다음과 같다. X = –2n–1 + 2n–2 + … + 2k+1 + (xk–1 ± 2k–1) + … + (x1 ± 21) + (x0 ± 20) 이것을 다시 정리하면 다음과 같다. X = –2n–1 + 2n–1 – 2k+1 + (xk-1 ± 2k–1) + … + (x1 ± 21) + (x0 ± 20) = – 2k+1 + (xk-1 ± 2k–1) + … + (x1 ± 21) + (x0 ± 20) 즉, 원리가 음수에 대해서도 계속 적용됨을 알 수 있다. 22/45 22/45


Booth 알고리즘 – 계속 M ± (11111010) = M ± (–23+ 22–21) = M ± (–8+4–2) = M ± (–6) 예8.24) (+7)±(+3) 01 1 1 = 7 0 01 1 = 3 1 1 1 1 1 0 01 1− 0 0 0 0 0 0 0 0 1−1 0 0 01 1 1 0−1 0 0 0 1 0 1 0 1 = 21

예8.26) (–7)±(+3) 1 0 0 1 = −7 0 01 1 = 3 0 0 0 0 01 1 1 0−1 0 0 0 0 0 0 0 1−1 1 1 1 0 01 1− 0 1 1 1 0 1 0 1 1 = −21

예8.25) (+7)±(–3)

예8.27) (–7)±(–3)

1 0 1 1

1 0 1 1

1 0 1 1

1 0 0 0

0 1 1 1 0 1

1 1 0 1 1 0

1 1 = 7 0 1 = −3 01 1− 0 1 0−1 1− 0 1 1 = −21

0 1 0 0

0 1 0 0

0 1 0 0

0 1 1 1

1 1 0 0 1 0

0 1 1 0 1 1

0 1 = −7 0 1 = −3 1 1 1− 0 1 0−1 1− 0 0 1 = 21

23/45 23/45

정수 산술 – 나눗셈 양의 정수 나눗셈 A=0 M= Q= Count = n

나눗수 몫

0 0 0 1 0111 0 0 1 0 0 01 1 0

0 1 1 1 0 0

1 0 1 1 1 1 1

1 01 01 1 0 1 1 1 1 01 1 1 0 0

:

나뉨수

A, Q

A=A-M

나머지

no

A<0

yes

Q0 = 1 A=A+M

Q0 = 1

Count = Count - 1

No

Count ?= 0

yes

24/45 24/45


정수 산술 – 나눗셈(계속) 2의 보수 나눗셈 단계 1. 나눗수를 M 레지스터에 나뉨수를 A와 Q 레지스터에 적재함 단계 2. A와 Q 레지스터를 한 비트 왼쪽 이동함 참고. 왼쪽 이동을 할 때 최하위 비트는 0으로 채움. 참고. 왼쪽 이동을 먼저 하는 이유: 첫 비트는 부호 비트이므로 고려 대상에서 제외되기 때문 단계 3. M과 A의 부호가 같으면 A Å A - M을 하고, 다르면 A Å A + M을 한다. 단계 4. 단계 3을 수행한 후에 A의 부호가 이전과 같으면 단계 3이 성공적으로 수행되었다고 함. 단계 4-1. 단계 3이 성공적이거나 A가 0이면 Q0을 1로 설정함. 단계 4-2. 단계 3이 실패하였고 A가 0이 아니면 Q0을 0으로 설정하고 A를 이전 값으로 복원한다. 참고. 나눌 수 있는지 검사하고 나눌 수 있으면 몫을 설정하는 과정 단계 5. Q의 비트 크기만큼 단계 2부터 4를 반복한다. 끝. 나머지는 A에 있고, 나눗수와 나뉨수의 부호가 같으면 몫은 Q에 있고 다르면 Q의 부호를 바꾸어야 몫이 됨

25/45 25/45

정수 산술 – 나눗셈(계속) 예8.28) (+7) ÷ (+3)

예8.29) (+7) ÷ (–3)

A

Q

M

A

Q

M

0000

0111

0011

0000

0111

1101

0000 1101 0000

1110

이동 뺄셈 복원

0000 1101 0000

1110

이동 덧셈 복원

0001 1110 0001

1100

이동 뺄셈 복원

0001 1110 0001

1100

0011 0000 0000

1000

이동 뺄셈 Q0 = 1

0011 0000 0000

1000

0001 1110 0001

0010

이동 뺄셈 복원

0001 1110 0001

0010

1110

1100

1001

0010

1110

1100

1001

0010 1110

이동 덧셈 복원 이동 덧셈 Q0 = 1 이동 덧셈 복원

26/45 26/45


정수 산술 – 나눗셈(계속) 예8.28) (–7) ÷ (+3)

예8.29) (–7) ÷ (–3)

A

Q

M

A

Q

M

1111

1001

0011

1111

1001

1101

1111 0010 1111

0010

이동 덧셈 복원

1111 0010 1111

0010

이동 뺄셈 복원

1110 0001 1110

0100

이동 덧셈 복원

1110 0001 1110

0100

1100 1111 1111

1000

이동 덧셈 Q0 = 1

1100 1111 1111

1000

1111 0010 1111

0010

이동 덧셈 복원

1111 0010 1111

0010

0010

0100

1001

0010 1110

0010

0100

1001

0010

이동 뺄셈 복원 이동 뺄셈 Q0 = 1 이동 뺄셈 복원

27/45 27/45

정수 산술 – 나눗셈(계속) 비고. (-7) ÷ (+3)과 (+7) ÷ (-3)의 나머지는 다르다. ��� 알고리즘에서 나머지는 다음과 같이 정의된다. D=Q±V+R D: 나뉨수, Q: 몫, V: 나눗수, R: 나머지

28/45 28/45


고동소수점 표현 고정소수점 표현(fixed-point representation) 방식: 수를 표현하는 표현 비트의 일부분을 정수부분(소수점 윗 부분)을 나타내기 위해 사용하고 정수부분 나머지 부분을 소수부분(소수점 아래 부분)을 나타내기 위해 사용하는 소수부분 방식을 말한다. 예8.30) 8 비트: 1(부호)/3(정수부)/4(소수부) 0 011 1100 = 3.75 이 표현 방식을 이용하면 0을 중심으로 양수와 음수를 표현할 수 있으며, 소수도 표현할 수 있다. 고정소수점 표현 방식의 문제점 매우 큰 수를 표현할 수 없다. 매우 작은 소수를 나타낼 수 없다. 나눗셈을 하였을 때 몫의 소수 부분이 손실될 수 있다. 이것을 극복하기 위해 과학적 표기방법을 사용한다. 예8.31) 976,000,000 = 9.76 ± 108 예8.32) 0.0000000976 = 9.76 ± 10–8

29/45 29/45

부동소수점 표현 2진수에서도 과학적 표기방법을 다음과 같이 사용할 수 있다. ±S ± B±E 여기서 S는 가수(significant), B는 기수(base), 가수 기수 E는 지수(exponent)라 한다. 지수 이것을 표현하기 위해서는 부호, 가수, 지수를 나타내는 세 개의 필드가 필요하다. 모든 수가 같은 기수를 사용하므로 기수는 나타낼 필요가 없다. 이런 표현 방법을 부동소수점 표현(floating-point representation) 표현 방식이라 한다.

30/45 30/45


부동소수점 표현 – 계속 전형적인 32비트 부동소수점 형식

부호부분(최상위 비트): 부호 비트로서 0이면 양수이고 1이면 음수 부호부분 이다. 지수부분(8 지수부분 비트): 지수 값을 나타낸다. 바이어스된 표현법(biased representation)을 사용한다. 표현법 가수부분(23 비트): 가수를 나타내며, 메틴사(mantissa)라고도 한다. 가수부분

31/45 31/45

부동소수점 표현 – 계속 바이어스된 표현법이란 필드에 나타난 값을 고정된 특정 값(바이어스)에서 빼야 실제 값을 얻을 수 있는 표현을 말한다. 보통 바이어스는 2k-1–1을 사용한다. 여기서 k는 사용하는 필드의 크기이다. 따라서 8비트를 사용하면 바이어스는 127이며, 값의 범위는 –127에서 128이다. 4 비트 바이어스된 표현법에서 바이어스는 7이다. 1111 = 15이므로 바이스된 표현법에서 1111은 8을 나타낸다. 바이어스된 표현법을 사용하는 장점은 양의 부동소수점 수의 크기를 비교할 때 정수로 취급하여 비교할 수 있다는 것이다.

32/45 32/45


부동소수점 표현 – 계속 부동소수점 수는 여러 가지로 표현될 수 있다. 예8.33) 다음은 모두 같다. 0.110 ± 25, 110 ± 22, 0.0110 ± 26 이 문제를 극복하기 위해 정규화된 표현을 표현 사용한다. 정규화된 표현은 다음과 같다. ±1.bbb…b ± 2±E 여기서 b는 1 또는 0이며, 최상위 비트는 항상 1이므로 저장할 필요가 없다. 따라서 23 비트를 이용하여 가수를 나타내면 총 24 비트 값을 나타낼 수 있다. 예8.34) 8 비트: 1(부호)/2(지수부)/5(가수부) 3.7510 = 11.112 = 1.111 ± 21 Æ 0 10 11100 최상위 비트에는 부호 비트를 저장한다. 실제 지수에 바이어스 1을 더하여 지수를 저장한다. 실제 가수의 최상위 비트는 항상 1이므로 저장할 필요가 없다. 33/45 33/45

부동소수점 표현 – 계속 예8.35) 32 비트: 1.1010001 ± 210100 0 10010011 10100010000000000000000 = 1.638125 ± 220 실제 지수에 127을 더하여 지수를 저장한다. 예8.36) 32 비트: -1.1010001 ± 210100 1 10010011 10100010000000000000000 = –1.638125 ± 220

34/45 34/45


부동소수점 표현 – 수의 범위 32 비트를 사용할 때 나타낼 수 있는 수의 범위 음수: –(2–2–23) ± 2128부터 –2–127까지 0 111 1111 = (1+0.5+0.25+0.125+0.0625) ± 24 양수: 2–127부터 (2–2–23) ± 2128까지 = (1+1–0.625) ± 24 32 비트를 사용할 때 포함되지 않는 범위 = (2–2–4) ± 24 0 000 0000 –(2–2–23) ± 2128보다 작은 음수: 음수 넘침 = 1 ± 2–3 = 2–3 –2–127보다 큰 음수: 음수 아래 흘림(underflow) 0 2–127보다 작은 양수: 양수 아래 흘림 (2–2–23) ± 2128보다 큰 양수: 양수 넘침

35/45 35/45

부동소수점 표현 – 수의 범위 넘침은 8비트 바이어스된 표현으로 표현할 수 있는 값보다 큰 지수(2129 이상)가 필요하면 발생하고, 반대로 작은 지수(2-128 이하) 가 필요하면 아래 흘림이 발생한다. 부동소수점 표현 방식으로 보다 많은 값을 나타내는 것은 아니다. 32 비트를 사용하여 부동소수점 표현하면 여전히 나타낼 수 있는 값의 개수는 232이다. 부동소수점 표현 방식은 고정소수점 표현 방식과 달리 수의 선상에서 균등한 간격으로 나타나지 않는다. 0에 가까울 수록 수들이 더 밀집되어 있다. 이것은 큰 수일 수록 큰 지수를 곱해 표현된다. 부동소수점 표현 방식에서는 범위와 정밀도 간에 trade-off가 있다. 지수를 나타내는 비트의 수를 증가하면 범위는 증가하지만 나타낼 수 있는 수의 개수는 고정되어 있으므로 정밀도는 떨어진다. 같은 비트의 수를 사용하지만 기수를 증가(2진수에서 16진수)하면 범위는 증가한다. 그러나 마찬가지로 정밀도는 떨어진다. 36/45 36/45


부동소수점 표현 – round-off 오류 부동소수점 표현 방식을 사용하면 특정 수만 표현할 수 있다. 만약 A'이 A를 근사화하여 저장된 값이라 하면 상대적 오류 r = (A–A')/A로 정의된다. 예8.37) +0.4를 기저 2를 이용하여 8 비트(1/3/4)로 표현할 때 상대적 오류는? 0.4를 이진으로 바꾸면 0.011001100이다. 이것을 정규화하면 1.1001100…±2–2이다. 이것을 8 비트로 표현하면 0 001 1001이며, 이것을 다시 10진수로 바꾸면 (1+1/2+1/16) ± 2-2 = 0.390625 이다. 따라서 상대적 오류는 (0.4-0.390625)/0.4 = 0.0234375 이다. A'과 B'이 각각 A와 B를 근사화하여 저장된 수이면 이 두 수의 곱의 상 대적 오류는 A'과 B'의 상대적 오류의 합이 된다. EA = (A–A')/A = 1–(A'/A), A' = A(1–EA), B' = B(1–EB) A'B' = AB(1–EA)(1–EB) = AB(1–(EA+EB)+EAEB) ≈ AB(1–(EA+EB)) EAEB는 EA+EB보다 상대적으로 적으므로 무시할 수 있다.

37/45 37/45

IEEE 표준 IEEE 754 표준은 기수가 2인 다음 두 형식을 정의하고 있다. 보통 형식(single precision, 32 비트): 1/8/23 배정도 형식(double precision, 64 비트): 1/11/52 +0 또는 –0의 표현: 지수와 가수 부분이 모두 0 +∞ 또는 –∞의 표현: 지수 부분은 모두 1이고 가수 부분은 모두 0 두 개의 확장 형식 제공: 중간값 계산을 위함 보통 확장 형식(43 비트 이상, 지수는 11 비트 이상) 배정도 형식(79 비트 이상, 15 비트 이상) 두 개의 확장 형식 사용의 이점 최종 결과의 round-off 오류 감소 중간값 넘침 확률 감소

38/45 38/45


부동소수점 – 덧셈/뺄셈 부동소수점 덧셈, 뺄셈 알고리즘은 4단계로 구성 단계 1. 0 검사 뺄셈이면 감수의 부호를 바꾼다. A–B = A+(–B) 둘 중 하나가 0이면 덧셈과 뺄셈을 수행할 필요가 없다. 단계 2. 가수를 이동하여 두 가수의 자릿수를 일치시킨다. 함축적인 가수 비트를 사용하면 산술을 하기 전에 이것을 명백하게 나타내야 한다. 두 피연산자의 지수가 같도록 한 피연산자의 소수점을 이동시켜 배치를 조정함. 조정할 때 작은 수를 오른쪽으로 이동(지수 증가)하거나, 큰 수를 왼쪽으로 이동(가수 증가): 손실을 최소화하기 위해 전자 사용 예8.38) 8비트: 0 011 (1)0011 + 0 001 (1)1010 작은 수의 오른쪽 이동: 0 011 10011 + 0 011 00110 큰 수의 왼쪽 이동: 0 001 01100 + 0 001 11010

39/45 39/45

부동소수점 – 덧셈/뺄셈(계속) 단계 3. 가수를 더하거나 뺀다. 두 피연산자의 부호가 다를 수 있으므로 결과가 0일 수 있다. 가수 넘침이 가능하다. 가수 넘침이 발생하면 결과 수의 가수를 오른쪽으로 하나 이동하고 지수를 하나 증가시킨다. 이 결과 지수 넘침이 발생할 수 있다. 이 경우에는 오류를 보고 한다. 단계 4. 결과를 정규화한다. 결과 수의 가수의 최상위 비트가 1이 될 때까지 왼쪽으로 이동한다. 왼쪽 이동마다 지수를 하나 감소한다. 이 결과 지수 아래 흘림이 발생할 수 있다. 필요에 따라서는 근사화할 필요가 있다.

40/45 40/45


부동소수점 – 덧셈/뺄셈(계속) 예8.39) 8 비트(1/2/5)을 이용한 부동소수점 수 나타낼 수 있는 수의 범위 –7.875 ~ -0.5, 0.5 ~ 7.875 비고. 0의 표현은 고려하지 않은 경우의 수의 범위이다. 1.23810 = 1.0011112 Æ 0 01 00111 1 0 0 1.21510 = 1.0011012 Æ 0 01 00110 + 0 1 0 0.67810 = 0.1010112 Æ 0 00 01011 1 1 1 1.238+0.678 1 0 0 1.87510 = 0 01 11100 − 0 1 0 0 1 0 1.238–0.678 0.562510 = 0 00 00100 1 0 0 − 1 0 0 1.238–1.215 0 0 0 정규화 과정에서 지수 아래 흘림이 발생한다.

11 1 10 1 10 0 1 1 1 1 0 1 0 1 0 1 1 1 1 1 0 0 0 1

41/45 41/45

부동소수점 – 곱셈/나눗셈 곱셈 단계 1. 0 검사: 하나의 피연산자가 0이면 연산의 결과는 0이 된다. 단계 2. 지수들의 덧셈 바이어스된 표현 방법을 사용하므로 결과에서 바이어스를 빼주어야 한다. 덧셈 결과 지수 넘침 또는 지수 아래 흘림이 발생할 수 있다. 이 경우에는 이것을 보고하고 멈춘다. 단계 3. 가수들의 곱셈: 가수들의 곱셈 결과의 길이는 승수나 피승수의 두 배가 된다. 이 때 반올림 과정에서 추가 비트는 손실된다. 단계 4. 결과의 정규화: 덧셈과 마찬가지로 정규화한다.

42/45 42/45


부동소수점 – 나눗셈 나눗셈 단계 1. 0 검사: 나눗수가 0이면 오류를 보고한다. 나뉨수가 0이면 연산의 결과는 0이 된다. 단계 2. 지수들의 뺄셈: 나눗수의 지수를 나뉨수로부터 뺀다. 바이어스된 표현 방법을 사용하므로 결과에서 바이어스를 값을 더해주어야 한다. 뺄셈 결과 지수 넘침 또는 지수 아래 흘림이 발생할 수 있다. 이 경우에는 이것을 보고하고 멈춘다. 단계 3. 가수들의 나눗셈 단계 4. 결과의 정규화

43/45 43/45

보호 비트 부동소수점 수를 레지스터에 적재할 때 지수와 가수를 분리하여 서로 다른 레지스터에 저장한다. 따라서 레지스터는 함축된 비트까지 표현하더라도 가수의 길이보다는 크다. 따라서 남은 비트를 보호 비트(guard bit)라 한다. 비트 실제 가수는 최상위 비트부터 기록되며, 남은 비트는 0으로 채워진다. 보호 비트를 이용하면 결과 계산의 정밀도를 높일 수 있다. 예8.40) 23 비트 가수를 사용하며 32 비트 레지스터에 저장한다. X = 1.00…00±21에서 Y = 1.11…11±20를 빼는 경우 가수의 위치가 일치하도록 작은 수를 오른쪽으로 이동해야 한다.

x = 1 . − y = 0 . z = 0 . = 1 .

0 1 0 0

0 1 0 0

0 1 0 0

... ... ... ...

0 1 1 0

× × × ×

21 21 21 2−22

보호 비트를 사용하지 않는 경우

x = 1 . − y = 0 . z = 0 . = 1 .

0 1 0 0

0 1 0 0

0 1 0 0

... ... ... ...

0 1 0 0

0000 1000 1000 0000

× × × ×

21 21 21 2−23

보호 비트를 사용하는 경우

44/45 44/45


근사화 근사화의 네 가지 방법 가장 가까운 값으로 근사화: 표현할 수 있는 가장 가까운 수로 근사 +∞ 방향으로 근사화 –∞ 방향으로 근사화 0 방향으로 근사화: 가장 쉬운 방법으로 항상 추가 비트는 버린다. 연산을 계속하면 오류가 점점 축적된다는 문제점이 있다. 가장 가까운 값으로 근사화할 때 양방향으로 거리가 같으면 항상 잘라 버림(오류가 축적됨) 랜덤하게 선택(결과값을 예측할 수 없음) 항상 짝수가 되도록 한다. 즉, 마지막 비트가 1이면 반올림을 하고 0이면 잘라 버림을 한다.

45/45 45/45


컴퓨터구조(INA210) 강의노트 09

©copyright 2006

명령어 집합: 특징과 기능 한국기술교육대학교 정보미디어공학부 김상진

교육목표 컴퓨터 명령어의 구조 컴퓨터 명령어의 종류 프로시저 호출의 원리

2/30


기계 명령어의 특징 기계 명령어: CPU가 실행할 수 있는 명령어 CPU의 명령어 집합: CPU가 실행하는 명령어의 집합으로, 보통 CPU마 다 다르다. 기계 명령어의 구성요소 연산 코드: 수행될 연산을 지정 (필수) 원천 피연산자 참조: 연산의 입력으로 사용하는 피연산자 (대부분 제공) 결과 참조: 연산의 결과 (선택) 다음 명령어 참조: 현재 명령어를 실행한 다음에 CPU가 인출할 다음 명령어의 위치 (선택)

3/30

기계 명령어의 특징 – 계속 일반적으로 다음 명령어는 현재 실행한 명령어의 바로 다음 위치에 있으며, 이 경우에는 다음 명령어 참조가 필요 없다. 다음 명령어의 위치는 주기억장치의 주소 또는 가상기억장치의 주소가 될 수 있다. 만약 가상기억장치의 주소를 사용하면 명령어는 디스크에 있을 수 있다. 명령어에서 참조하는 피연산자와 연산 결과의 가능한 위치 주기억장치 또는 가상기억장치 CPU 레지스터 입출력 장치: 기억장치-사상 방식을 사용하면 이것은 주기억장치 또는 가상기억장치 주소가 된다.

4/30


명령어 형식 기계 명령어는 일련의 비트로 표현되며, 이 비트들은 몇 개의 필드로 구분된다. 한 명령어 집합에서는 보통 여러 개의 형식을 사용한다. 명령어가 실행되기 위해서는 IR 레지스터에 적재되어야 하며, CPU는 명령어에서 각 필드의 값을 추출할 수 있어야 한다. 기계 명령어의 이진 표현은 읽기가 난해하므로 기호 표현 방식을 사용한다. 이 때 연산 코드는 니모닉(mnemonics)라고 하는 약어(예, ADD, LOAD, STOR 등)를 사용하여 나타낸다.

5/30

명령어 종류 하나의 고급 프로그래밍 문장은 여러 개의 기계어 명령어로 번역되어 실행될 수 있다. 예9.1) X = X + Y; 여기서 X의 위치는 513이고, Y는 514라 하자. 그러면 IAS 컴퓨터의 경우에는 다음과 같은 일련의 기계어 명령어를 이용하여 실행한다. LOAD M(513) ADD M(514) STOR M(513) 명령어는 크게 다음 네 가지 종류 중 하나로 분류된다. 데이터 처리: 산술 및 논리 명령어 데이터 저장: 주기억장치와 관련된 명령어 데이터 이동: 입출력장치와 관련된 명령어 제어: 검사와 분기 명령어

6/30


명령어에 포함된 주소의 개수 한 명령어에 필요한 주소의 최대 개수: 4 입력(2): 대부분의 산술, 논리 연산은 단항 또는 이진 연산자이다. 출력(1) 다음 명령어의 위치(1) 그러나 4개의 주소를 사용하는 명령어는 극히 드물다. 3-주소, 2-주소, 1-주소 명령어의 비교 예9.2) C Å A + B 3-주소 명령어: ADD C,A,B 2-주소 명령어: MOV C,A; ADD C,B 1-주소 명령어: LOAD A; ADD B; STOR C; 주소의 개수

기호 표현

해석

3

OP A, B, C

A Å B OP C

2

OP A, B

A Å A OP B

1

OP A

AC Å AC OP A

0

OP

T Å (T-1) OP T 7/30

명령어에 포함된 주소의 개수 – 계속 3-주소를 사용하기 위해서 명령어 형식의 길이가 길어야 하므로 거의 사용되지 않는다. 2-주소를 사용하는 경우에는 하나의 주소가 입력과 출력 역할을 동시에 한다. 예9.3) ADD C, B C와 B를 더한 후에 그 결과를 C에 저장한다. 1-주소를 사용하는 경우에는 하나의 주소가 함축적으로 포함되며, 보통 AC 레지스터를 사용한다. 스택 구조를 사용하면 주소를 하나도 사용하지 않을 수 있다. 주소가 많을 수록 CPU가 복잡해지며, 명령어 형식의 길이는 길어진다. 반면에 어떤 하나의 작업을 하기 위해 필요한 명령어의 수는 줄어들어 수행시간은 짧아지며, 범용 레지스터의 수가 증가하므로 레지스터만을 이용하여 많은 연산을 수행할 수 있게 된다.

8/30


명령어 집합 설계 근본적인 중요 설계 쟁점 연산 종류: 연산의 수와 종류 및 복잡도 데이터 유형: 연산이 수행될 데이터의 유형 명령어 형식: 명령어의 길이, 주소의 개수, 각 필드의 크기 등 레지스터: 명령어에 의해 사용될 레지스터의 수와 용도 주소지정: 주소 지정 방식

9/30

명령어 집합 설계 – 피연산자의 유형 명령어가 조작하는 데이터의 유형 주소: 보통 부호없는 정수로 취급 수: 정수, 부동소수점 수, 10진수 문자 논리 데이터: 한 워드는 n개의 1비트 데이터로 구성되어 있다고 간주할 수 있다. 만약 데이터를 이와 같이 사용하면 논리 데이터라 한다.

10/30 10/30


명령어 집합 설계 – 피연산자의 유형(수) 컴퓨터에서 수는 다음과 같은 표현의 한계가 있다. 크기의 한계 부동소수점 수의 경우: 정밀도 컴퓨터에서 제공하는 수치 데이터의 세 가지 유형 정수 또는 고정소수점 수 부동소수점 수 10진수 컴퓨터는 기본적으로 2진수를 사용하지만 사용자는 10진수를 주로 이용한다. 따라서 10진수를 2진수로 바꾸어 계산한 다음 결과를 다시 10진수로 바꾸어 주어야 한다. BCD(Binary Coded Decimal) 표현 방식을 사용하면 이런 변환 없이 2진수를 10진수처럼 사용할 수 있다. BCD는 4 비트를 이용하여 10진수의 각 숫자를 표현한다. 예9.4) 102410를 BCD로 표현하면 다음과 같다. 0001 0000 0010 0100 단점: 어떤 수를 표현하기 위해 많은 비트가 필요하다. 11/30 11/30

명령어 집합 설계 – 피연산자의 유형(문자) 현재는 IRA (International Reference Alphabet)을 사용하여 문자를 비트로 표현한다. 미국에서는 이것을 ASCII라 한다. ASCII는 7 비트를 사용한다. 따라서 총 128개의 문자를 나타낼 수 있다. ASCII는 보통 8 비트로 전달되며, 추가되는 한 비트는 패리티 비트로 사용하거나 그냥 0으로 채운다. ASCII에서는 011XXXX 형태로 0부터 9를 나타낸다. 즉, 0은 0110000 이고, 1은 0110001이다. 따라서 ASCII에서 BCD로 변환이 용이하다. 한글코드는 크게 완성형(KSC5601-1987,ISO-IR 149)과 조합형으로 두 종류가 있으며, 모두 2 바이트를 사용한다. 첫 비트는 항상 1이며, 이 첫 비트를 통해 한글인지 아니면 영문, 숫자, 기호인지 구분한다. 조합형: 예9.5) ‘김’을 초,중,종성으로 각 5비트씩 나누어 표현한다. 완성형: 예9.6) ‘김’을 하나의 값으로 표현한다. 현재 윈도우즈에서는 확장완성형 코드를 사용한다. 유니코드(unicode): 하나의 코드로 모든 언어를 나타낼 수 있도록 만든 코드를 말한다. 12/30 12/30


명령어 집합 설계 – 피연산자의 유형(펜티엄) 펜티엄은 8 비트(바이트), 16 비트(워드), 32 비트(doubleword), 64 비트(quadword) 데이터를 다룰 수 있다. 워드는 짝수 번지에 정렬될 필요가 없다. 자유롭게 사용할 수 있다. 펜티엄에서 제공되는 데이터 타입 일반: 8, 16, 32, 64 비트 이진 데이터 정수: 8, 16, 32, 64 비트, 2의 보수 사용 부호없는 정수: 8, 16, 32, 64 비트 unpacked BCD: 0부터 9까지의 수를 한 바이트로 표현 packed BCD: 0부터 99까지를 한 바이트로 표현 near pointer: 32 비트 주소 정보 비트 필드: 각 비트를 독립 요소로 사용하는 데이터로 32 비트까지 사용할 수 있음 바이트 문자열: 연속된 일련의 바이트(워드, doubleword, quadword) 데이터로 232-1 바이트까지 사용할 수 있음.

13/30 13/30

명령어 집합 설계 – 피연산자의 유형(펜티엄) 부동소수점 수: IEEE 754 표준 사용 single precision: 1/8/23 double precision: 1/11/52 double extended precision: 1/15/64 double extended precision에서는 함축된 가수 비트가 없다. 펜티엄은 little-endian 형태로 수를 저장한다. 예9.7) 32 비트로 정수 28910(28+25+20) big-endian: 00 00 01 2116 little-endian: 21 01 00 0016

14/30 14/30


명령어 집합 설계 – 연산의 종류 전형적인 컴퓨터의 연산의 종류 데이터 이동 산술 논리 변환(conversion) 변환 연산이란 형식을 바꾸거나 형식을 조작하는 연산을 말한다. 예9.8) BCD 코드를 일반 2진수 코드로 변환 입출력 시스템 제어: 특정한 권한이 있는 경우에만 실행할 수 있는 명령어 제어의 이동

15/30 15/30

명령어 집합 설계 – 연산의 종류(데이터 이동) 데이터 이동에 필요한 파라미터: 소스, 목적지, 데이터의 길이 이동의 종류 레지스터에서 레지스터 (MOVE) 레지스터에서 주기억장치 (STOR) 주기억장치에서 레지스터 (LOAD) CPU의 행동 측면에서는 가장 단순한 연산이다

16/30 16/30


명령어 집합 설계 – 연산의 종류(산술) 사칙 연산은 기본적으로 제공 보통 다음과 같은 단항 연산을 제공 절대값 부정: 피연산자의 부호 변경 증가: 피연산자의 값을 1 증가 감소: 피연산자의 값을 1 감소

17/30 17/30

명령어 집합 설계 – 연산의 종류(논리) 제공하는 기본 논리 연산의 종류 예9.9) R1=10100101, R2=00001111 논리부정 (NOT): NOT(R1)=01011010 논리곱 (AND): (R1)AND(R2)=00000101 마스킹(masking) 할 때 많이 사용한다. 마스킹이란 특정 비트들만 추출하는 것으로 이를 위해 추출할 비트의 위치는 1로 논리곱을 하고 나머지는 0으로 논리곱을 한다. 논리합 (OR): (R1)OR(R2)=10101111 배타적 논리합 (XOR): (R1)XOR(R2)=10101010 어떤 수를 모두 0으로 XOR하면 그 수가 되고, 모두 1로 XOR하면 논리부정과 같은 결과가 된다.

18/30 18/30


명령어 집합 설계 – 연산의 종류(논리) 이동과 관련된 연산의 종류 예9.11) 1001 1001 논리 왼쪽 이동(shift): 0011 0010 논리 오른쪽 이동: 0100 1100 방향으로 한 비트씩 이동한다. 이 때 양끝에 있는 것 중 하나는 손실되며, 다른 끝은 0으로 채워진다. 산술 왼쪽 이동: 1011 0010 산술 오른쪽 이동: 1100 1100 논리 이동과 동일하게 이동하되 부호 비트는 원래 비트 값으로 채운다. 왼쪽 회전(rotate): 0011 0011 오른쪽 회전: 1100 1100 밖으로 이동해 나가는 비트로 반대쪽 끝을 채운다.

19/30 19/30

명령어 집합 설계 – 연산의 종류(논리) 한 비트 산술 왼쪽 이동은 2를 곱한 효과와 같으며, 한 비트 오른쪽 산술 이동은 2로 나눈 효과와 같다. 예9.12) 0100 0110 = 70 (2의 보수) 왼쪽 산술 이동: 0000 1100 = 12 오른쪽 산술 이동: 0010 0011 = 35 왼쪽 논리 이동: 1000 1100 = -116 오른쪽 논리 이동: 0010 0011 = 35 예9.13) 1100 0110 = -58 (2의 보수) 왼쪽 산술 이동: 1000 1100 = -116 오른쪽 산술 이동: 1110 0011 = -29 왼쪽 논리 이동: 1000 1100 = -116 오른쪽 논리 이동: 0110 0011 = 99 20/30 20/30


명령어 집합 설계 – 연산의 종류(논리) 예9.12) 주기억장치의 한 워드(16 비트)를 장치에 한 바이트씩 전달해야 하는 경우 단계 1. 워드를 레지스터에 적재 단계 2. 1111111100000000으로 AND 단계 3. 8 비트 오른쪽 이동 단계 4. 데이터 버스로 전달하면 입출력 모듈은 하위 8 비트를 읽고, 입출력을 수행 단계 5. 워드를 레지스터에 적재 단계 6. 0000000011111111으로 AND 단계 7. 데이터 버스로 전달하면 입출력 모듈은 하위 8 비트를 읽고, 입출력을 수행 이런 논리 연산은 산술 연산과 마찬가지로 ALU에서 수행.

21/30 21/30

명령어 집합 설계 – 연산의 종류(제어의 이동) 프로그램의 실행 순서를 바꾸는 연산으로 무조건 이동, 조건부 이동, 함수 호출 등으로 분류할 수 있다. 이들 연산은 프로그램 카운터 레지스터의 값을 변경한다. 제어의 이동이 필요한 이유 명령어를 반복 수행 조건에 따른 수행 모듈화 분기 명령(branch instruction) 대부분의 분기 명령어는 조건부 명령어이다. 즉, 어떤 특정 조건이 만족될 때에만 특정 위치에 있는 명령어를 실행하고, 나머지 경우에는 다음 명령어를 수행한다. 분기는 앞으로(상위 주소), 뒤로(하위 주소) 모두 가능하다.

22/30 22/30


명령어 집합 설계 – 연산의 종류(제어의 이동) 대부분의 기계는 연산의 결과에 대한 상태를 나타내기 위한 1 비트 또는 다중 비트 조건부 코드를 제공한다. 예9.13) 보통 산술의 결과는 2 비트 조건부 코드를 이용하여 결과가 0, 양수, 음수, 넘침 네 가지 조건을 나타낸다. 이 경우에는 다음과 같은 분기 명령어를 제공할 수 있다. BRP X: 결과가 양수이면 X로 분기. BRN X: 결과가 음수이면 X로 분기. BRZ X: 결과가 0이면 X로 분기. BRO X: 넘침이 발생하였으면 X로 분기. 예9.14) 3-주소 형식의 명령어의 경우에는 비교와 분기를 하나의 명령어로 제공할 수 있다. BRE R1, R2, X R1과 R2를 비교하여 같으면 X로 분기하라

23/30 23/30

명령어 집합 설계 – 연산의 종류(제어의 이동) skip 명령어: 바로 다음 명령어를 하나 건너뛴다. 이 명령어는 주소를 명시할 필요가 없으므로 건너뛰는 것 이외에 다른 기능도 수행하는 경우가 많다. 예9.15) ISZ (increment-and-skip-if-zero) 301 … 309 ISZ R1 310 BR 301 311 … R1에 반복하고 싶은 값의 음수를 설정한다. 루프를 한 번 수행할 때마다 R1 값을 하나 증가시키고, 증가된 결과 값이 0이면 다음 명령어를 건너뛰고 0이 아니면 다음 명령어를 수행 한다.

24/30 24/30


명령어 집합 설계 – 연산의 종류(프로시저 호출) 프로시저를 사용하는 이유 경제성: 일련의 코드를 여러 번 사용하기 위해 모듈화: 큰 작업을 여러 개의 작은 작업으로 나누기 위해 프로시저 메커니즘을 위해 제공되는 두 가지 명령어 호출 명령어: 프로시저의 위치로 분기하는 명령어 복귀 명령어: 프로시저의 실행이 끝나고 호출한 위치로 되돌아올 때 사용하는 명령어 프로시저는 아무 곳에서나 호출할 수 있다. 프로시저 내에 프로시저 호출이 있을 수 있다. 각 프로시저 호출은 대응되는 복귀가 있다.

25/30 25/30

명령어 집합 설계 – 연산의 종류(프로시저 호출) 프로시저를 실행한 다음에 호출한 위치로 복귀하기 위해서는 복귀 주소 를 보관해야 한다. 방법 1. 레지스터: 복귀 주소를 보관하는 전용 레지스터 사용 방법 2. 프로시저 호출의 시작 위치 방법 3. 스택 (FILO 구조) 방법 1과 방법 2를 사용하면 재진입(reentrant) 프로시저 접근 방법을 사용할 수 없다. 재진입 프로시저란 한 프로시저에 대한 여러 호출이 동시에 진행 중일 수 있는 경우를 말한다. 재귀 프로시저가 대표적인 예이다. 따라서 스택 방법을 현재 가장 널리 사용한다.

26/30 26/30


명령어 집합 설계 – 연산의 종류(프로시저 호출) 스택은 순서가 있는 요소들의 집합이며, 한 번에 한 요소만 접근할 수 있다. 이 때 접근하는 위치를 스택의 top이라 한다. 스택은 push, pop 두 개의 연산만을 사용한다. push는 top에 하나의 요소를 추가하며, pop은 top에 있는 요소를 하나 제거한다. 예9.16) 스택의 사용 main의 시작 주소: 4000 main 내에서 proc1의 호출 위치: 4100 proc1의 시작 주소: 4500 proc1 내에서 proc2의 호출 위치: 4600, 4650 proc2의 시작 주소: 4800

27/30 27/30

명령어 집합 설계 – 연산의 종류(프로시저 호출) 스택은 복귀 주소뿐만 아니라 매개변수의 전달과 복귀 값을 받기 위해서도 사용한다.

28/30 28/30


명령어 집합 설계 – 연산의 종류(프로시저 호출) 스택은 주기억장치에 구현되며, 보통 다음과 같은 세 개의 레지스터를 이용한다. 스택 포인터: 스택의 top을 가리키는 포인터 스택 기저 레지스터: 스택의 bottom을 가리키는 포인터 스택 한계 레지스터: 스택을 위해 예약되어 있는 주소 공간의 끝을 가리키는 포인터

29/30 29/30

명령어 집합 설계 – 연산의 종류(프로시저 호출) 전통적으로 스택은 스택의 기저를 스택을 위해 예약되어 있는 주소 공간의 최상위 주소로 사용하며 한계는 그 공간은 최하위 주소를 사용 한다. 즉, 스택은 상위 주소에서 하위 주소로 채워진다. 스택 작업을 빠르게 하기 위해 스택의 첫 두 요소는 별도의 레지스터에 저장하는 경우도 있다.

30/30 30/30


©copyright 2006

컴퓨터구조(INA210) 강의노트 10

명령어 집합: 주소 지정 모드와 형식 한국기술교육대학교 정보미디어공학부 김상진

교육목표 명령어 내에 연산의 피연산자를 직접 가질 수도 있고, 피연산자가 저장되어 있는 주소를 가질 수도 있다. 이 때 주소는 다양한 형태를 해석될 수 있으며, 해석하는 방법을 주소지정 모드라 한다. 명령어 형식

2/20


주소 지정 명령어 형식에 있는 주소 필드는 상대적으로 작다. 따라서 지정할 수 instruction 있는 위치가 제한된다. instruction R 주소 지정 방법의 종류 R register

instruction

즉치(immediate)

operand

instruction

레지스터

memory

operand register

operand

instructioon

A

A

레지스터 간접 instructioon

operand

operand implicit memory

직접(direct)

memory

간접(indirect)

top of stack (register)

스택 변위(displacement) 3/20

주소 지정 – 계속 표기법 A: 명령어의 주소 필드에 있는 내용 R: 시스템 내에 있는 레지스터의 이름(번호) [R]: 레지스터 R에 있는 내용 M(X): 주소기억장치의 X 위치에 있는 내용 EA: 유효 주소(effective address)라 하며, 참조하는 피연산자가 실제로 있는 주소이다. 모든 컴퓨터는 대부분 하나 이상의 주소 지정 모드를 제공한다. 모드의 구분은 연산 코드에 의해 결정되거나 명령어 형식에 모드 필드를 추가하여 구분한다. 가상기억장치 기법을 사용하는 경우에 유효 주소는 가상기억장치 주소 또는 레지스터이고, 사용하지 않는 경우에 유효 주소는 기억장치 주소 또는 레지스터이다.

4/20


즉치 주소지정 이 주소지정 모드에서는 피연산자가 명령어에 포함된다. 전형적으로 2의 보수 형태의 정수를 사용하며, 이 값이 추출되어 데이터 레지스터에 적재되면 부호 비트가 왼쪽으로 확장되어 레지스터 크기만큼의 수로 표현된다. 장점. 주기억장치 참조가 필요 없다. 단점. 수의 크기가 주소 필드의 크기로 제한된다. 보통 컴퓨터의 워드 크기보다 작다. instruction operand

5/20

직접 주소지정 이 주소지정 모드에서는 피연산자의 유효 주소가 명령어에 포함된다. 초창기 모델에서는 많이 사용되었지만 현재는 거의 사용되지 않고 있다. 장점. 한 번의 주기억장치 접근만 필요하며, 추가적인 계산이 필요 없다. 단점. 지정할 수 있는 위치의 수가 주소 필드의 크기로 제한된다. instruction A

operand

memory

6/20


간접 주소지정 이 주소지정 모드에서 주소 필드는 주기억장치의 한 워드를 가리키며, 이 워드는 실제 피연산자가 저장되어 있는 주소를 가리킨다. 장점. 워드가 n 비트이면 총 2n의 위치를 가리킬 수 있다. 주소 필드의 크기가 m이면 한 번에 2m 위치만 참조할 수 있다. 보통 프로세스의 첫 페이지에 필요한 실제 주소를 기록해 놓는다. 단점. 피연산자를 접근하기 위해서는 두 번의 주기억장치 접근이 필요 하다. instructioon 이것의 변형으로 다단계 간접 주소지정 모드가 있다. A 이 모드에서는 워드의 한 비트를 간접 플래그(flag)로 사용하며, 이 값이 1이면 operand 다시 이 워드를 참조해야 한다. 단점. 단계가 깊어질 수록 피연산자를 얻기 위한 주기억장치 참조가 많아지게 된다. memory

7/20

레지스터 주소지정 이 주소지정 모드에서 주소 필드는 CPU 내의 특정 레지스터를 가리키며, 이 레지스터에 피연산자가 적재되어 있다. 이 경우 3 또는 5 비트 정보를 주소 필드로 사용한다. 따라서 8에서 32 개의 레지스터를 참조할 수 있다. 장점 주소 필드의 크기가 작다. instruction R 주기억장치 참조가 필요 없다. 한 번 사용된 레지스터에 적재된 데이터를 여러 번 사용할 경우에만 효과가 있다. operand 단점 register 주소 공간이 매우 제한적이다.

8/20


레지스터 간접 주소지정 이 주소지정 모드에서 주소 필드는 CPU 내의 특정 레지스터를 가리키며, 이 레지스터에 피연산자가 적재되어 있는 주기억장치의 주소가 있다. 장점 주소 필드의 크기가 작다. 주기억장치 참조가 간접 주소지정보다 하나 적다. 주소 공간이 명령어 주소 필드 크기에 제한 받지 않는다. instruction R

register memory

operand

9/20

변위 주소지정 이 주소지정 모드는 직접 주소지정 모드와 레지스터 간접 주소지정 모드를 결합한 방식이다. 이 주소지정 방식은 보통 두 개의 주소 필드를 사용한다. 이 중 하나는 직접 사용되며, 다른 하나는 레지스터를 가리킨다. 만약 고정된 레지스터를 사용하거나 연산 코드마다 지정된 레지스터가 있으면 이 필드는 명백하게 명령어 나타내지 않고 사용될 수 있다. 직접 사용되는 값이 A이면 유효 주소는 레지스터에 있는 값에 A를 더하여 구하게 된다.

10/20 10/20


변위 주소지정 – 계속 상대 주소지정 방식 현재 PC값에서 상대적으로 A만큼 떨어진 상위 또는 하위 주소가 유효 주소가 된다. 기저 레지스터 주소지정 방식 기저 레지스터가 가르키는 주소에서 A만큼 떨어진 상위 주소가 유효 주소가 된다. 주기억장치 관리 기법 중 세그먼테이션 (segmentation)을 구현하기 위해 사용된다. 색인 방식 기저 레지스터 주소지정 모드의 정반대로 A가 기저가 되고 레지스터에 있는 값이 기저로부터의 변위가 된다. 이 때 레지스터는 보통 색인 레지스터라 한다. 예10.1) 배열 조작: A가 배열의 시작 주소, 레지스터에는 색인 색인 레지스터 값을 자동으로 증가 또는 감소해주는 CPU도 있다. 이 경우에는 자동 색인 방식이라 한다. EA = A + [R]; [R] = [R]+1 11/20 11/20

변위 주소지정 – 계속 색인 방식과 간접 주소 방식을 결합하여 사용하는 경우도 있다. 사후 색인 방식(postindexing) EA = M(A)+[R] 사전 색인 방식(postindexing) EA = M(A+[R])

12/20 12/20


스택 주소지정 스택은 주기억장치의 특정 영역에 예약되어 있으며, 스택을 조작하기 위한 정보(스택 포인터, 기저, 한계)가 레지스터에 적재되어 있다. 따라서 명령어에는 주소를 명백하게 나타낼 필요가 없다. 스택 조작을 빠르게 처리하기 위해 스택의 첫 두 요소를 레지스터에 유지하는 경우도 있다.

instructioon

implicit

top of stack (register)

13/20 13/20

펜티엄의 주소지정 모드 모드

알고리즘

비고

즉치

Operand = A

레지스터

LA = R

변위

LA = (SR)+A

기저

LA = (SR)+(B)

기저 변위

LA = (SR)+(B)+A

구조체 접근

확장 색인 변위

LA = (SR)+(I)±S+A

배열 접근할 때 사용

기저 색인 변위

LA = (SR)+(B)+(I)+A

배열 접근할 때 사용

기저 확장색인 변위

LA = (SR)+(B)+(I)±S+A

상대

LA = (PC)+A

32, 16, 8 비트 레지스터 제공

SR: 세그먼트 레지스터(segment register) B: 기저 레지스터(base register) I: 색인 레지스터 S: 확장 요소 LA는 선형 주소(linear address)이다. 펜티엄은 주기억장치 관리 기법 중 페이징(paging) 기법을 사용하므로 LA는 페이징 번역 메커니즘에 의해 유효 주소로 번역된다. 14/20 14/20


명령어 형식 – 명령어 길이 명령어를 강력하게 만들기 위해서는 길이가 길어야 하지만 저장 공간을 절약하기 위해서는 길이가 짧을 수록 좋다. 명령어의 종류가 많으면 프로그래머의 작업은 쉬워지고, 프로그램의 크기가 작아진다. 프로그래머는 또한 다양한 주소 지정 모드가 제공되길 원하며, 보다 큰 주소 공간을 접근할 수 있기를 원한다. 명령어의 길이가 길면 낭비되는 것이 많을 수 있다. 일반적으로 명령어의 길이는 시스템의 워드 길이와 같으며, 이 워드 길이는 문자 길이의 배수가 되어야 한다. 만약 문자 길이의 배수가 되지 않으면 문자들을 워드 단위로 전송할 때 낭비되는 공간이 생긴다.

15/20 15/20

명령어 형식 – 비트의 할당 보다 많은 종류의 명령어를 제공하기 위해서는 연산 코드를 위해 할당 되는 비트의 수가 증가해야 한다. 가변 길이의 연산 코드를 사용하는 경우도 있다. 이 경우 최소 길이가 정해져 있으며, 이 길이 내에 저장되어 있는 값에 따라 연산 코드의 길이가 정해진다. 작은 길이의 연산 코드를 사용할 경우에는 보다 많은 비트를 주소 필드로 사용할 수 있다.

16/20 16/20


명령어 형식 – 비트의 할당 주소 필드의 길이를 결정하게 되는 요소 요소 1. 제공하는 주소지정 모드의 종류: 어떤 연산들은 주소지정 모 드가 고정되어 있을 수 있다. 하지만 많은 경우에는 주소지정 모드를 구분하기 위한 필드가 필요하다. 요소 2. 피연산자의 수: 오늘날 전형적인 명령어는 두 개의 피연산자 를 명령어에 나타낸다. 이 경우에는 각 피연산자마다 주소지정 모드 를 위한 필드가 필요할 수 있다. 요소 3. 레지스터 vs. 주기억장치: 피연산자로 레지스터를 사용하면 적은 수의 비트만으로 나타낼 수 있다. 보통 8에서 32개의 사용자 접 근 가능 레지스터(user-visible register)를 제공하므로 최대 5 비트 만 필요하다. 요소 4. 레지스터 집합의 개수: 전체 레지스터를 집합별로 분류하여 관리하면 보다 적은 수의 비트를 사용하여 나타낼 수 있다. 예를 들어 32개의 레지스터를 4개의 집합으로 나누어 관리하고, 연산 코드가 집합을 결정하면 피연산자를 지정하기 위해 3 비트만 필요하다.

17/20 17/20

명령어 형식 – 비트의 할당 주소 필드의 길이를 결정하게 되는 요소(계속) 요소 5. 접근 가능한 주소 범위: 직접 주소지정 모드를 사용하면 주소 필드의 길이가 접근할 수 있는 주소 범위를 결정한다. 이것은 너무 제 한적이라 직접 주소지정 모드는 거의 사용되지 않는다. 변위 주소지 정 모드를 사용하더라 주소 필드의 길이가 기저에서 가능한 변위를 결정하게 된다. 따라서 길이가 길수록 보다 큰 변위를 나타낼 수 있다. 요소 6. 주소의 세분화(granularity): 워드 단위 또는 바이트 단위를 사용한다. 바이트 단위를 사용하면 더 많은 비트가 필요하다.

18/20 18/20


명령어 형식 – 가변 길이의 명령어 보통 고정된 길이의 명령어를 사용한다. 하지만 가변 길이의 명령어를 사용하는 경우도 있다. 가변 길이의 명령어를 사용하면 유연한 주소 지정 모드를 사용할 수 있으며, 다양한 종류의 명령을 보다 경제적으로 표현할 수 있다. 하지만 가변 길이의 명령어를 사용하면 프로세서가 복잡해진다. 가변 길이의 명령어를 사용할 경우에는 다음에 인출할 명령어의 길이를 미리 예측할 수 없으므로 가장 길이가 긴 명령어의 크기만큼의 워드를 인출한다. 따라서 한 번 인출에 여러 명령어를 인출하는 경우가 발생한다.

19/20 19/20

펜티엄 명령어 형식

20/20 20/20


©copyright 2006

컴퓨터구조(INA210) 강의노트 11

프로세스의 조직과 기능

한국기술교육대학교 정보미디어공학부 김상진

교육목표 레지스터 조직 사용자 접근 가능 레지스터 vs. 제어와 상태 레지스터 명령어 주기에서 데이터 흐름 명령어 파이프라이닝 기법

2/27


프로세서 조직 CPU가 하는 일의 종류 명령어 인출 명령어 해석 데이터 인출: 인출 주기억장치 또는 입출력 장치로부터 데이터 읽기 데이터 처리 데이터 쓰기: 쓰기 결과를 주기억장치 또는 입출력 장치에 저장 CPU의 구성요소 산술논리 연산장치: 데이터 처리 레지스터: CPU내의 일시적인 데이터 저장소 제어장치: 데이터와 명령어의 이동을 제어하며, ALU의 동작을 제어한다. 컴퓨터는 CPU, 입출력, 주기억장치, 상호연결로 구성되어 있으며, CPU는 제어장치, ALU, 레지스터, 상호연결로 구성되어 있다.

3/27

레지스터 조직 레지스터는 크게 두 종류로 분류된다. 사용자 접근가능 레지스터: 레지스터 어셈블리 프로그래머가 직접 사용할 수 있는 일반 레지스터이다. 이것의 사용을 최적화하면 주기억장치 참조를 최소화할 수 있다. 고급 프로그래밍 언어를 사용하는 프로그래머는 컴파일러 레지스터의 사용을 최적화 해줄 것으로 기대한다. 제어와 상태 레지스터: 레지스터 CPU의 동작을 제어하기 위해 제어장치가 사용하는 레지스터이다. 특권을 가지는 운영체제 프로그램은 프로그램의 실행을 제어하기 위해 이들 레지스터를 사용한다. 이것이 답이라고 인정되는 레지스터 조직 방법은 아직 없다. 즉, 프로세서마다 다양한 형태로 레지스터를 조직한다. 호환성을 위해 레지스터를 조직하는 방법이 제한될 수 있다.

4/27


사용자 접근가능 레지스터 사용자 접근가능 레지스터의 분류 범용 레지스터: 레지스터 여러 가지 용도로 사용할 수 있는 레지스터 주소지정을 할 때 사용되는 경우도 있다. 예11.1) 레지스터 간접 주소지정 데이터 레지스터: 레지스터 주소지정에 사용될 수 없는 레지스터 주소 레지스터: 레지스터 범용적으로 사용되는 주소 레지스터도 있지만 다음 과 같이 특정 주소지정 모드를 위해 예약되어 있는 레지스터도 있다. 세그먼트 레지스터: 세그먼트의 기저를 가리킨다. 색인 레지스터: 색인 주소지정 방법에서 색인값을 유지하며, 자동 색인기법을 사용할 수 있다. 스택 포인터: 스택의 톱을 가리킨다. 조건부 코드 일반적으로 프로그래머는 조건부 코드의 내용을 읽을 수 있지만 변경할 수는 없다.

5/27

사용자 접근가능 레지스터 – 계속 설계 쟁점 전용과 범용 전용으로 사용되는 레지스터는 명령어에 이것을 포함할 필요가 없다. 전용 레지스터가 많으면 프로그래머의 유연성을 제한하게 된다. 레지스터의 수: 수가 많을 수록 주기억장치 참조를 줄일 수 있다. 수가 많을 수록 이것을 구별하기 위한 많은 비트가 필요하다. 레지스터의 크기: 크기 전체 주소를 나타낼 수 있어야 한다. 함수 호출의 경우 복귀하여 나머지 프로그램을 계속 수행하기 위해 호출될 때 모든 범용 레지스터 값을 보관한 다음에 복귀할 때 복원해 주는 컴퓨터도 있다. 이런 보관과 복구는 CPU가 자동으로 해주는 경우도 있고, 프로그래머가 직접 해야 하는 경우도 있다.

6/27


제어 레지스터 제어 레지스터는 보통 사용자가 접근할 수 없다. 제어 레지스터의 종류(PC, IR, MBR, MAR) 프로그램 카운터: 카운터 다음에 실행할 명령어의 주소를 가지고 있다. 명령어 레지스터: 레지스터 가장 최근에 인출한 명령어를 가지고 있다. 주기억장치 버퍼 레지스터: 레지스터 주기억장치에 쓸 또는 가장 최근에 주기억장치로부터 읽은 데이터를 가지고 있다. 주기억장치 주소 레지스터: 레지스터 주기억장치에 데이터를 쓸 위치 또는 주기억장치로부터 데이터를 읽을 위치를 가지고 있다.

7/27

상태 레지스터 CPU는 PSW(Program Status Word)라고 하는 상태 레지스터 또는 상태 레지스터의 집합을 유지한다. PSW에 유지되는 필드는 다음과 같다. 부호(sign): 산술 연산의 결과의 부호비트로 설정된다. 부호 영(zero): 산술 연산의 결과가 0이면 설정된다. 자리올림(carry): 자리 올림이 발생하면 설정된다. 자리올림 같음(equal): 논리적 비교가 같을 경우에 설정된다. 같음 넘침(overflow): 산술 연산의 결과 넘침이 발생되면 설정된다. 넘침 인터럽트 허용/금지: 금지 인터럽트를 일시적으로 금지하기 위해 사용한다. 슈퍼바이저(supervisor): 사용자 모드와 슈퍼바이저 모드를 슈퍼바이저 구분하기 위해 사용된다.

8/27


상태 레지스터 – 계속 설계 쟁점 운영체제를 지원해주기 위한 여러 가지 상태 레지스터를 제공 스택과 관련된 연산을 지원하기 위한 레지스터 페이징을 지원하기 위한 레지스터 인터럽트 벡터 테이블을 지원하기 위한 레지스터 모든 상태 정보를 레지스터에 유지할 수 없다. 따라서 설계자는 어떤 종류의 정보를 레지스터에 유지하고 어떤 종류의 정보를 주기억장치에 유지할지 결정해야 한다.

9/27

명령어 주기 명령어 주기의 구성요소 인출 fetch 실행 인터럽트 interrupt indirect 명령어를 실행하기 위해서는 하나 이상의 피연산자를 주기억장치로부터 인출해야 execute 하는 경우가 있다. 또한 간접 주소지정 방법의 경우에는 추가적인 주기억장치 접근이 필요하다. 간접 주소지정을 통한 피연산자의 인출을 별도의 주기로 간주하면 명령어 주기는 네 가지 구성요소를 가진다고 할 수 있다.

10/27 10/27


명령어 주기 indirection

indirection

operand store

operand fetch

instruction fetch

multiple operands

instruction address calculation

operand address calculation

instruction operation decoding

multiple results

operand address calculation

data operation

interrupt

no interrupt

return for string or vector data

instruction complete, fetch next instruction

interrupt check

11/27 11/27

데이터의 흐름 인출 주기에서의 데이터 흐름 2 PC

MAR

3 4

1

control unit

1

2 memory

7 IR

6 5

MBR

address bus

data bus

control bus

1, 2. PC에 다음에 인출할 명령어 주소가 있다. 제어장치는 PC에 있는 주소를 MAR로 옮긴다. 1, 2. 제어버스를 통해 주기억장치에 읽기 명령을 전달한다. 3, 4. MAR에 있는 주소는 주소 버스를 통해 주기억장치에 전달된다. 5, 6. 주기억장치는 전달받은 주소에 있는 명령어를 데이터 버스에 적재하며, 이 명령어는 MBR에 복사된다. 7. MBR에 복사된 명령어는 IR로 이동되며, 이 과정에서 PC 값은 1 증가한다.

12/27 12/27


데이터의 흐름 간접 주기에서의 데이터 흐름 MAR

2 4

control unit

2

memory

6

1

3

MBR

5

address bus

data bus

control bus

인출 사이클이 완료되면 제어장치는 간접 주소지정 방식을 사용한 연산자가 있는지 확인한다. 1. MBR에 있는(명령어에 포함된) 간접 주소를 MAR로 옮긴다. 2. 제어장치는 주기억장치에 읽기 명령어를 제어버스를 통해 ���달한다. 또한 MAR에 있는 주소가 주소 버스를 통해 주기억장치로 전달된다. 5. 주기억장치는 전달된 주소 있는 주소를 데이터 버스를 통해 CPU로 전달한다. 6. MBR에 실제 피연산자가 있는 주소가 복사된다.

13/27 13/27

데이터의 흐름 인터럽트 주기에서의 데이터 흐름 PC

MAR

2 4 1

1

control unit

1

2 memory

2 3

MBR

address bus

data bus

4

control bus

인터럽트를 처리한 후에 중단된 위치부터 다시 프로그램을 실행하기 위해서는 PC 값을 보관해야 한다. 1,2. PC를 보관하기 위해 PC의 내용을 MBR로 이동한다. 또한 PC를 보관할 주소를 MAR로(스택포인터) 이동하며, 제어장치는 주기억장치에 쓰기 명령어를 전달한다. 3. MBR의 주소 정보가 데이터 버스를 통해 주기억장치로 전달된다. 4. 주기억장치는 MAR로 보내진 주소 위치에 데이터 버스를 통해 전달된 다음 명령어 주소 값을 저장한다.

14/27 14/27


명령어 파이프라이닝 명령어 파이프라인(instruction pipelining) 기법은 공장의 파이프라인 생산라인과 같은 원리이다. 제품 생산의 여러 단계를 동시에 이루어질 수 있듯이 명령어 수행의 여러 단계를 중첩시킬 수 있다. 단순 접근 방법: 명령어 주기를 인출과 실행 두 단계로 나누어 실행 중에 주기억장치 접근을 하지 않으면 다음 명령어를 버퍼에 인출한다. 한 명령어의 실행과 다음 명령어의 인출을 동시에 하는 것이다. 이렇게 하는 것을 명령어 선인출(instruction prefetch) 또는 인출 선인출 중첩(fetch overlap)이라 한다. 명령어 선인출이 명령어 실행 속도를 두 배로 증가시키지 못하는 이유 실행시간은 보통 인출시간보다 길다. 조건부 분기는 다음에 인출할 명령어의 위치를 바로 알 수 없으므로 바로 선인출할 수 없고 다음 명령어의 위치를 알게 될 때까지 기다려야 한다. 이 시간은 예측을 통해 단축할 수 있다. 즉, 바로 다음 명령어를 우선 인출하며, 예측을 잘못하였을 경우에만 다시 인출해야 한다. 15/27 15/27

명령어 파이프라이닝 성능을 보다 향상시키기 위해서는 보다 많은 단계로 명령어를 세분화해야 한다. 명령어 인출(FI): 다음 명령어를 버퍼에 저장 명령어 해석(DI): 명령어의 연산코드와 피연산자 지정자를 결정한다. 피연산자 주소 계산(CO): 각 소스 피연산자의 유효주소를 계산한다. 피연산자 인출(FO): 피연산자가 레지스터에 있으면 주기억장치 접근이 필요없다. 명령어 실행(EI): 명령어를 실행한다. 결과 쓰기(WO): 연산의 결과를 주기억장치에 쓴다. 이렇게 나누면 각 단계의 소요시간이 어느 정도 비슷해진다. 우선 같다고 가정하자. 파이프라인 기법을 사용하지 않고 9개의 명령어를 순차적으로 실행하는데 총 54단계가 필요하다. 만약 각 단계를 항상 중첩할 수 있다고 가정하면 14단계만 필요하다.

16/27 16/27


명령어 파이프라이닝

17/27 17/27

명령어 파이프라이닝 이에 대한 몇 가지 지적 명령어마다 필요한 단계의 수가 다르다. 예11.2) LOAD 명령어는 WO 단계가 필요 없다. 모든 단계를 중첩할 수 없다. 예11.3) 실제 FI, FO, WO는 모두 주기억장치 접근이 필요하다. 캐시까지 고려하면 더 복잡하다. 각 단계마다 필요한 시간이 다르면 기다려야 하는 경우가 발생한다. 조건부 분기에서 예측을 잘못하면 인출한 것을 버리고 다시 인출해야 하는 경우가 발생한다. 조건부 명령 이후 명령어 중 예측을 잘못하여 실행한 모든 것은 버려야 한다. 이전 명령어에 의해 변경될 수 있는 값을 미리 사용하면 일관성이 깨질 수 있다.

18/27 18/27


분기를 예측하지 못한 경우 성능저하 명령 3은 명령 15로 분기하라는 명령어일 경우

19/27 19/27

명령어 파이프라이닝 파이프라인 기법의 설계 고려사항 단계가 많아지면 많아질수록 단계 간에 데이터 교환에 소요되는 시간이 많아진다. 단계가 많아지면 많아질수록 파이프라인을 유지하기 위한 추가회로가 복잡해진다. 파이프라인 기법은 성능 향상을 위한 매우 강력한 기법이지만 최적의 결과와 적절한 복잡성을 얻기 위해서는 신중한 설계가 요구된다.

20/27 20/27


파이프라인의 성능 파이프라인의 주기 시간 τ: 명령어들이 파이프라인 한 단계를 통과하는데 소요되는 시간 τ = τm+d τm: 가장 긴 소요시간이 필요한 단계 d: 한 단계에서 다음 단계를 실행하는데 소요되는 시간 보통 τm >> d이다. 분기가 없는 경우 k개의 단계로 구성된 파이프라인으로 n개의 명령어를 수행하는데 소요되는 시간 Tk,n = [k+(n-1)]τ 파이프라인을 사용하지 않는 경우: nkτ 비율: nkτ/[k+(n-1)]τ 이상적인 경우 대략 k배 속도 향상을 얻을 수 있다.

21/27 21/27

분기의 처리 방법 1. 다중 스트림 이 방법은 분기의 두 곳 모두를 인출하여 실행하는 것이다. 문제점 다중 파이프라인을 사용하면 레지스터와 주기억장치에 대한 더 많은 경쟁이 발생한다. 한 분기가 끝나기도 전에 또 다른 분기가 발생할 수 있다. 방법 2. 분기 목적지의 선인출 다중 스트림 방법과 마찬가지로 두 곳 모두 인출하지만 한 곳만 우선 실행한다.

22/27 22/27


분기의 처리 – 계속 방법 3. 루프 버퍼 루프 버퍼: 가장 최근에 인출한 n개의 명령어를 유지하는 작은 고성능 기억장치이다. 루프 버퍼의 장점 선인출을 사용하므로 이 버퍼에는 현재 명령어 인출 주소보다는 뒤에 있는 몇 개의 명령어들을 저장하고 있다. 따라서 기억장치 접근 없이 버퍼에서 명령어를 인출하여 사용할 수 있다. 가까운 곳으로 분기되는 경우에는 버퍼에서 목적 명령어를 인출 할 수 있다. 루프 버퍼가 어떤 루프를 구성하는 모든 명령어를 수용할 수 있으면 루프를 반복하는 동안에 주기억장치 접근이 필요 없게 된다.

23/27 23/27

분기 예측 널리 사용되는 분기 예측 방법 방법 1. 분기가 항상 일어나지 않을 것으로 예측 방법 2. 분기가 항상 일어날 것으로 예측 방법 3. 연산코드에 의한 예측 방법 4. 분기 역사 스위치를 사용 방법 5. 분기 역사 테이블 보통 분기하기로 결정하였으면 분기 위치가 결정될 때까지 기다려야 한다. 방법 1, 2, 3은 분기마다 예측이 고정되어 있는 정적 분기 방법이다. 프로그램의 행위를 분석한 결과 조건부 분기의 50%이상이 분기하는 것으로 발표되어 있다. 따라서 같은 비용이라면 방법 1보다 방법 2가 더 좋다. 그러나 페이징 환경에서는 분기는 페이지 결함이 발생할 수 있으므로 잘못된 예측은 추가적인 손해가 있을 수 있다.

24/27 24/27


분기 예측 – 계속 방법 3은 분기 명령어에 따라 결정하는 방법이다. 이 방법의 성공률이 75%이상인 것으로 발표되어 있다. 방법 4와 5는 분기마다 다른 예측을 할 수 있는 동적 분기 방법이다. 동적 분기 방법은 프로그램 내에 있는 분기의 역사를 기록하여 예측의 정확도를 높인다. 이를 위해 하나 이상의 비트를 각 분기 명령어와 연관시켜 놓는다. 이것을 분기 역사 스위치(taken/not taken switch)라 한다. 한 비트만 사용하면 이 분기 명령어의 지난 수행 때 어디로 분기하였는지만 기록할 수 있다. 문제점. 루프처럼 항상 분기하는 명령어의 경우에 예측을 처음에 잘못하면 루트 끝에 또다시 예측을 실패하게 된다.

25/27 25/27

분기 예측 – 계속 두 비트를 사용하면 명령어의 지난 두 번의 사용을 기록할 수 있다. 전형적으로 사용하는 방법은 그림과 같다. 즉, 예측이 두 번 연속해서 틀린 경우에만 예측을 바꾼다. 방법 5은 각 분기 명령어마다 분기 역사 스위치뿐만 아니라 지난 명령어의 수행을 통해 분기 주소까지 테이블에 유지하는 방법이다. 주소뿐만 아니라 실제 명령어까지 테이블에 유지하는 경우도 있다.

26/27 26/27


분기 지연 프로그램의 순서를 바꾸어 분기를 지연시키는 방법이다. 이렇게 하면 파이프라인의 효율을 높일 수 있다.

27/27 27/27


©copyright 2006

컴퓨터구조(INA210) 강의노트 12

RISC

한국기술교육대학교 정보미디어공학부 김상진

교육목표 고급 프로그래밍 언어로 작성된 프로그램을 분석한 결과 새로운 프로세서 구조를 설계하는 주요 지침을 얻게 되었다. RISC(Reduced Instruction Set Computer) RISC의 특징 많은 수의 레지스터 사용 파이프라인 최적화 강조

2/26


개요 저장 프로그램 방식이 개발된 이후 컴퓨터 구조 분야의 진정한 혁신 컴퓨터 계열 개념 마이크로프로그램된 제어장치 캐시 파이프라인 기법 다중 프로세서 축소 명령어 집합 컴퓨터(RISC, Reduced Instruction Set 컴퓨터 Computer) RISC의 공통된 특성 많은 수의 범용 레지스터를 제공하며, 컴파일러 기술을 이용하여 이 들의 사용을 최적화한다. 제한된 단순 명령어 집합을 사용한다. 명령어 파이프라인의 최적화를 강조한다.

3/26

명령어 실행의 특징 하드웨어보다는 소프트웨어 가격이 비싸다. 이것은 소프트웨어 개발자가 부족하였기 때문이다. 개발된 소프트웨어의 신뢰성 문제 때문에 점점 고급화된 프로그래밍 언어가 개발되었다. 고급 프로그래밍 언어의 등장으로 고급 프로그래밍 언어에서 제공되는 연산과 컴퓨터 구조에서 제공되는 연산의 의미적 틈(semantic gap)이 점점 증가되고 있다. 이것의 결과는 다음과 같다. 실행의 비효율성 기계 프로그램의 크기 증가 컴파일러의 복잡성 이것을 극복하기 위한 한 가지 방법은 보다 복잡하고 강력한 기계 명령 어를 제공하는 것이다. (CISC 개념) 반대로 이것과 정반대로 명령어 집합을 축소하는 것이 오히려 성능을 향상시킬 수 있다는 주장이 제기되었다. (RISC 개념) 과연 RISC 개념이 정당한 것인가? 4/26


명령어 실행의 특징 – 연산 고급 프로그래밍 언어로 작성된 프로그램들을 분석한 결과 가장 많이 사용하는 것은 대입문이고, 그 다음은 IF 조건문이다. 동적 등장 빈도

가중치 적용 기계 명령어

가중치 적용 주기억장치 참조

ASSIGN

38%

13%

15%

LOOP

3%

32%

26%

CALL

12%

33%

45%

IF

43%

21%

13%

GOTO

3%

OTHER

1%

1%

1%

두 번째 열은 C 프로그램에서 각 유형의 프로그래밍 문장이 동적으로 등장하는 빈도를 측정하는 것이다. 동적으로 등장하는 빈도는 소스코드에 있는 문장의 빈도 수가 아니라 프로그램이 실행될 때 실행되는 빈도 수를 말한다.

5/26

명령어 실행의 특징 – 연산 자주 사용되는 프로그래밍 문장들은 최적으로 실행될 수 있도록 지원되어야 한다. 그러나 두 번째 열은 어떤 프로그래밍 문장이 한 프로그램을 실행할 때 가장 많은 시간을 소모하는지는 보여주지 못한다. 세 번째 열은 두 번째 열에 각 문장에 의해 생성되는 기계 명령어의 수를 곱하여 구한 수치이다. 이 수치는 실제 프로그램이 실행될 때 각 문장이 소모하는 시간을 나타낸다. 마지막 열은 각 문장에 의해 발생되는 주기억장치 참조 수를 계산한 것이다. 결과적으로 CALL(함수호출과 복귀)이 전형적으로 가장 많은 시간을 소모한다.

6/26


명령어 실행의 특징 – 피연산자 C언어

정수 상수

스칼라 변수

배열/구조체

23%

53%

24%

프로그래밍 언어에서 피연산자로 가장 많이 사용하는 것은 스칼라 변수 (scalar variable)이고, 그 다음은 정수 상수이고, 그 다음은 구조체, 배열과 같은 복합 변수(composite variable)이다. 스칼라 변수 중 80%은 지역 변수이다. 따라서 지역 스칼라 변수을 저장하고 접근하는 것이 가장 최적화되어야 한다. 이 변수들을 레지스터에 최대한 유지하는 것이 최적화 방법이다.

7/26

명령어 실행의 특징 – 함수호출 조사에 의하면 98%의 함수는 6개 이하의 매개변수를 전달하고 92%는 6개 이하의 지역 변수를 사용한다. 호출의 깊이도 비교적 짧은 것으로 조사되었다. 종합 대입문이 가장 많이 사용되고 하나의 고급 프로그래밍 문장마다 여러 개의 주기억장치 접근이 수반된다. 대부분의 피연산자가 지역 스칼라 변수이다. 따라서 많은 레지스터를 사용하여 주기억장치 참조를 줄이면 성능을 많이 향상시킬 수 있다. IF와 LOOP가 많으므로 파이프라인 기법도 보다 신중하게 설계할 필요가 있다

8/26


큰 레지스터 파일의 사용 레지스터의 사용을 극대화하는 방법 소프트웨어 접근 방법: 방법 컴파일러가 레지스터 사용을 최적화하도록 하는 방법이다. 이 방법은 복잡한 프로그램 분석이 필요하다. 하드웨어 접근 방법: 방법 보다 많은 레지스터를 제공하면 자연스럽게 보다 많은 변수가 레지스터에 오래 동안 유지될 것이다.

9/26

레지스터 윈도우 대부분의 피연산자 참조는 지역 변수이다. 따라서 지역 변수를 레지스터에 저장하여 사용하면 주기억장치 참조를 상당히 줄일 수 있다. 그러나 다음과 같은 이유에서 이처럼 간단하지 않다. 지역은 함수 호출마다 달라지며, 함수를 호출하면 호출된 함수가 레지스터를 사용할 수 있도록 레지스터에 유지되고 있는 호출한 함수의 지역 변수 값들을 보관해야 한다. 이 값들은 호출된 함수의 실행이 끝나면 복원되어야 한다. 매개변수의 전달 함수 호출의 특징 소수의 지역변수 소수의 매개변수 함수 호출 깊이가 짧음

10/26 10/26


레지스터 윈도우 – 계속 작은 크기의 다중 레지스터 집합을 각 함수에 할당하여 사용한다. 이렇게 하면 호출한 함수가 사용한 레지스터의 값들을 주기억장치에 보관할 필요가 없다. 각 집합은 중첩되도록 하여 매개변수의 전달과 결과 값의 전달을 용이하게 한다. 한 함수에 할당된 레지스터 집합을 레지스터 윈도우(register window) 윈도우 라 하며, 함수가 호출되면 프로세서는 자동적으로 레지스터 윈도우를 바꾼다. parameter register

local register

temporary register

level J

call/return

level J+1

parameter register

local register

temporary register

11/26 11/26

레지스터 윈도우 – 계속 레지스터 윈도우의 수는 제한되므로 제공되는 창의 수보다 함수 호출 깊이가 깊어지면 가장 오래된 윈도우는 주기억장치에 보관되어야 한다. 따라서 보통 순환 버퍼로 레지스터 창을 유지한다. restore save w0

w1 w2

saved window pointer

A.loc

B.in

B.loc

C.in

A.in

C.loc

(F)

D.in

(E)

함수호출의 깊이가 보통 짧으므로 많은 레지스터 윈도우가 필요 없다. 버클리 RISC 컴퓨터는 각 16개의 레지스터로 구성된 8개의 윈도우를 사용한다.

D.loc

w5 w3 w4 current window pointer

call return

12/26 12/26


레지스터 윈도우 – 광역변수 광역 변수 처리 방법 방법 1. 광역 변수는 주기억장치에 저장 방법 2. 광역 변수를 위해 몇 개의 레지스터를 예약하여 사용 방법 2의 경우는 컴파일러가 레지스터에 저장할 광역 변수를 결정해야 한다. 그러나 많이 사용되는 광역 변수를 찾��� 것은 쉽지 않다.

13/26 13/26

큰 레지스터 파일 vs. 캐시 큰 레지스터 파일 모든 지역 스칼라 변수 개별 변수 컴파일러 할당 광역변수 호출 깊이에 따른 보관/복원 레지스터 주소 지정

캐시 최근에 사용된 스칼라 변수 주기억장치 블록 최근에 사용된 광역 변수 캐시 교체 알고리즘 기반 주기억장치 주소 지정

레지스터 파일 기법을 사용하지 않아도 캐시는 사용한다. 레지스터는 캐시보다 훨씬 빠른 기억장치이다.

14/26 14/26


큰 레지스터 파일 vs. 캐시 – 계속 레지스터 파일 기법은 모든 지역 스칼라 변수를 유지한다. 반면에 캐시는 최근에 참조된 지역 변수만 유지한다. (LRF win) 레지스터 파일 기법에서는 낭비되는 공간이 있을 수 있지만 캐시는 그렇지 않다. (cache win) 캐시는 광역 변수도 처리하며, 캐시의 특성상 많이 사용되는 광역 변수 는 늘 캐시에 존재하게 된다. 레지스터 파일은 컴파일러에 의해 할당된 광역 변수만 유지한다. (cache win) 레지스터 파일 기법의 경우에는 호출 깊이가 깊지 않으므로 주기억장치 참조가 거의 없다. 캐시의 경우에는 집합 연관 방식을 사용하므로 다른 데이터나 명령이 지역 변수를 교체할 수 있다. (LRF win) 레지스터 파일을 사용하면 명령어에서 피연산자의 주소지정은 레지스터 주소지정 모드를 사용하지만 캐시는 직접, 간접 주소지정 모드를 사용해야 한다. (LRF win) 전체적으로 레지스터 파일 기법을 사용하는 것이 성능 측면에서 좋다. 15/26 15/26

컴파일러 기반 레지스터 최적화 레지스터 사용의 최적화는 컴파일러 몫이다. 데이터를 레지스터에 많이 유지할 수록 속도를 향상시킬 수 있다. 방법 단계 1. 레지스터에 유지할 수 있는 데이터는 가상의 레지스터 번호를 할당 받는다. 단계 2. 가상의 레지스터 번호를 실제 사용 가능한 수의 레지스터에 할당한다. 사용기간이 중첩되지 않는 것은 같은 레지스터를 공유할 수 있다. 실제 레지스터 수가 부족하면 일부 데이터는 주기억장치에 유지된다. 최적화는 여기서 일어난다. (선택의 문제) 사용하는 기법: 그래프 색칠하기

16/26 16/26


축소 명령어 집합 구조 – Why CISC? CISC는 많은 수의 명령어를 제공하고 보다 복잡하고 강력한 명령어를 제공한다. CISC의 배경 컴파일러 단순화 성능 향상 컴파일러 단순화 CISC 주장: 주장 고급 프로그래밍 문장과 흡사한 기계 명령어가 있으면 번역 작업이 쉽다. RISC 반론: 반론 복잡한 명령어 집합을 제공하면 고급 프로그래밍 구성과 정확하게 일치하는 명령어를 찾기 어렵기 때문에 활용하기가 더 어렵다. 또한 CISC에서는 생성된 코드를 최적화하여 코드 크기를 축소하고, 실행 시간을 단축하고, 파이프라인 기법 향상시키는 것이 더 어렵다.

17/26 17/26

축소 명령어 집합 구조 – Why CISC?(계속) 성능 향상 CISC 주장: 주장 CISC는 보다 작은 크기의 프로그램을 만든다. 프로그램의 크기가 작으면 공간 절약 측면에서 유리하다. 명령어 인출 수가 줄어들며, 페이지 수가 작아 페이지 결함 발생 빈도가 줄어든다. RISC 반론: 반론 RISC 프로그램의 크기가 CISC 프로그램에 비해 공간 차지 측면에서는 크지 않다. CISC의 컴파일러는 복잡한 명령어를 잘 활용하지 않거나 많이 사용하지 않는다. CISC는 많은 명령어를 제공하고 복잡하기 때문에 연산 코드의 길고 전체적인 명령어의 길이가 길다. CISC 주장: 주장 복잡한 고급 프로그래밍 구성이 하나의 명령어로 번역될 수 있으므로 여러 개의 명령어로 번역되는 RISC에 비해 실행 속도가 빠르다. RISC 반론: 반론 CISC의 컴파일러는 복잡합 명령어들을 잘 활용하지 않으며, 복잡한 명령어를 제공하기 위해서는 제어장치가 복잡해지므로 단일 명령어의 실행 속도가 증가한다.

18/26 18/26


RISC 구조의 특징 RISC 구조의 공통된 특징 한 기계 주기마다 한 명령어 실행 레지스터 간에 연산 단순 주소지정 모드 단순 명령어 형식 한 기계 주기마다 한 명령어 실행 기계 주기: 레지스터에서 두 개의 피연산자를 인출하여 ALU 연산을 수행하고 그 결과를 레지스터에 저장하는데 소요되는 시간 RISC의 명령어는 이 이상 복잡하지 않다. 이 때문에 하드웨어로 배선(hardwired)되어 구현될 수 있다. 따라서 마이크로프로그램된 제어 방식보다는 빠르게 실행될 수 있다.

19/26 19/26

RISC 구조의 특징 – 계속 레지스터 간에 연산 RISC에서는 LOAD와 STORE와 같은 단순 주기억장치 접근을 제외하고는 레지스터를 이용하여 연산을 수행한다. 이 때문에 제어장치가 단순하며, 많은 레지스터를 제공하기 때문에 대부분의 피연산자는 레지스터에 계속 유지된다. 단순 주소지정 모드 RISC의 대부분 명령어는 레지스터 주소지정 모드를 사용한다. 이 외에도 PC 상대주소 지정 모드와 변위주소 지정 모드를 제공할 수 있지만 다른 복잡한 주소 지정모드는 제공하지 않는다. 이 때문에 제어장치와 명령어 형식을 설계하는 것이 단순하다.

20/26 20/26


RISC 구조의 특징 – 계속 단순 명령어 형식 명령어 길이가 고정되어 있고 짧으며, 연산 코드의 길이가 고정되어 있다. 이 때문에 인출이 최적화되며, 명령어 해석이 쉬워지며, 명령어 해석과 피연산자 해석을 동시에 할 수 있다. 이 측면에서도 제어장치가 단순하다. RISC의 장점 요약: 성능 향상과 VLSI 설계 단순화 최근에 RISC는 CISC의 장점을 CISC는 RISC의 장점을 포용하는 방향으로 움직이고 있다.

21/26 21/26

RISC 파이프라인 기법 RISC 구조에서 대부분의 명령어는 레지스터 주소지정 모드를 사용한다. RISC의 명령어들은 단순하게 인출(I)과 실행(E), 두 단계로 구성된다고 볼 수 있다. 예외로 LOAD와 STORE 연산은 인출, 실행(주소 계산), 메모리 접근(D), 세 단계로 구성된다. 명령어를 파이프라인 없이 순차적으로 실행하는 것은 비효율적이다. 한 명령의 E 단계와 다른 명령의 I 단계만 중첩하여도 성능이 많이 향상 된다. D와 I를 중첩할 수 없다는 것은 단일 포트 주기억장치를 사용한다고 가정하였을 경우이다. 조건부 분기 때 NOOP를 추가하여 예측을 하지 않고 기다릴 수 있다.

22/26 22/26


RISC 파이프라인 기법 – 계속 순차 실행

2-stage 파이프라인 기법 LOAD A

M

LOAD B

M

ADD C

A+B

STORE M BRANCH X NOOP

C

1

2

3

I

E

D

I

4

5

E

D

I

6

7

8

E

D

9

10

11

12

13

E I

I

E I

E

23/26 23/26

RISC 파이프라인 기법 – 계속 한 단계에서 두 개의 주기억장치 접근이 가능하면 세 개의 명령을 중첩 할 수 있다. 바로 이전 명령어에서 변경하는 피연산자를 필요하면 중첩할 수 없다. 즉, 이전 명령어와 어떤 의존 관계가 있으면 중첩할 수 없다. 이 경우에는 NOOP를 추가한다. 각 단계에서 소요되는 시간이 비슷하다고 가정하였을 때에만 효과가 있다. 그러나 실행 단계는 다른 단계에 비해 길다. 따라서 실행 단계는 다음과 같은 두 개의 하위 단계로 나눈다. E1: 레지스터 파일 읽기 E2: ALU 연산과 레지스터 쓰기 이 두 하위 단계를 추가하면 4-stage 파이프라인이 가능하다. RISC는 명령어들이 간단하고 규칙적이므로 파이프라인 기법을 효율적으로 적용할 수 있다.

24/26 24/26


RISC 파이프라인 기법 – 계속 3-stage 파이프라인 기법 LOAD A

M

LOAD B

M

NOOP ADD C

A+B

STORE M BRANCH X

C

1

2

3

I

E

D

I

E

D

I

E

4

I

5

6

7

E

D

I

E

8

9

10

11

12

13

E I

NOOP

I

E

4-stage 파이프라인 기법

25/26 25/26

파이프라인의 최적화 지연 분기(delayed branch) 기법 분기 분기 예측을 잘못하면 파이프라인에서 그 부분을 제거해야 한다. 대신 분기 명령어 다음에 NOOP를 추가하면 실행 시간 측면에서는 같으나 제거회로가 필요 없다. 분기 명령어를 그 이전 명령어와 바꾸어 실행하면 NOOP를 추가할 필요가 없어 실행 시간을 단축시킬 수 있다. 100 LOAD X, A

I

101 ADD 1, A

E

D

I

E

102 JUMP 105

I

103 NOOP

E I

105 STORE A, Z 100 LOAD X, A 101 JUMP 105 102 ADD 1, A 105 STORE A, Z

I

E

D

I

E I

E I

E

E

D

D

E I

26/26 26/26


©copyright 2006

컴퓨터구조(INA210) 강의노트 13

제어장치

한국기술교육대학교 정보미디어공학부 김상진

교육목표 명령어 주기의 각 세부 주기인 인출, 간접, 실행, 인터럽트는 각각 일련의 마이크로 연산으로 구성되어 있다. 마이크로 연산은 레지스터 간 데이터 이동, 외부 버스와 레지스터 간 데이터 이동, 단순 ALU 연산 등을 말한다. 제어장치는 프로세서가 이런 마이크로 연산을 올바른 순서로 수행하도록 한다. 제어장치는 하드웨어 배선 형태로 구현될 수 있고, 마이크로프로그램된 방식으로 구현될 수 있다.

2/26


제어장치 동작 – 마이크로 연산 CPU는 명령어 주기를 반복한다. 한 명령어 주기 동안에 하나의 기계 명령어를 실행한다. 명령어 주기는 인출, 실행, 간접, 인트럽트 주기로 세분화되며, 이 중 인출과 실행 주기만 항상 일어난다. 각 세부 주기는 몇 개의 마이크로 연산(micro-operation)으로 연산 구성된다.

3/26

인출 주기 다음과 같은 세 단계로 구성된다. t1: MAR Å PC t2: MBR Å M(MAR) PC Å PC + 1 t3: IR Å MBR 위 예는 마이크로 연산의 형태를 보여주기 위한 예일 뿐이다. 실제는 보다 더 복잡할 수 있음 t2에서 두 개의 마이크로 연산을 동시할 수 있는 것은 서로 간섭하지 않기 때문이다. PC를 증가하는 마이크로 연산은 t3 때 하여도 상관없다. 인출 주기는 총 세 단계로 구성되며, 총 네 개의 마이크로 연산이 필요하다. 마이크로 연산의 타이밍을 위해 클럭을 사용한다. 따라서 한 클럭 주기에 하나의 마이크로 연산이 수행된다.

4/26


인출 주기 – 계속 마이크로 연산의 그룹핑은 다음을 만족해야 한다. 사건 순서가 지켜져야 한다. 충돌을 피해야 한다. 한 클럭 주기동안 하나의 레지스터로부터 읽기와 쓰기를 동시에 할 수 없다. PC 값을 증가하기 위해 덧셈 연산이 필요하다. 이를 위해 ALU를 사용할 수 있다. ALU를 사용할 경우에는 추가적인 마이크로 연산이 필요할 수 있다.

5/26

간접 주기/인터럽트 주기 간접주기 t1: MAR Å [IR(address)] t2: MBR Å M(MAR) t3: IR(address) Å MBR 위 세 단계를 수행하게 되면 IR은 간접 주기를 하지 않은 것과 동일한 상태가 된다. 인터럽트 주기 t1: MBR Å PC t2: MAR Å PC를 저장할 위치 PC Å 인터럽트 루틴의 주소 t3: M(MAR) Å MBR 아주 단순화한 예이다.

6/26


실행 주기 각 다른 명령어마다 일련의 다른 마이크로 연산을 사용한다. 예13.1) ADD R1, X t1: MAR Å [IR(address)] t2: MBR Å M(MAR) t3: R1 Å [R1]+[MBR] 실제로는 MBR의 내용을 ALU가 사용하는 레지스터로 옮기고 덧셈을 한다. 예13.2) ISZ X (increment-and-skip-if-zero) t1: MAR Å [IR(address)] t2: MBR Å M(MAR) t3: MBR Å [MBR]+1 t4: M(MAR) Å [MBR] [MBR] == 0이면 PC Å [PC]+1 검사와 행동은 한 마이크로 연산에서 할 수 있다. 7/26

명령어 주기

2비트 ICC(Instruction Cycle Code) 레지스터를 이용하여 세부 주기 간에 변경을 제어한다. 8/26


프로세서의 제어 – 기능적 요구사항 제어 장치의 기능적 요구사항을 살펴보기 위해서는 다음을 알아야 한다. 프로세서의 구성요소: ALU, 레지스터, 내부 데이터 경로, 외부 데이터 경로, 제어 장치 프로세서가 수행하는 마이크로 연산 마이크로 연산이 수행되기 위해 제어장치가 제공해야 하는 기능 순서 제어: 일련의 마이크로 연산의 순서를 제어하는 기능 실행: 마이크로 연산을 수행하는 기능 마이크로 연산의 분류 레지스터 간에 데이터 이동 레지스터와 버스 간에 데이터 이동 레지스터를 입력과 출력으로 사용하는 산술 또는 논리 연산 실행

9/26

프로세서의 제어 – 제어 신호 제어 장치의 입력 클럭: 순서 제어와 타이밍을 위해 필요 명령어 레지스터: 명령어를 분석하여 실행할 일련의 마이크로 연산을 결정해야 한다. 플래그: 프로세서의 상태와 ALU 연산의 결과를 알기 위해 필요하다. 제어 버스로부터 입력되는 제어 신호: 외부 장치가 보내는 신호(예: 인터럽트 신호)를 수신하기 위해 필요하다. 제어 장치의 출력 CPU 내로 전달되는 제어 신호 레지스터 간에 데이터 이동을 위한 신호 레지스터와 버스 간에 데이터 이동을 위한 신호 ALU의 특정 기능을 활성화하기 위한 신호로 구성된다. 제어 버스로 출력되는 제어 신호: 예) 주기억장치 읽기

10/26 10/26


프로세서의 제어 – 제어 신호 신호의 전달을 통해 게이트의 열림과 닫힘을 제어한다. 게이트가 열리면 신호가 통과된다고 생각하면 된다. 예13.3) 인출 주기에서는 다음과 같은 신호가 필요하다. MAR에 있는 데이터가 주소 버스에 실리도록 신호를 보내야 한다. 제어 버스에 주기억장치 읽기 신호를 보내야 한다. 데이터 버스에 있는 데이터를 MBR로 읽어 들여야 한다. PC 값을 하나 증가시키도록 신호를 보내야 한다.

11/26 11/26

내부 프로세서 조직 보통 CPU 내에도 내부 버스가 있다. 레지스터 간에 전용선으로 연결되어 있지 않고 내부 버스를 사용한다. 옆 그림에서 Z와 Y 레지스터는 ALU의 입력과 출력을 위해 사용된다. 예13.4) 메모리에 있는 값을 AC에 더하는 명령어의 세부 마이크로 연산의 구성 t1: MAR Å [IR(address)] t2: MBR Å M(MAR) t3: Y Å [MBR] t4: Z Å [AC] + [Y] t5: AC Å [Z] ALU

12/26 12/26


하드웨어 배선에 의한 구현 제어 장치를 구현하는 방법 하드웨어 배선에 의한 구현 마이크로프로그램된 구현

13/26 13/26

제어장치의 입력

명령어 레지스터 제어 장치는 명령어 레지스터를 입력 받아 그것의 연산 코드를 해석 하여야 한다. 이를 위해 하나의 입력을 받아 하나의 출력을 발생하는 해독기 (decoder)를 사용할 수 있다. 일반적으로 해독기는 n 비트를 입력받아 2n 비트를 출력한다. 14/26 14/26


클럭 주기 한 주기 내에 신호가 데이터 경로를 통해 목적지에 도달할 수 있도록 충분히 길어야 한다. 제어 장치는 한 명령어를 실행하는 동안 각기 다른 순간에 다른 신호를 발생한다. 이들 순간을 정의하기 위한 카운터가 필요하다. 신호의 정의 예) C5 신호가 인출과 간접 주기의 T2에 필요하고, ICC의 두 비트를 각 P와 Q라고 하면 C5는 다음과 같이 정의된다. C 5 = P ⋅ Q ⋅ T2 + P ⋅ Q ⋅ T2 물론 실행 주기 때에 이 신호가 필요하면 불식이 더 복잡해진다. 이것을 회로로 배선하여 구현하면 하드웨어 배선 방식의 제어 장치가 된다. 하드웨어 배선 방식은 경우의 수가 적은 경우에만 효율적으로 사용할 수 있다.

15/26 15/26


©copyright 2006

컴퓨터구조(INA210) 강의노트 14

마이크로프로그램된 제어장치 한국기술교육대학교 정보미디어공학부 김상진

교육목표 제어장치는 하드웨어 배선 형태로 구현될 수 ���고, 마이크로 프로그램된 방식으로 구현될 수 있다. 대부분의 CISC 프로세서는 마이크로 프로그램된 방식을 사용한다. 이 방식의 제어장치는 제어장치 내에 저장되어 있는 마이크로 프로그램을 통해 동작한다.

2/21


기본 개념 – 마이크로 명령어 마이크로 명령어(microinstruction): 같은 시간에 수행되는 마이크로 명령어 연산의 집합 마이크로 프로그램(microprogram): 일련의 마이크로 명령어로 구성된 프로그램 프로그램을 말하며, 다른 말로 펌웨어(firmware)라 한다. 이 개념을 이용하여 어떻게 제어 장치를 구현할까? 제어 장치는 각 마이크로 연산마다 적절한 신호를 활성화해주어야 한다. 이 신호는 제어 워드(control word)를 통해 나타낼 수 있다. 워드 즉, 각 마이크로 연산은 제어 워드로 나타낼 수 있다. 제어 워드들을 기억장치에 저장하며, 각 제어 워드는 독특한 주소에 의해 접근될 수 있도록 할 수 있다. 연산의 실행 순서를 제어하기 어떤 특정 조건이 만족될 때 다음에 실행할 연산의 주소와 주소 조건을 지정하기 위한 필드를 필드 제어 워드와 연관할 수 있다.

3/21

수평 마이크로 명령어 수평 마이크로 명령어(horizontal microinstruction) 방식은 명령어 프로세스의 내부 제어 선과 시스템 버스의 제어 선 수만큼의 비트를 신호 필드에 할당하여 사용한다. 구성요소

- zero CPU

신호 필드: CPU 내부로 전달되는 신호와 시스템 버스로 전달되는 신호로 구분된다. 분기 조건을 나타내는 필드 분기 주소

4/21


수평 마이크로 명령어의 해석 수평 마이크로 명령어의 해석 단계 1. 신호 필드에 따라 적절한 신호를 활성화한다. 신호의 활성화에 의해 하나 이상의 마이크로 연산이 실행된다. 단계 2. 조건 필드에 지정된 조건을 검사한다. 단계 2.1. 조건이 만족되지 않으면 다음 순서에 있는 마이크로 명령어를 실행한다. 단계 2.2. 조건이 만족되면 주소 필드에 있는 마이크로 명령어를 실행한다.

5/21

제어 기억장치의 조직 제어 워드 또는 마이크로 명령어들은 제어 기억장치에 옆 그림과 같이 저장될 수 있다.

AND

ADD

IOF

6/21


수직 마이크로 명령어 방식 수평 마이크로 명령어에서 신호 필드는 출력 신호 수 만큼의 비트로 구성되어 있다. 반면에 수직 마이크로 명령어 방식에서는 해독기가 신호 필드의 값을 바탕으로 신호를 생성한다. 수직 마이크로 명령어 방식의 장점은 수평 방식에 비해 명령어의 길이가 짧다.

7/21

마이크로 프로그램된 제어 장치 instruction register

마이크로 프로그램된 제어 장치는 1951년에 Wilkes가 처음 제안하였다. 마이크로 프로그램된 제어 장치 의 구성요소 제어 기억장치: 기억장치 마이크로 명령어들을 유지하는 기억장치 제어 주소 레지스터(CAR): 다음에 레지스터 실행할 마이크로 명령어의 주소를 유지하는 레지스터 제어 버퍼 레지스터(CBR): 선택된 레지스터 마이크로 명령어를 저장하는 레지스터 순서 제어 논리: 논리 다음에 실행할 마이크로 명령어의 주소를 제어 주소 레지스터에 적재하여 주는 장치

control unit decoder

ALU flag clock

sequencing logic

control address register

control memory

read

control buffer register

next address control

decoder

8/21


마이크로 프로그램된 제어 장치 – 계속 제어 기억장치로부터 하나의 마이크로 명령어를 읽는 것은 그 명령어를 실행하는 것과 같다. 마이크로 명령어의 실행 절차 단계 1. 순서 제어 논리는 읽기 명령을 제어 기억장치에 전달한다. 단계 2. 제어 주소 레지스터에 적재되어 있는 주소에 있는 워드가 주소 버퍼 레지스터에 적재된다. 단계 3. 주소 버퍼 레지스터에 있는 값에 따라 신호가 생성되어 신호가 밖으로 전달되며, 다음 주소 정보는 순서 제어 논리에 전달된다. 단계 4. ALU 플래그 값과 다음 주소 값을 바탕으로 새 주소를 결정하여 이것을 제어 주소 레지스터에 적재한다.

9/21

마이크로 프로그램된 제어 장치 – 계속 단계 4에서 새 주소가 결정되는 경우의 수 경우 1. 제어 주소 레지스터 값을 하나 증가시킨다. 경우 2. 제어 버퍼 레지스터의 다음 주소 필드 값을 제어 주소 레지스터에 적재한다. 경우 3. IR의 연산코드를 바탕으로 기계 명령어 루틴의 주소를 제어 주소 레지스터에 적재한다. 장점과 단점 장점: 하드웨어 배선 방식에 비해 구현이 용이하다. 구현 비용이 저렴하며, 오류 발생률도 적다. 단점: 하드웨어 배선 방식에 비해 속도가 느리다.

10/21 10/21


마이크로 명령어의 순서 제어 마이크로 프로그램된 제어 장치의 두 가지 기본 동작 마이크로 명령어의 순서 제어 마이크로 명령어의 실행 설계 쟁점 마이크로 명령어의 길이: 짧을 수록 좋다. 주소 발생 시간: 빠르게 발생할 수록 명령어를 빠르게 실행할 수 있다. 다음에 실행될 명령어의 주소는 다음 중 하나이다. 명령어 레지스터에 의해 결정: 명령어 주기마다 한 번 발생한다. 다음 순차 주소: 가장 흔하다. 분기: 마이크로 프로그램에서 순차적인 실행은 매우 짧다. 보통 세, 네 개의 명령어를 순차적으로 실행하고 조건부 또는 무조건 분기한다.

11/21 11/21

분기 제어 논리 두 주소 필드 가장 단순한 방법 단점: 명령어 길이가 길다.

CAR

address decoder

control memory

CBR

flags

control address 1 address 2

branch logic

multiplexer

IR

12/21 12/21


분기 제어 논리 – 계속 단일 주소 필드 단일 주소를 사용 마이크로 명령어에 포함된 주소, 다음 순차 주소, IR에 있는 연산코드에 의해 결정되는 주소 중 하나를 다음 주소로 사용한다. 두 주소 필드보다 명령어의 길이가 짧다.

13/21 13/21

분기 제어 논리 – 계속 가변 형식 두 종류의 마이크로 명령어 형식을 사용하는 방식이다. 한 비트를 이용하여 형식을 구분한다. 형식 1. 제어 신호만 포함한다. 형식 2. 분기 논리와 분기 주소만 포함한다. 세 방식 중 명령어의 길이가 가장 짧지만 분기 명령어가 한 주기를 차지한다.

14/21 14/21


주소 생성 주소 생성은 크게 명백한 방법과 함축적 방법으로 분류된다. 명백한 방법: 마이크로 명령어 내에 주소가 있는 경우 두 주소 무조건 분기 조건부 분기: 조건부 분기는 ALU 플래그, 기계 명령어 내에 있는 연산코드의 일부나 주소 모드 필드, 부호비트처럼 선택한 레지스터 내의 일부, 제어 장치 내의 상태 비트에 의해 분기가 결정된다. 함축적 방법: 별도의 회로가 필요한 경우 사상 방법: 연산코드는 마이크로 프로그램의 특정 루틴으로 사상된다. 덧셈: 다음 순차 주소 추가 제어(residual control): 마이크로 프로그램 내의 서브루틴 기능을 포함하는 경우가 있다. 이 경우에는 함수 호출과 유사한 제어가 이루어지며, 복귀 주소를 보관한 다음에 이 주소를 활용한다.

15/21 15/21

마이크로 명령어의 분류 분류 방법 수직/수평: 명령어의 폭에 따른 분류 packed/unpacked: 인코딩 사용 여부에 따른 분류 하드/소프트 마이크로 프로그래밍: 제어 신호와 하드웨어 간에 밀접도에 따른 분류 직접/간접 인코딩: 인코딩 방법에 따른 분류

16/21 16/21


마이크로 명령어의 분류 – 계속 인코딩 방법을 사용하여 신호를 나타내면 마이크로 명령어의 길이를 줄일 수 있다. 제어 장치가 총 K개의 서로 다른 신호를 활성화한다고 하자. 단순하게 구현하면 K 비트 크기의 신호 필드가 필요하다. K 비트를 사용하면 가능한 신호 조합은 2K이다. 다음처럼 모든 신호 조합을 사용하지 않는다. 두 개의 소스가 같은 목적지로 갈 수 없다. 레지스터는 동시에 소스와 목적지가 될 수 없다. 한 번에 하나의 제어 신호 패턴만이 ALU에 전달될 수 있다. 한 번에 하나의 외부 신호 패턴만이 외부로 전달될 수 있다. 이런 조합을 제거하면 실제 사용하는 조합의 수 Q는 2K보다 적다. log2Q 비트를 사용하는 것이 가장 최적이다. 그러나 이렇게 최적화하는 것은 쉽지 않으며 제어 논리 모듈이 복잡 해진다. 그래서 보통은 log2Q 비트보다는 몇 비트를 더 사용한다. 인코딩을 사용하면 가능한 조합의 일부를 허용하지 않도록 할 수 있다.

17/21 17/21

마이크로 명령어의 스펙트럼 unpack/horizontal/hard

pack/vertical/Soft

인코딩을 사용하지 않음 많은 수의 비트 HW에 대한 자세한 뷰 프로그래밍의 어려움 병행성 활용도 높음 제어 논리의 단순성 실행 속도 빨름 성능의 최적화

높은 인코딩을 사용 적은 수의 비트 HW에 대한 통합된 뷰 프로그래밍의 용이성 병행성 활용도 낮음 제어 논리의 복잡성 실행 속도 느림 프로그래밍 최적화

인코딩을 거의 사용하지 않으면 하드웨어의 개별 신호를 모두 제어할 수 있으므로 하드웨어 대한 자세한 뷰를 제공한다고 할 수 있다. 하드웨어에 대한 통합된 상위 수준의 뷰를 제공하면 마이크로 프로그래머 입장에서는 프로그래밍하기가 더 쉽다. 높은 인코딩을 사용하면 이것을 해독하는데 시간이 소요되므로 인코딩을 사용하지 않는 경우에 비해 실행 속도가 느리다. 18/21 18/21


마이크로 명령어 인코딩 실제 완전한 수평 방식의 마이크로 명령어를 사용하는 경우는 드물다. 보통 인코딩 기법을 사용하여 제어 기억장치의 크기를 줄이고, 마이크로 프로그래밍 작업을 단순화한다. 마이크로 명령어는 여러 개의 필드로 구성되어 있으며, 각 필드는 해독되어 일련의 신호를 활성화한다. 각 신호는 최소한 하나의 필드에 의해 활성화되어야 한다. 하나의 신호가 두 개 이상의 필드에 의해 활성화되는 것은 바람직하지 않다. 이것은 해독을 용이하게 하기 위함이다. L 비트로 구성된 하나의 필드는 2L개의 코드를 가질 수 있으며, 각 코드는 다른 제어 신호 패턴을 활성화할 수 있다. 한 번에 하나의 코드만 필드에 있을 수 있으므로 이 코드들은 상호 배타적이다. 즉, 그들에 의해 일어나는 행동은 상호 배타적이다.

19/21 19/21

마이크로 명령어 인코딩 – 계속 인코딩된 마이크로 명령어 형식의 설계 상호 독립적인 필드들로 조직한다. 즉, 각 필드는 다른 필드에 의해 지정되는 행동과 동시에 일어날 수 있는 행동들을 나타내도록 한다. 한 필드에 의해 지정될 수 있는 행동들은 상호 배타적이 되도록 행동들을 정의한다. 즉, 한 필드에 의해 지정되는 행동들은 어느 한 순간에 한 개만 발생할 수 있다. 인코딩은 자원을 중심 또는 기능 중심으로 조직한다. 기능 중심은 기능을 중심(소스, 목적지 등)으로 필드를 구분 자원 중심은 자원을 중심(입출력, 주기억장치, ALU 등)으로 필드를 구분

20/21 20/21


마이크로 명령어 인코딩 – 계속 인코딩은 직접과 간접 인코딩 방식으로 분류할 수 있다. 간접의 경우에는 하나의 필드가 다른 필드의 해석을 결정한다. 예로 ALU가 8개의 산술 연산과 8개의 이동 연산을 제공하면 한 비트를 이용하여 산술 연산과 이동 연산을 구분하고, 세 비트를 이용하여 어떤 산술 또는 어떤 이동 연산인지를 구분할 수 있다. 간접 인코딩은 여러 단계를 거쳐 이루어질 수 있으므로 속도가 느림

21/21 21/21


computer