컴퓨터 구조 (Computer Architecture)
1장: 컴퓨터의 역사와 분류
1.1. 컴퓨터의 발전 과정
컴퓨터의 역사는 기계식 계산 장치에서 시작해 현대의 집적 회로(IC) 기반 컴퓨터에 이르기까지 획기적인 발전을 거듭했습니다.
-
초기 기계식/전자식 컴퓨터
- 차분기관 (Difference Engine): 19세기 찰스 배비지가 설계한 기계식 계산기.
- 애니악 (ENIAC): 최초의 대형 범용 전자식 컴퓨터로, 주요 소자로 진공관(Vacuum Tube)을 사용했습니다.
- 에드삭 (EDSAC): 영국에서 개발되었으며, 프로그램 내장 방식을 구현한 초기 컴퓨터 중 하나입니다.
- 에드박 (EDVAC): 폰 노이만이 제안한 프로그램 내장 방식(Stored-Program Concept) 설계를 본격적으로 채택한 컴퓨터입니다.
-
반도체와 집적 회로(IC)의 시대
진공관을 트랜지스터(Transistor)가 대체하면서 컴퓨터는 더 작고, 빠르고, 신뢰성 높은 장치로 발전했습니다. 이후 수많은 트랜지스터를 하나의 칩에 집적하는 집적회로(Integrated Circuit, IC) 기술이 등장했습니다.
- SSI (Small-Scale Integration): 소규모 집적회로
- MSI (Medium-Scale Integration): 중규모 집적회로. 조합회로, 순차회로 구현에 사용.
- LSI (Large-Scale Integration): 대규모 집적회로. 이 기술 덕분에 단일 칩으로 된 마이크로프로세서가 탄생했습니다.
- VLSI (Very Large-Scale Integration): 초대규모 집적회로
- ULSI (Ultra-Large-Scale Integration): 극초대규모 집적회로
1.2. 컴퓨터 시스템의 분류
- 개인용 컴퓨터 (PC) 및 워크스테이션 (Workstation)
- 다중 프로세서 시스템: 하나의 시스템에 여러 개의 CPU 코어를 사용하여 병렬 처리 성능을 높인 컴퓨터. GPU 또한 병렬 연산에 널리 사용됩니다.
- 메인프레임 및 슈퍼컴퓨터:
- 메인프레임 (Mainframe): 대규모 데이터 처리와 높은 신뢰성이 요구되는 기업 환경에서 사용됩니다.
- 슈퍼컴퓨터 (Supercomputer): 과학 기술 연산 등 극도의 고성능 계산을 위해 사용되며, 성능 단위로 과거에는 MFLOPS, 현대에는 PFLOPS, EFLOPS를 사용합니다.
- 구조적 특징: 초기에는 파이프라인 슈퍼컴퓨터 구조였으나, 현재는 수많은 프로세서를 연결한 대규모 병렬 컴퓨터(MPP)나 클러스터(Cluster) 형태가 주를 이룹니다.
2장: 중앙 처리 장치 (CPU) 구조와 기능
CPU는 명령어 인출, 해석, 실행, 저장을 통해 프로그램을 처리하는 컴퓨터의 핵심 장치입니다.
2.1. CPU의 주요 레지스터
- PC (Program Counter): 다음에 인출(Fetch)할 명령어의 주소를 저장합니다.
- IR (Instruction Register): 현재 실행할 명령어를 해석하기 위해 임시로 보관합니다.
- MAR (Memory Address Register): 접근하려는 기억장치(메모리)의 주소를 저장합니다. 데이터가 시스템 주소 버스로 출력되기 전 주소를 보관합니다.
- MBR (Memory Buffer Register): 기억장치에서 읽거나 쓸 데이터를 임시로 저장합니다. 메모리 데이터 레지스터(MDR)라고도 합니다.
- AC (Accumulator): 산술논리연산(ALU)의 결과나 인출된 데이터를 일시적으로 저장하는 누산기입니다.
2.2. 명령어 사이클과 마이크로 연산
CPU는 내부 버스를 통해 레지스터 간 데이터를 이동시키며 정해진 사이클에 따라 명령을 처리합니다.
2.3. 명령어 파이프라이닝과 슈퍼스칼라
-
명령어 파이프라인 (Instruction Pipeline): 명령어 처리 과정을 여러 단계(IF, ID, OF, EX 등)로 나누어, 한 명령어의 1단계가 끝나면 바로 다음 명령어의 1단계를 수행하는 식으로 여러 명령어를 동시에 처리하는 기술입니다.
-
슈퍼스칼라 (Superscalar): 여러 개의 파이프라인을 두어, 서로 독립적인 명령어들을 매 사이클마다 동시에 실행하여 효율을 극대화하는 구조입니다. 이론상 파이프라인 수만큼 성능이 향상됩니다.
-
멀티코어 (Multi-core): 하나의 칩에 명령어 실행에 필요한 핵심 모듈인 코어(Core)를 여러 개 내장하여 병렬 처리 능력을 높인 프로세서입니다.
2.4. 인터럽트 (Interrupt)
프로그램 실행 중 예외 상황이 발생했을 때 현재 작업을 중단하고 해당 상황을 처리하는 루틴(ISR)을 실행하는 메커니즘입니다.
- 인터럽트 처리 마이크로 연산:
MBR <- PC: 현재 실행 위치(복귀 주소)를 MBR에 임시 저장.
MAR <- SP, PC <- ISR: 스택 포인터(SP)가 가리키는 스택 주소를 MAR에, 인터럽트 서비스 루틴(ISR)의 시작 주소를 PC에 저장.
M(MAR) <- MBR, SP <- SP - 1: 복귀 주소를 스택에 저장하고, 스택 포인터를 갱신.
- 다중 인터럽트 (Multiple Interrupt): 인터럽트 처리 중에 우선순위가 더 높은 다른 인터럽트가 발생하는 경우를 처리하기 위한 메커니즘.
3장: 명령어 세트 아키텍처 (ISA)
ISA는 CPU가 이해하는 명령어의 구조를 결정하며, 어셈블리어는 이러한 CPU 구조에 종속적입니다.
3.1. 명령어의 형식과 구성 요소
- 명령어 구성:
- 연산 코드 (Opcode): CPU가 실행할 연산(LOAD, ADD 등)을 지정.
- 오퍼랜드 (Operand): 연산에 필요한 데이터 또는 데이터의 주소.
- (선택) 다음 명령어 주소 (Next Instruction Address): 다음 실행할 명령어의 주소.
- 명령어 설계 시 고려사항:
- 명령어 길이: 고정 길이 또는 가변 길이.
- 필드(Field) 비트 수: 연산 코드, 오퍼랜드 등에 할당되는 비트 수. 이는 오퍼랜드의 범위(표현 가능한 주소 공간)를 결정합니다.
3.2. 프로그램 제어 명령어
프로그램의 실행 흐름을 제어합니다. (예: JUMP, CALL, RET)
- 서브루틴 호출 (CALL)과 복귀 (RET):
- CALL X: 현재 PC(복귀 주소)를 스택에 저장하고, 서브루틴 X의 주소로 점프합니다.
- 마이크로 연산:
MBR <- PC, MAR <- SP, M(MAR) <- MBR, SP <- SP - 1, PC <- X (요약)
- RET: 스택에서 복귀 주소를 꺼내 PC에 저장하여 원래의 실행 흐름으로 돌아갑니다.
- 마이크로 연산:
SP <- SP + 1, MAR <- SP, PC <- M(MAR) (요약)
3.3. 주소 지정 방식 (Addressing Modes)
제한된 오퍼랜드 비트를 사용해 더 넓은 기억장치 공간에 접근하기 위한 방법들입니다.
- 즉시 주소 지정 (Immediate): 오퍼랜드 필드에 데이터 값(상수)을 직접 명시.
- 직접 주소 지정 (Direct): 오퍼랜드 필드(A)에 유효 주소(EA)를 직접 명시.
EA = A
- 간접 주소 지정 (Indirect): 오퍼랜드 필드에 유효 주소를 담고 있는 메모리 주소를 명시.
EA = M(A)
- 묵시적 주소 지정 (Implicit): 오퍼랜드가 누산기(AC)나 스택 포인터(SP) 등 미리 정해진 위치에 있음을 암묵적으로 가정.
- 레지스터 주소 지정 (Register): 오퍼랜드가 레지스터(R)에 있음을 지정.
EA = R
- 변위 주소 지정 (Displacement): 레지스터 값과 주소 필드 값을 더해 유효 주소를 계산.
EA = A + (R)
- 상대 주소 지정 (Relative): PC를 기준 레지스터로 사용. 보수를 이용한 점프 연산 등에 사용.
- 인덱스 주소 지정 (Indexed): 인덱스 레지스터(XR)를 사용. 배열 데이터 접근에 유용.
EA = A + (XR)
- 베이스 레지스터 주소 지정 (Base-Register): 베이스 레지스터(BR)를 사용.
EA = A + (BR)
3.4. CISC vs. RISC
- CISC (Complex Instruction Set Computer): 복잡하고 다양한 가변 길이 명령어를 사용. (범용 컴퓨터, 예: Intel x86)
- RISC (Reduced Instruction Set Computer): 단순하고 규격화된 고정 길이 명령어를 사용. 파이프라이닝에 유리. (특수 목적/모바일, 예: ARM)
4장: 컴퓨터 산술과 논리 연산
4.1. 산술 논리 장치 (ALU) 구조와 기능
ALU는 CPU 내에서 실제 산술 및 논리 연산을 담당하는 회로입니다.
- 주요 구성: 산술 연산기, 논리 연산기, 보수기, 시프터, 상태 레지스터 등.
- 상태 레지스터 (플래그): 연산 결과의 상태를 나타냅니다. 4비트 병렬 가산기의 경우, 제어 비트로 아래와 같은 플래그가 사용됩니다.
- V (Overflow): 부호 있는 수의 연산 결과가 범위를 초과했는지 여부.
- Z (Zero): 연산 결과가 0인지 여부.
- S (Sign): 연산 결과가 음수인지 여부 (최상위 비트).
- C (Carry): 부호 없는 수의 연산에서 자리올림이 발생했는지 여부.
4.2. 주요 연산
- 논리 연산: AND, OR, NOT, XOR 등 비트 단위 연산.
- 가산기 (Adder):
- 반가산기 (Half-Adder): 입력 A, B에 대해 합(S)과 캐리(C)를 출력.
- 전가산기 (Full-Adder): 입력 A, B와 아랫자리 캐리(Cin)에 대해 합(S)과 윗자리 캐리(Cout)를 출력. 다수의 전가산기를 연결하여 비트 병렬 가산기를 구성.
- 감산기 (Subtractor): 뺄셈은 피감수(Subtrahend)에 2의 보수를 취한 후 덧셈을 수행하는 방식으로 구현.
- 시프트 연산 (Shift):
- 논리 시프트: 0을 빈자리로 채우며 이동.
- 산술 시프트: 좌측 시프트는 0을, 우측 시프트는 부호 비트를 복사하여 채움. (나눗셈/곱셈)
- 순환 시프트 (Rotate): 밀려나는 비트가 반대편 끝으로 다시 들어옴.
RLC, RRC 등은 캐리 플래그(C)를 포함하여 순환.
- 곱셈 (Multiplication): 피승수(M)와 승수(Q)를 이용하여 시프트와 덧셈 연산을 반복하여 수행.
5장: 기억 장치 시스템
기억 장치는 속도, 용량, 비용에 따라 계층적으로 구성됩니다.
5.1. 기억 장치의 종류와 특징
- 접근 유형:
- 순차 접근 (Sequential Access): 처음부터 순서대로 접근. (자기 테이프)
- 직접 접근 (Direct Access): 블록 단위로 직접 접근 후 순차 검색. (디스크)
- 임의 접근 (Random Access): 주소를 통해 임의의 위치에 직접 접근. (RAM)
- 연관 접근 (Associative Access): 주소가 아닌 내용으로 데이터 검색. (캐시)
- 전송 단위: 주기억장치는 워드(Word), 보조기억장치는 블록(Block) 단위로 데이터를 전송.
- 성능 척도:
- 접근 시간 (Access Time): 읽기/쓰기 요청부터 완료까지 걸리는 시간.
- 데이터 전송률 (Data Transfer Rate): 초당 전송되는 비트 수.
5.2. 기억 장치 계층 구조
CPU와의 근접성에 따라 레지스터 > 캐시 > 주기억장치(RAM) > 보조기억장치 순으로 구성됩니다. 이는 지역성의 원리(Principle of Locality)에 기반하여, CPU가 자주 사용할 데이터를 더 빠른 장치에 배치함으로써 평균 접근 속도를 향상시키기 위함입니다.
5.3. RAM의 내부 조직
- RAM은 주소 입력선을 통해 특정 위치의 기억 소자 배열에 접근하며, 데이터 선을 통해 데이터를 읽거나 씁니다.
- 기억장치 제어기는 CPU로부터 받은 주소를 행(Row) 주소와 열(Column) 주소로 나누어 처리합니다.
- RAS (Row Address Strobe): 행 주소를 고정시키는 신호.
- CAS (Column Address Strobe): 열 주소를 고정시키는 신호.
5.4. 캐시 메모리 (Cache Memory)
CPU와 주기억장치 사이의 속도 차이를 완화하기 위한 고속 버퍼 메모리입니다.
- 캐시 적중 (Hit): CPU가 찾는 데이터가 캐시에 있는 경우.
- 캐시 실패 (Miss): 데이터가 캐시에 없어 주기억장치에서 가져와야 하는 경우.
- 데이터 인출 방식:
- 요구 인출 (Demand Fetch): 필요할 때만 데이터 인출.
- 선인출 (Prefetch): 필요할 것으로 예상되는 데이터를 미리 인출.
5.5. 캐시 사상(매핑) 방식
주기억장치의 블록을 캐시의 어느 라인에 적재할지 결정하는 규칙입니다.
-
1. 직접 사상 (Direct Mapping)
- 개념: 주기억장치의 각 블록이 캐시의 정해진 특정 라인에만 적재될 수 있는 방식.
- 매핑 함수:
i = j mod m (j: 주기억장치 블록 번호, m: 캐시 라인 수, i: 캐시 라인 번호)
- 기억장치 주소 형식:
[ 태그(t) | 라인(l) | 단어(w) ]
- 태그(t): 캐시 라인에 적재된 블록이 주기억장치의 어느 블록인지 식별.
- 라인(l): 블록이 적재될 캐시 라인 번호.
- 단어(w): 블록 내에서의 특정 단어 위치.
- 장단점: 구현이 간단하나, 다른 태그를 가진 블록들이 동일한 캐시 라인을 두고 경쟁하는 충돌(Conflict)이 발생할 수 있습니다.
-
2. 완전 연관 사상 (Fully-Associative Mapping)
- 개념: 주기억장치의 블록이 캐시의 어느 라인이든 비어있는 곳에 적재될 수 있는 방식.
- 기억장치 주소 형식:
[ 태그(t) | 단어(w) ]
- 태그(t): 주기억장치 블록 번호 전체가 태그로 사용됨.
- 장단점: 캐시 공간 활용률이 높고 충돌이 없으나, 원하는 데이터를 찾기 위해 모든 라인의 태그를 동시에 비교해야 하므로 검색 회로(연관 기억장치)가 복잡하고 비용이 높습니다.
- 교체 알고리즘: 캐시가 가득 찼을 때 특정 라인을 비워야 하며, 이때 LRU(Least Recently Used), LFU(Least Frequently Used), FIFO(First-In, First-Out) 등의 알고리즘이 사용됩니다.
-
3. 세트 연관 사상 (Set-Associative Mapping)
- 개념: 직접 사상과 완전 연관 사상을 절충한 방식. 캐시를 여러 개의 세트(Set)로 나누고, 각 블록은 정해진 세트 내에서는 어느 라인이든 자유롭게 적재될 수 있습니다.
- 매핑 함수:
k = j mod v (j: 주기억장치 블록 번호, v: 캐시 세트 수, k: 캐시 세트 번호)
- 기억장치 주소 형식:
[ 태그(t) | 세트(s) | 단어(w) ]
- 태그(t): 블록 식별 정보.
- 세트(s): 블록이 적재될 캐시 세트 번호.
- 단어(w): 블록 내 단어 위치.
- 특징: 세트 내에 라인이 1개면 직접 사상과 같고, 전체 캐시가 1개의 세트로 구성되면 완전 연관 사상과 같습니다. 직접 사상보다 충돌률이 낮고, 완전 연관 사상보다 회로가 간단합니다. 세트 내에서 교체 알고리즘이 필요합니다.