컴퓨터구조론은 CPU, 기억장치, 입출력장치, 시스템 버스 등 컴퓨터 하드웨어의 구조와 동작 원리를 다루는 분야다. 소프트웨어는 하드웨어에 의존적이며, 컴퓨터의 수행 속도는 근본적으로 하드웨어에 달려 있다.
컴퓨터 시스템 개요
컴퓨터는 프로그램 코드를 정해진 순서대로 실행하며, 그 과정에서 데이터를 읽고 처리하고 저장한다.
- CPU(Processor): 프로그램 실행과 데이터 처리를 담당하는 중추 장치
- 기억장치: 주기억장치(빠른 액세스, 비쌈, 휘발성)와 보조기억장치(느린 액세스, 저렴, 영구 저장)로 나뉜다
- 입출력장치: 별도의 제어장치에 의해 동작하며, 사용자와 컴퓨터 간 소통을 위한 도구
정보의 표현과 저장
컴퓨터가 처리하는 정보는 코드와 데이터이며, 모두 비트의 조합으로 표현된다. 고급 언어 프로그램은 컴파일러에 의해 어셈블리 언어를 거쳐 기계어로 변환된다. CPU의 종류마다 내부 구조가 다르기 때문에 기계어도 달라지며, 어셈블리 언어가 그 사이를 중재한다.
기계어 프로그램에서 각 명령어는 연산을 지정하는 opcode와 데이터 위치를 가리키는 operand로 구성된다. LOAD, ADD, STOR 같은 니모닉스는 기계어 opcode에 대응되는 기호다. CPU에서 한 번에 처리될 수 있는 비트 그룹을 **워드(word)**라 한다.
시스템 구성
CPU와 기억장치, I/O 장치는 시스템 버스를 통해 정보를 교환한다. 시스템 버스는 세 종류로 구성된다.
- 주소 버스: CPU가 외부로 주소 정보를 전송하는 단방향 신호선
- 데이터 버스: CPU와 기억장치 또는 I/O 장치 사이에서 데이터를 양방향으로 전송하는 신호선
- 제어 버스: 각종 요소들의 동작 제어에 필요한 양방향 신호선
기억장치 읽기 동작에서 CPU가 주소를 발생시킨 시점부터 읽기가 완료될 때까지의 시간을 기억장치 읽기 시간이라 한다. 쓰기 시간도 마찬가지다. 읽기의 경우 주소를 해독하고 데이터를 인출하는 데 지연 시간이 발생한다.
I/O 장치는 CPU가 직접 제어하지 못하고 별도의 제어기를 통해야 한다. 제어기 내부에는 상태 레지스터와 데이터 레지스터가 있으며, CPU는 이 레지스터들의 주소를 이용해 I/O 장치를 제어한다. 키보드에서 데이터를 읽을 때 CPU는 상태 레지스터의 In_RDY 비트가 활성화될 때까지 반복 검사하고, 활성화되면 데이터 레지스터의 내용을 읽어들인다.
컴퓨터 구조의 발전
초기 컴퓨터들은 기계식 부품으로 만들어졌다. Pascal이 덧셈·뺄셈 기계를 만들었고, Babbage가 Analytical Engine을 설계했다. 이후 von Neumann이 ENIAC에 관여했으나, 프로그램 저장·변경이 불가능하다는 한계가 있었다. 이를 해결하기 위해 Stored-program 개념이 제안되었다. 2진수 체계를 사용하고 프로그램과 데이터를 기억장치 내부에 저장하는 것이 핵심이다.
1952년 von Neumann은 IAS 컴퓨터를 통해 이 개념을 구현했다. IAS는 한 번에 두 개의 명령어를 인출하여 하나는 바로 실행하고 나머지는 명령어 버퍼에 저장해 다음 사이클에 실행하는 방식으로 기억장치 액세스 시간을 단축했다. 이처럼 기억장치에 저장된 프로그램을 PC(Program Counter)가 지정하는 순서대로 실행하며, 데이터 메모리와 프로그램 메모리가 구분되지 않는 구조를 폰노이만 아키텍처라 한다.
IC칩은 집적도에 따라 SSI → MSI → LSI → VLSI → ULSI로 분류된다. 높은 집적도는 회로 간 전기적 통로 단축으로 인한 속도 향상, 크기 감소, 신뢰성 상승, 전력 소모 감소를 가져왔다.
컴퓨터 시스템은 개인용 컴퓨터, 임베디드 컴퓨터, 워크스테이션, 슈퍼미니컴퓨터, 메인프레임, 슈퍼컴퓨터 등으로 분류된다. 슈퍼컴퓨터는 구조적으로 파이프라인 방식, 대규모 병렬프로세서 방식, 클러스터 방식으로 나뉜다. 클러스터 컴퓨터는 고속 LAN으로 연결된 PC들의 집합체로, 모든 자원을 통합하여 사용하는 단일 시스템 이미지를 갖는다.
CPU의 구조와 기능
CPU는 기억장치에 저장된 명령어들을 인출하여 실행한다. 프로그램 수행 과정은 명령어 인출(fetch), 명령어 해독(decode), 데이터 인출, 데이터 처리, 데이터 저장의 다섯 단계로 나뉘며, 처음 두 단계는 모든 명령어에 공통이고 나머지는 명령어에 따라 필요한 경우에만 수행된다.
CPU 내부 구조
- ALU(산술논리연산장치): 각종 산술·논리 연산을 수행하는 하드웨어 모듈
- 레지스터: CPU 내부의 고속 기억장치. 액세스 속도가 가장 빠르지만 용량은 작다
- 제어 유닛: 명령어를 해석하고 제어 신호들을 순차적으로 발생시키는 모듈
주요 레지스터는 다음과 같다.
- PC(프로그램 카운터): 다음에 인출될 명령어의 주소를 저장. 인출 후 자동으로 증가하며, 분기 명령어 실행 시 목적지 주소로 갱신된다
- AC(누산기): 데이터를 일시적으로 저장하는 워드 길이 레지스터
- IR(명령어 레지스터): 가장 최근에 인출된 명령어를 저장
- MAR(기억장치 주소 레지스터): 주소 버스로 출력되기 전에 주소를 일시 저장. 주소 버스와 직접 접속
- MBR(기억장치 버퍼 레지스터): 기억장치와 주고받는 데이터를 일시 저장. 데이터 버스와 직접 접속
인출 사이클
CPU는 각 명령어 사이클 시작 시 PC가 가리키는 위치에서 명령어를 인출한다. 마이크로 연산으로 표현하면 세 클록 주기가 걸린다.
- t₀: MAR ← PC (PC 내용을 MAR로)
- t₁: MBR ← M[MAR], PC ← PC + 1 (기억장치에서 명령어 인출, PC 증가)
- t₂: IR ← MBR (인출된 명령어를 IR에 저장)
실행 사이클
CPU가 인출된 명령어의 연산 코드를 해독하고 연산을 수행하는 단계다. 명령어는 연산 코드와 오퍼랜드(addr)로 구성된다. 수행되는 연산들은 크게 네 분류로 나뉜다.
- 데이터 이동 (예: LOAD addr): MAR ← IR(addr) → MBR ← M[MAR] → AC ← MBR
- 데이터 처리 (예: ADD addr): MAR ← IR(addr) → MBR ← M[MAR] → AC ← AC + MBR
- 데이터 저장 (예: STA addr): MAR ← IR(addr) → MBR ← AC → M[MAR] ← MBR
- 프로그램 제어 (예: JUMP addr): PC ← IR(addr). 실행 순서를 변경하는 분기 명령어
인터럽트 사이클
프로그램 실행 중 CPU에 순차 실행을 중단하고 다른 처리를 요구하는 메커니즘이 인터럽트다. 인터럽트 요구가 들어오면 현재 PC 값을 스택에 저장하고, 인터럽트 서비스 루틴(ISR)의 시작 주소를 PC에 적재한다.
- t₀: MBR ← PC
- t₁: MAR ← SP, PC ← ISR 주소
- t₂: M[MAR] ← MBR, SP ← SP − 1
ISR이 수행되는 동안 AC 같은 레지스터 값이 바뀔 수 있으므로, ISR 시작 시 레지스터 내용을 스택에 저장했다가 복귀 직전에 복원해야 한다. 다중 인터럽트를 처리하는 방법으로는 ISR 수행 중 인터럽트를 불가능 상태로 두는 방법과, 인터럽트 간 우선순위를 정해 높은 우선순위가 현재 처리를 중단시키는 방법이 있다.
간접 사이클
명령어에 포함된 주소가 실제 데이터 주소가 아니라 실제 주소가 저장된 위치를 가리키는 경우가 있다. 이때 실제 주소를 기억장치에서 읽어오는 과정이 간접 사이클이다.
- t₀: MAR ← IR(addr)
- t₁: MBR ← M[MAR]
- t₂: IR(addr) ← MBR
명령어 파이프라이닝
명령어 실행에 사용되는 하드웨어를 여러 단계로 분할하고, 서로 다른 명령어를 동시에 처리하여 속도를 높이는 기술이다.
2-단계 파이프라인은 인출과 실행 두 단계로 나눈다. 첫 번째 클록에서 명령어 1을 인출하고, 두 번째 클록에서 명령어 1을 실행하면서 동시에 명령어 2를 인출한다. 다음에 실행될 명령어를 미리 인출하는 것을 명령어 선인출이라 한다. 다만 인출 단계와 실행 단계의 처리 시간이 다르므로 이론적 2배 속도 향상에는 도달하지 못한다.
4-단계 파이프라인은 명령어 인출(IF), 명령어 해독(ID), 오퍼랜드 인출(OF), 실행(EX) 네 단계로 나눈다. 단계를 잘게 나눌수록 각 단계의 처리 시간이 균등해진다. 전체 실행 시간은 T = k + (N − 1)이며, 속도 향상은 Sp = (k × N) / (k + (N − 1))이다 (k: 파이프라인 단계 수, N: 명령어 수).
파이프라이닝의 문제점과 보완 방법은 다음과 같다.
- 모든 명령어가 4단계를 전부 거치지는 않는다
- 가장 느린 단계 기준으로 파이프라인 클록이 정해져야 한다 → 슈퍼파이프라이닝으로 단계를 더 잘게 분할
- 두 단계가 동시에 기억장치에 액세스할 수 없다 → 명령어 캐시와 데이터 캐시를 분리
- 분기 명령어 실행 시 파이프라인에 있던 명령어가 무효화된다 → 분기 예측, 분기 목적지 선인출, 루프 버퍼, 지연 분기 등으로 보완
조건 분기에 사용되는 상태 레지스터의 조건 플래그에는 부호(S), 제로(Z), 올림수(C), 동등(E), 오버플로우(V), 인터럽트(I), 슈퍼바이저(P) 등이 있다.
슈퍼스칼라
CPU 내에 여러 개의 명령어 파이프라인을 두어 동시에 그 수만큼 명령어를 실행하는 구조다. 동시에 처리할 명령어들 사이에 데이터 의존성이 없어야 한다. m-way 슈퍼스칼라의 전체 시간은 T(m) = k + (N − m) / m, 속도 향상은 Sp = (k + N − 1) / (k + (N − m) / m)이다.
듀얼 코어 및 멀티 코어
여러 CPU 코어를 한 칩에 넣은 프로세서를 멀티코어 프로세서라 한다. 각 코어는 슈퍼스칼라 구조로 구성되지만 독립성이 더 높아 별도의 프로그램을 수행하며, 필요한 경우에만 공유 캐시를 통해 정보를 교환한다.
명령어 세트
CPU를 위해 정의된 명령어들의 집합을 명령어 세트라 한다. 설계 시 연산 종류, 데이터 형태, 명령어 형식, 주소지정 방식을 결정해야 한다.
기본적인 연산 분류는 데이터 전송, 산술 연산, 논리 연산, 입출력, 프로그램 제어다. 프로그램 제어에서 서브루틴 호출 시 CALL 명령어는 현재 PC를 스택에 저장하고 서브루틴 주소로 점프하며, RET 명령어는 스택에서 복귀 주소를 꺼내 PC에 적재한다.
명령어는 연산 코드, 오퍼랜드, 다음 명령어 주소(분기 시)로 구성된다. 오퍼랜드의 수에 따라 1-주소, 2-주소, 3-주소 명령어로 나뉜다. 3-주소 명령어는 프로그램 길이를 줄이지만 명령어 비트 수가 늘어나고 해독이 복잡해진다.
주소지정 방식
제한된 명령어 비트로 다양한 방법으로 오퍼랜드를 지정하기 위해 여러 주소지정 방식이 존재한다. EA는 유효 주소, A는 명령어 내 주소 필드, R은 레지스터 번호를 나타낸다.
- 직접 주소지정: EA = A. 가장 간단하며 기억장치 한 번 액세스. 주소 공간이 오퍼랜드 필드 비트 수에 제한된다
- 간접 주소지정: EA = (A). 두 번 기억장치 액세스가 필요하지만 주소 범위가 확장된다. 명령어에 간접 비트(I)를 포함해야 한다
- 묵시적 주소지정: 데이터가 묵시적으로 지정됨. 시프트 연산처럼 오퍼랜드 없이 누산기에 대해 수행된다
- 즉시 주소지정: 명령어에 포함된 데이터를 직접 사용. 기억장치 액세스 불필요. 수의 크기가 오퍼랜드 비트 수에 제한된다
- 레지스터 주소지정: EA = R. 레지스터에서 직접 데이터를 가져옴. 기억장치 액세스 불필요하고 오퍼랜드 비트도 적게 필요하지만, 데이터 저장 위치가 레지스터로 제한된다
- 레지스터 간접 주소지정: EA = (R). 레지스터 내용을 유효 주소로 사용해 기억장치에서 데이터를 읽는다
- 변위 주소지정: EA = A + (R). 레지스터 내용과 오퍼랜드(변위)를 더해 유효 주소를 결정한다. 사용되는 레지스터에 따라 세 가지로 나뉜다
- 상대 주소지정: EA = A + (PC). 주로 분기 명령어에서 사용. 변위가 양수면 앞 방향, 음수면 뒤 방향으로 분기한다
- 인덱스 주소지정: EA = A + (IX). A는 배열 시작 주소, IX는 각 데이터까지의 거리. 자동 인덱싱으로 IX가 매 사이클 자동 증감할 수도 있다
- 베이스-레지스터 주소지정: EA = A + (BR). 프로그램의 시작 위치를 지정하는 데 주로 사용된다
상용 프로세서의 명령어 형식
PDP-10은 36비트 고정 길이 명령어를 사용했고, PDP-11은 16/32/48비트 가변 길이 명령어를 사용했다. CISC형 펜티엄 계열은 세그먼트 레지스터로 기억장치 공간을 분류하고, EA가 결정되면 세그먼트 시작 주소와 더해 선형 주소(LA)를 생성한다. 명령어 형식에는 연산 코드, MOD R/M(주소지정 방식 지정), SIB, 변위, 즉시 필드가 포함된다.
컴퓨터 산술과 논리 연산
ALU의 구성 요소
ALU는 수치 및 논리 데이터에 대해 실제로 연산을 수행하는 하드웨어 모듈이다. 내부에는 산술연산장치, 논리연산장치, 시프트 레지스터, 보수기, 상태 레지스터(플래그)가 들어 있다. 입력 데이터는 레지스터나 기억장치에서 ALU로 들어오고, 결과는 레지스터에 저장된다. 연산 결과에 따라 상태 레지스터의 플래그가 세트되며, 어떤 내부 요소를 선택할지와 데이터 이동을 제어하는 신호는 제어 유닛에서 제공한다.
정수의 표현
컴퓨터는 2진수 체계를 사용하며, 음수를 나타내기 위해 최상위 비트를 부호 비트(0이면 양수, 1이면 음수)로 사용한다. 부호 비트를 사용하는 표현에는 세 가지가 있다.
- 부호화-크기 표현: 최상위 비트가 부호, 나머지 n−1 비트가 크기. 0의 표현이 두 가지(+0, −0)이고 덧셈·뺄셈에서 부호와 크기를 별도 처리해야 하는 단점이 있다
- 1의 보수 표현: 모든 비트를 반전. 8비트 기준 −127~+127 범위. 0의 표현이 두 가지
- 2의 보수 표현: 모든 비트를 반전한 뒤 1을 더함. 8비트 기준 −128~+127 범위. 0의 표현이 하나뿐이라 표현 가능한 수가 한 가지 더 많다
부호-비트 확장은 짧은 데이터를 더 긴 레지스터로 옮길 때 사용한다. 2의 보수 표현에서는 부호 비트가 0이면 빈 공간을 0으로, 1이면 1로 채운다.
논리 연산
기본 논리 연산으로 AND, OR, XOR, NOT이 있다. 이를 활용한 대표적 연산은 다음과 같다.
- 선택적-세트: B 레지스터로 위치를 지정하고 OR 연산으로 특정 비트를 1로 세트
- 선택적-보수: XOR 연산으로 특정 비트를 반전
- 마스크: AND 연산으로 특정 비트를 0으로 리셋
- 삽입: 마스크 연산으로 대상 비트를 0으로 초기화한 뒤, OR 연산으로 새 값을 삽입
- 비교: XOR 연산. 대응 비트가 같으면 0, 다르면 1
비트 단위 논리 연산을 위한 하드웨어는 4×1 MUX 등으로 구현할 수 있다.
시프트 연산
- 논리적 시프트: 비트를 좌 또는 우로 한 칸씩 이동. 밀려나는 비트는 버리고, 빈 자리를 0으로 채운다
- 순환 시프트(회전): 밀려나는 비트가 반대편 끝으로 들어간다. 논리적 시프트와 조합하면 두 레지스터 간 직렬 데이터 전송이 가능하다
- 산술적 시프트: 부호 비트를 그대로 두고 크기 비트만 시프트한다
- C 플래그 포함 시프트: 올림수(C) 플래그까지 포함하여 논리적 시프트 또는 순환 시프트를 수행한다
정수의 산술 연산
2의 보수 표현에서 덧셈은 두 수를 더하고 올림수가 발생하면 버린다. 하드웨어는 풀 애더로 구성된 병렬 가산기를 사용한다. 오버플로우는 최상위 비트 계산의 캐리와 그 다음 비트 계산의 캐리가 서로 다를 때 발생한다.
뺄셈은 감수의 2의 보수를 구한 뒤 피감수와 더하면 되므로 같은 병렬 가산기를 사용한다. 오버플로우 검출 방식도 덧셈과 동일하다.
부호 없는 곱셈은 승수의 각 비트에 대해 부분 적을 생성하고 한 자리씩 좌측으로 시프트하면서 모두 더한다. 두 개의 n비트 정수를 곱하면 결과는 최대 2n비트다. 2의 보수 간의 곱셈에는 Booth 알고리즘을 사용한다.
부동소수점 수의 표현
소수점 위치를 이동시키는 표현 방법이 부동소수점이다. 일반적 형태는 (−1)ˢ × M × 2ᴱ로, 부호(S), 가수(M), 지수(E)로 구성된다. M은 정밀도를, E는 표현 가능한 수의 범위를 결정한다.
정규화된 표현은 소수점 바로 다음에 오는 비트가 1이 되도록 위치를 조정하는 것이다. 지수는 바이어스된 수로 표현하는데, 지수가 매우 큰 음수일수록 0에 가까워진다는 점에 착안하여 0 검사를 편하게 한다.
IEEE 754 단일 정밀도에서 가수는 1.M × 2ᴱ 형태이며 소수점 위의 1은 생략한다(hidden bit). 바이어스 값은 127이다. 예를 들어 −13.625를 변환하면, 13.625₁₀ = 1.101101₂ × 2³이므로 S = 1, E = 3 + 127 = 130(10000010₂), M = 10110100…0이 된다.
부동소수점 산술 연산
덧셈·뺄셈은 먼저 두 수의 지수를 일치시킨다(더 작은 수를 오른쪽으로 시프트하면서 지수를 증가). 그 다음 가수를 더하거나 빼고, 결과를 정규화한다. 뺄셈은 감수를 2의 보수로 변환 후 더한다. 지수 조정, 가수 덧셈, 정규화 3단계에 파이프라이닝을 적용하기도 한다.
곱셈은 가수들을 곱하고, 지수들을 더한 뒤 바이어스 값을 한 번 빼고, 결과를 정규화한다. 나눗셈은 가수들을 나누고, 지수들을 뺀 뒤 바이어스 값을 한 번 더하고, 결과를 정규화한다. 범위 초과 시 지수 오버플로우, 지수 언더플로우, 가수 오버플로우, 가수 언더플로우가 발생할 수 있다.
제어 유니트
제어 유니트는 명령어 코드를 해독하고 실행에 필요한 제어 신호들을 발생시킴으로써, 명령어 사이클이 적절히 수행되도록 모든 동작을 제어하는 장치다.
- 마이크로명령어: 마이크로연산을 2진 비트로 표현한 형태
- 마이크로프로그램: 마이크로명령어의 집합
- 루틴: CPU의 특정 기능을 수행하기 위한 마이크로프로그램
명령어 사이클을 위한 마이크로프로그램은 인출 사이클 루틴, 간접 사이클 루틴, 실행 사이클 루틴들로 구성된다.
제어 유니트의 내부 구조
- 명령어 해독기: 명령어 레지스터에서 들어오는 연산 코드를 해독하여 해당 실행 사이클 루틴의 시작 주소를 결정
- CAR(제어 주소 레지스터): 다음에 실행할 마이크로명령어의 주소를 저장
- 제어 기억장치: 마이크로프로그램을 저장하는 내부 기억장치. CPU 설계 단계에서 확정되므로 ROM으로 만들어져 CPU 내부에 포함된다
- CBR(제어 버퍼 레지스터): 제어 기억장치에서 읽힌 마이크로명령어를 일시 저장
- SBR(서브루틴 레지스터): 서브루틴 호출 시 현재 CAR 내용을 일시 저장
- 순서제어 모듈: 마이크로명령어의 실행 순서를 결정하는 회로
명령어 해독기가 연산 코드로부터 실행 사이클 루틴의 시작 주소를 찾는 방법 중 하나가 사상(mapping)이다. 연산 코드를 특정 비트 패턴(1xxxx00)과 혼합시켜 시작 주소를 결정한다.
마이크로명령어의 형식
마이크로명령어는 연산 필드, 조건 필드(2비트), 분기 필드(2비트), 주소 필드로 구성된다. 연산 필드가 여러 개이면 그 수만큼의 마이크로연산이 동시에 수행된다. 조건 필드는 분기 조건을, 분기 필드는 분기의 종류와 다음 마이크로명령어를 결정하고, 주소 필드는 분기 시 목적지 주소를 담는다.
마이크로프로그래밍 예시
인출 사이클 루틴은 MAR ← PC, MBR ← M[MAR]와 PC ← PC + 1, IR ← MBR 순으로 진행하며 마지막에 MAP으로 실행 사이클 루틴의 시작 주소를 결정한다. 간접 사이클 루틴은 MAR ← IR(addr), MBR ← M[MAR], IR(addr) ← MBR로 실제 주소를 읽어온다.
실행 사이클에서 각 명령어(NOP, LOAD, STORE, ADD, SUB, JUMP 등)는 사상 방식으로 시작 주소가 결정되고, I 비트가 1이면 간접 사이클 루틴이 호출된다.
순서제어
CPU가 처음 동작을 시작하면 CAR ← 0으로 세트되어 인출 사이클 루틴의 첫 마이크로명령어를 인출한다. MUX2가 조건 비트 중 하나를 선택하고, MUX1이 BR 필드의 두 비트와 MUX2 출력의 조합으로 다음 주소를 결정한다.
- BR = 00: 조건 불만족 시 CAR ← CAR + 1, 만족 시 CAR ← ADF(JUMP)
- BR = 01: 조건 불만족 시 CAR ← CAR + 1, 만족 시 SBR ← CAR, CAR ← ADF(CALL)
- BR = 10: CAR ← SBR(복귀)
- BR = 11: CAR ← 1xxxx00(MAP에 의해 결정)
마이크로연산에 더 많은 제어 신호가 필요하면 디코더를 이용해 확장할 수 있다. 수직적 마이크로프로그래밍은 디코더를 적극 활용하여 연산 필드를 최소화하는 방식이고, 수평적 마이크로프로그래밍은 제어 신호 수만큼의 비트를 연산 필드에 직접 포함시키는 방식이다.
기억장치
데이터를 저장하는 장치는 주기억장치와 보조기억장치로 나뉘며, 성능과 가성비를 개선하기 위해 다양한 기억장치를 시스템에 계층적으로 포함하는 것이 일반적이다.
기억장치의 분류와 특성
액세스 방식에 따라 네 가지로 분류된다.
- 순차적 액세스: 처음부터 순서대로 액세스 (예: 테이프)
- 직접 액세스: 근처로 이동 후 순차 검색으로 최종 위치에 도달 (예: 디스크)
- 임의 액세스: 어떤 위치든 액세스 시간이 동일 (예: RAM)
- 연관 액세스: 키값 검색으로 위치를 찾아냄 (예: 캐시)
기억장치 설계의 핵심 특성은 용량과 액세스 속도다. 용량의 단위는 바이트 또는 워드이고, 액세스 시간은 주소와 읽기/쓰기 신호가 도착한 시점부터 동작이 완료될 때까지의 시간이다. 기억장치 사이클 시간은 액세스 시간에 데이터 복원 시간을 더한 것이다.
계층적 기억장치 시스템
CPU와 기억장치 간 속도 차이를 해소하기 위해 여러 유형의 기억장치를 계층적으로 구성한다. 속도, 가격, 용량 사이에는 속도 ∝ 가격, 용량 ∝ 1/가격, 용량 ∝ 1/속도 관계가 있다.
지역성의 원리가 이 구조를 유효하게 만든다. CPU는 기억장치의 한정된 영역을 주로 액세스하며 작업을 수행하는 경향이 있어, 상위 계층에 대한 액세스 빈도가 훨씬 높다.
- 캐시: CPU와 주기억장치 사이에 위치하는 빠르고 작은 메모리. 프로그래머에게 보이지 않는 버퍼 역할
- 디스크 캐시: 주기억장치와 디스크의 속도 차이를 줄이기 위한 버퍼
반도체 기억장치
RAM은 임의 액세스 방식이며 읽기/쓰기가 가능한 휘발성 기억장치다.
- DRAM: 캐패시터에 전하를 충전하여 데이터를 저장. 주기적 리프레시가 필요하다. 구조가 간단하고 작아서 주기억장치에 사용된다. 타이밍을 이용한 시분할로 주소선 수를 절반으로 줄여 패키지 크기를 줄일 수 있다
- SRAM: 플립플롭형 기억 셀을 사용하며 전력이 공급되는 동안 데이터가 유지된다. DRAM보다 빨라서 캐시 메모리에 사용된다
ROM은 읽기만 가능한 비휘발성 기억장치로, 시스템 초기화 프로그램, 자주 사용되는 서브루틴, 제어 유니트의 마이크로프로그램 등을 저장한다. PROM(한 번만 쓰기), EPROM(자외선으로 삭제), EEPROM(전기적 삭제), 플래시 메모리(고속, 전기적 삭제, 페이지 단위 쓰기) 등이 있다.
기억장치 모듈의 설계
여러 RAM을 접속하여 원하는 용량이나 처리 능력을 얻을 수 있다. 병렬 접속은 한 번에 액세스하는 워드 길이를 늘리고, 직렬 접속은 용량을 늘린다. 두 방식을 조합하면 원하는 사양의 기억장치 모듈을 설계할 수 있다.
캐시 메모리
CPU가 기억장치를 읽으려 할 때 먼저 캐시에 해당 데이터가 있는지 검사한다. 있으면 캐시 적중, 없으면 캐시 미스다.
- 캐시 적중률 H = 캐시 적중 횟수 / 전체 액세스 횟수
- 평균 기억장치 액세스 시간 Tₐ = H × Tc + (1 − H) × Tm (Tc: 캐시 액세스 시간, Tm: 주기억장치 액세스 시간)
캐시 적중률은 지역성에 크게 의존한다. 지역성은 세 가지로 분류된다.
- 시간적 지역성: 최근 액세스된 데이터가 곧 다시 액세스될 가능성이 높음 (반복 루프, 서브루틴, 공통 변수)
- 공간적 지역성: 인접하여 저장된 데이터들이 연속으로 액세스될 가능성이 높음 (배열 데이터)
- 순차적 지역성: 분기가 없으면 명령어는 저장된 순서대로 인출됨
캐시 설계의 목표는 적중률 극대화, 액세스 시간 최소화, 미스 시 지연 최소화, 주기억장치와의 데이터 일관성 유지다.
인출 방식은 요구 인출(필요한 것만)과 선인출(근접 데이터를 블록 단위로 함께 인출)이 있다.
사상 방식은 주기억장치 블록이 어느 캐시 라인에 적재될지를 결정한다.
- 직접 사상: 각 블록이 지정된 특정 라인에만 적재(모듈러 연산). 간단하지만 같은 라인에 사상되는 두 블록을 번갈아 읽으면 적중률이 떨어진다
- 완전-연관 사상: 어느 라인에든 적재 가능. 태그 검사가 복잡하여 거의 채택되지 않는다
- 세트-연관 사상: 직접 사상과 완전-연관 사상의 결합. tag, set, word 비트를 사용하며 보통 2-way~4-way 세트를 사용한다
교체 알고리즘은 캐시가 가득 찼을 때 어떤 블록을 교체할지 결정한다.
- LRU(최소 최근 사용): 가장 오래 사용되지 않은 블록을 교체
- FIFO: 가장 오래 적재된 블록을 교체
- LFU(최소 사용 빈도): 참조 횟수가 가장 적은 블록을 교체
- 임의 선택: 무작위로 교체
쓰기 정책은 캐시 데이터를 주기억장치에 갱신하는 시기와 방법을 결정한다.
- write-through: 모든 쓰기가 캐시와 주기억장치에 동시에 이루어짐. 쓰기 시간이 길어진다
- write-back: 쓰기가 캐시까지만 이루어지고, 수정 여부를 M 비트로 기록. 주기억장치 갱신이 지연되며, 다중프로세서 시스템에서 데이터 불일치 문제가 발생할 수 있다
다중 캐시로는 온-칩 캐시(CPU 내부)와 외부 캐시를 계층적으로 구성하는 방식, 온-칩 캐시를 명령어 캐시와 데이터 캐시로 분리하여 파이프라인에서의 충돌을 제거하는 분리 캐시 방식이 있다.
최신 기억장치 기술
- SDRAM(동기식 DRAM): 여러 bank로 구성되어 동시에 서로 다른 주소에 액세스 가능(파이프라이닝). 한 번의 액세스 동작에 여러 바이트를 연속 전송하는 버스트 모드를 지원한다
- DDR SDRAM: 버스 클록의 상승·하강 에지 양쪽에서 데이터를 전송하여 클록 당 두 번 전송한다. DDR2는 버스 클록 주파수를 두 배로 높인다
차세대 비휘발성 기억장치로는 PRAM(물질 상태 변화, 비휘발성·고속·고집적), FRAM(강유전체 분극 특성, 비휘발성·저전력), MRAM(전극 자화 방향, 비휘발성·고속·내구성) 등이 연구되고 있다.
보조저장장치
자기 디스크
자화 가능한 물질의 표면을 자화시켜 데이터를 저장한다. 섹터들로 분리되어 있고 갭으로 구분된다. 바깥쪽 트랙의 저장 밀도를 낮춰야 하므로 공간이 낭비된다. 서로 다른 디스크 표면에서 같은 반경에 위치한 트랙들의 집합을 실린더라 한다.
디스크 액세스 시간 = 탐색 시간(헤드 이동) + 회전 지연시간(디스크 회전) + 데이터 전송 시간
RAID
RAID(Redundant Array of Independent Disks)는 다수의 디스크를 배열로 연결하여 용량을 늘리고 신뢰성을 향상시킨 시스템이다. 데이터를 분산 저장하면 동시 액세스가 가능하여 속도가 빨라지고 전체 데이터 손상을 예방할 수 있다. 단, MTTF(평균 고장 시간 간격)가 낮아진다. 데이터 블록을 여러 디스크에 분산 저장하는 기술을 디스크 인터리빙이라 한다.
- RAID 1(디스크 미러링): 모든 데이터를 두 디스크에 중복 저장. 안전하지만 용량의 절반만 사용 가능
- RAID 2: 바이트 단위로 분산 저장하고 패리티를 별도 디스크에 저장. 순차 읽기/쓰기 성능이 우수하지만 잘 사용되지 않는다
- RAID 4: 블록 단위로 분산 저장, 패리티 전용 디스크 사용. 읽기 성능이 좋지만 쓰기 성능이 나쁘다
- RAID 5: 블록 단위 분산 저장에 패리티도 모든 디스크에 분산. 한 드라이브 고장을 허용하지만 재구성이 느리다
플래시 메모리와 SSD
플래시 메모리는 EEPROM의 일종으로 저장밀도가 높고 저전력·고신뢰성을 갖는다. SSD(Solid-State Drive)는 대용량 비휘발성 반도체 저장장치로, 기계 장치가 없어 안정성과 신뢰도가 높다. NAND 게이트 방식이 NOR 게이트 방식보다 유리하다.
광 저장장치
- CD-ROM: 읽기 전용 광디스크
- CD-R: 한 번만 기록 가능. CD-RW: 여러 번 재기록 가능
- DVD: CD-ROM보다 데이터 밀집력이 높은 대용량 디스크
- 블루-레이 디스크(BD): 매우 짧은 파장의 레이저를 이용한 대용량 광디스크
시스템 버스, I/O 및 인터럽트
시스템 버스
시스템 버스는 데이터 버스, 주소 버스, 제어 버스로 구성된다. 버스 사용의 주체가 되는 요소를 버스 마스터라 하며, 여러 마스터가 동시에 사용을 요청할 때 순서를 결정하는 동작이 버스 중재다. 중재를 위해 버스 요구 신호, 버스 승인 신호, 버스 사용중 신호가 사용되며, 이 신호선들의 집합을 중재 버스라 한다.
버스의 기본 동작에서 쓰기는 마스터가 사용권을 획득한 뒤 주소·데이터·쓰기 신호를 보내고, 읽기는 주소·읽기 신호를 보내고 데이터가 올 때까지 기다린다.
데이터 전송 방법에는 공통 클록 기준의 동기식 버스(단순하지만 시간 낭비 있음)와 클록 없이 관련 동작 발생에 따라 결정되는 비동기식 버스(복잡하지만 낭비 없음)가 있다.
버스 중재
- 병렬 중재: 각 버스 마스터가 독립적인 요구 신호를 가짐
- 중앙집중식 고정-우선순위: 버스 중재기가 고정된 우선순위에 따라 승인
- 분산식 고정-우선순위: 각 마스터가 중재기를 가지며, 자신보다 높은 우선순위의 요구가 없을 때만 승인
- 가변 우선순위: 시스템 상태에 따라 우선순위를 계속 변경. 회전 우선순위, 임의 우선순위, 동등 우선순위, 최소-최근 사용 방식 등이 있다
- 직렬 중재: 요구 및 승인 신호선이 하나씩만 존재
- 중앙집중식: 높은 우선순위부터 차례로 검사하여 요구한 마스터를 찾으면 승인
- 분산식: 각 마스터당 중재기가 있고, 기아 방지를 위해 중재 신호를 루프로 돌림
- 폴링: 버스 중재기가 각 마스터에게 주기적으로 사용 의사를 검사. 하드웨어 폴링과 소프트웨어 폴링이 있다
I/O 장치의 접속
I/O 제어기가 시스템 버스와 I/O 장치를 연결하는 인터페이스 역할을 한다. I/O 주소지정 방식에는 기억장치-사상 I/O(제어기 레지스터에 기억장치 주소 영역의 일부를 할당)와 분리형 I/O(별도의 I/O 주소 영역과 전용 명령어 사용)가 있다.
인터럽트를 이용한 I/O
- 다중 인터럽트 방식: 각 I/O 제어기와 CPU 사이에 별도의 인터럽트 요구·확인 신호선이 존재. 장치를 쉽게 찾지만 하드웨어가 복잡하고 핀 수에 의해 장치 수가 제한된다
- 데이지-체인 방식: 인터럽트 요구 신호 1개, 체인 형태의 확인 신호 1개, 데이터 버스로 인터럽트 벡터(ISR 시작 주소)를 전송. 하드웨어가 간단하지만 낮은 우선순위 장치의 대기시간이 길다
- 소프트웨어 폴링: 인터럽트 요구 신호 1개, 제어기 내 인터럽트 플래그와 TEST I/O로 요구한 제어기를 찾음. 하드웨어가 간단하지만 검사 시간이 오래 걸린다
DMA를 이용한 I/O
DMA(Direct Memory Access)는 CPU 개입 없이 I/O 장치와 기억장치 간 데이터 전송을 수행하는 메커니즘이다. DMA 제어기가 I/O 동작을 전담하며, CPU가 버스를 사용하지 않는 동안 시스템 버스를 사용하는 것을 사이클 스틸링이라 한다. 단점으로는 I/O 장치의 다양성·복잡성 때문에 단순한 DMA 제어기로는 한계가 있고, 버퍼링을 위한 내부 기억장치가 필요하다.
고성능 컴퓨터 시스템 구조
병렬처리
다수의 프로세서를 이용하여 여러 프로그램을 동시에 처리하는 기술이다. 작고 저렴하며 고속인 프로세서들이 사용 가능해야 하고, 한 프로그램을 여러 부분으로 분할하여 병렬 처리한 결과가 순차 처리와 동일해야 한다. 순차적 작업이 필요한 경우 근본적으로 병렬 처리가 불가능한 경우도 있다.
병렬 처리 단위는 작업 단위(독립적 프로그램), 태스크 단위(프로그램을 기능별로 분할), 스레드 단위(가장 작은 독립적 단위 프로그램), 명령어 단위(슈퍼스칼라) 등으로 나뉜다.
Flynn의 분류
- SISD: 한 번에 하나의 명령어와 데이터를 처리. 파이프라이닝 적용 가능
- SIMD: 하나의 명령어로 여러 데이터를 동시에 처리
- MISD: 프로세서들이 배열 형태로 연결되어 이전 프로세서의 결과에 다른 연산을 수행. 실제로는 거의 사용되지 않는다
- MIMD: 여러 프로세서가 여러 데이터를 동시에 처리. 밀결합(프로세서 간 상호작용 많음)과 소결합(거의 독립적)으로 나뉜다
기억장치 액세스 모델에 따른 분류
- UMA(균일 기억장치 액세스): 모든 프로세서가 기억장치를 공유하며 액세스 시간이 동일
- NUMA(불균일 기억장치 액세스): 프로세서와 기억장치 간 거리에 따라 액세스 시간이 달라짐
- NORMA(무-원격 기억장치 액세스): 프로세서별 별도 기억장치, 공유 기억장치 없음
시스템 구성 방법에 따른 분류
- 대칭적 다중프로세서: 프로세서들이 모든 자원을 공유하며 동등한 권한
- 대규모 병렬프로세서: 많은 수의 노드(프로세서+기억장치), 자원 공유 없음
- 캐시-일관성 NUMA: 모든 캐시와 기억장치 간 데이터 일관성 유지
- 분산 시스템: 독립적 컴퓨터들이 네트워크로 연결
- 클러스터 컴퓨터: 고속 네트워크로 접속된 컴퓨터 집합, 단일 시스템 이미지
다중프로세서 시스템 구조
MIMD 조직은 공유-기억장치 구조와 분산-기억장치 구조로 나뉜다.
공유-기억장치 시스템은 밀결합 형태로, 주기억장치가 모든 프로세서에 의해 공유된다. 별도의 프로세서 간 통신 메커니즘이 불필요하고 작업을 동적으로 균등 할당할 수 있어 이용률이 높다. 그러나 버스 통신량 증가로 지연이 발생하고 공유 자원 경합이 생길 수 있어 프로세서 수 증가에 대한 성능 향상이 선형적이지 못하다. 이를 해결하기 위한 상호연결 방식으로는 버스(간단하지만 경합 발생), 크로스바 스위치(완전 연결성이지만 고비용·복잡), 다단계 상호연결망(크로스바 개념을 적용하되 복잡성을 낮춤) 등이 있다.
분산-기억장치 시스템의 상호연결 구조에는 선형 배열, 링, 트리, 팻 트리, 메시, 하이퍼큐브 등이 있다.
클러스터 컴퓨터
컴퓨터들을 네트워크와 미들웨어로 통합하여 병렬처리 노드로 사용하는 기술이다.
하드웨어에 따라 PC 클러스터, 워크스테이션 클러스터, 다중프로세서 클러스터로 나뉜다. 하드웨어·OS에 따라 동일형(유사 하드웨어·동일 OS)과 혼합형으로, 연결 매체에 따라 개방형(외부 이용 가능)과 폐쇄형으로, 소유권에 따라 전용(통합적 사용만)과 비전용(별도·통합 모두 가능)으로 분류된다.
클러스터 미들웨어에는 모든 자원을 통합 시스템으로 사용하게 해주는 SSI(단일 시스템 이미지) 인프라와, 부분적 결함 발생 시에도 동작을 유지하는 SA(시스템 가용성) 인프라가 있다.
참고