Search
Duplicate
📒

[독학사 4단계] 통합컴퓨팅시스템 정리 (1) 컴퓨터구조

간단소개
독학사 4단계의 통합컴퓨팅시스템 과목을 공부하며 정리한 내용입니다
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
CS
Scrap
태그
9 more properties
Last update 24.10.20 - 공부중인 내용이므로 변경하고 있습니다. - 틀린 내용은 언제든지 지적 부탁드립니다! - 파란색 배경으로 강조된 부분은 예시문제에 나온 내용입니다.

1. 작동방식

컴퓨팅시스템 개요

컴퓨터의 역할 I = P(D)
Data를 어떻게 저장할 지 = 데이터베이스
Process를 어떻게 할 지 = 알고리즘
알고리즘을 어떻게 구현할 지 = 통합프로그래밍
어떤 시스템을 사용할 지 = 통합컴퓨팅시스템
컴퓨팅시스템은 정보처리를 위한 시스템
하드웨어(← 논리회로, 컴퓨터구조 과목)와 소프트웨어(← 운영체제 과목)의 상호작용
하드웨어
중앙처리장치: 제어장치, 산술논리연산장치, 레지스터
기억장치: 주기억장치(RAM/ROM), 보조기억장치, 캐시(메모리 계층구조)
입출력장치
시스템 버스: 제어 버스,주소 버스,데이터 버스
소프트웨어: 시스템 소프트웨어, 응용 소프트웨어
시스템 소프트웨어의 구분
제어 프로그램: 감시 프로그램, 작업제어 프로그램, 데이터 관리 프로그램
처리 프로그램: 언어 번역기, 서비스 프로그램, 문제해결 프로그램
언어 번역 프로그램 Note. Compiler Driver: 컴파일 과정을 하나로 묶어둔 패키지 Note. Compiler vs Interpreter: 목적 프로그램의 생성 여부
컴파일러: 원시코드 → 어셈블리어 → 목적 프로그램
어셈블러: 어셈블리어 → 목적 프로그램
링커: 정적 링킹 / 동적 링킹
로더: 할당(메모리 등 자원 할당), 연결(동적 링킹된 라이브러리 연결), 재배치(실주소 변경), 적재(페이지 적재)
하드웨어와 소프트웨어는 상호의존적이며 보완적 ex. 가상메모리 시스템: MMU(하드웨어) + TLB 관리(소프트웨어)
컴퓨터의 역사
회로 소자의 발달로 컴퓨터의 역사 구분
1세대: 진공관
기계적 데이터 표현 → 전기적 데이터 표현
기계어, 어셈블리어 - 프로그램 내장형 컴퓨터
2세대: 트랜지스터
고급 프로그래밍 언어 - 시스템 라이브러리, 컴파일러
일괄 처리 시스템
3세대: 집적회로(IC)
소형화, 기억용량 증대
멀티 프로세스
4세대: 고밀도 집적회로(LSI/VLSI)
반도체 비용 감소 → 개인용 컴퓨터 보급 → 네트워크 발달
시분할 시스템, GUI, 분산시스템

논리회로

부울 대수

하드웨어는 전기적 신호를 처리하는 논리회로
신호의 전압에 따라 상태를 구분: 기준 전압 → 0(Low)과 1(High) 구분
노이즈 등의 영향을 줄이기 위해 두 가지 상태만 사용
부울 대수는 논리학을 기반으로 0과 1만을 사용하는 대수 규칙
0(거짓), 1(참)의 상태와 합 , 곱, 보수, 배타적 논리합 등의 연산을 사용하는 대수 체계
논리연산 → 불 대수
논리회로를 불 대수로 표현 가능 = 회로 검증, 간소화
부울 대수의 연산규칙
기본 연산
X
Y
x+yx + y
xyx \cdot y
xyx \oplus y
x\overline{x}
0
0
0
0
0
1
0
1
1
0
1
1
1
0
1
0
1
0
1
1
1
1
0
0
부울 대수의 연산규칙
교환법칙: x+y=y+xx + y = y + x, xy=yxx \cdot y = y \cdot x
결합법칙: (x+y)+z=x+(y+z)(x + y) + z = x + (y + z), (xy)z=x(yz)(x \cdot y) \cdot z = x \cdot (y \cdot z)
분배법칙: x(y+z)=xy+xzx(y + z) = xy + xz, (x+y)(x+z)=x+yz(x + y)(x + z) = x + yz
지배법칙: A+0=AA + 0 = A, A0=0A \cdot 0 = 0
항등법칙: A1=AA \cdot 1 = A, A+1=AA + 1 = A
멱등법칙: A+A=AA + A = A, AA=AA \cdot A = A
보수법칙: A+A=1A + \overline{A} = 1, AA=0A \cdot \overline{A} = 0
이중 보수법칙: A=A\overline{\overline{A}} = A
흡수법칙: x+xy=xx + xy = x, x(x+y)=xx(x + y) = x
드모르간의 법칙: xy=x+y\overline{xy} = \overline{x} + \overline{y}, x+y=xy\overline{x + y} = \overline{x} \cdot \overline{y}
합의의 정리
한 번은 일반항으로, 한 번은 보수로 나타난 변수가 포함된 식 = 적항
적항에 연산된 나머지 항 = 잉여항
xy+yz+xz=xy+xzxy + yz + \overline{x}z = xy + \overline{x}z
(x+y)(y+z)(x+z)=(x+y)(x+z)(x + y)(y + z)(\overline{x} + z) = (x + y)(\overline{x} + z)
쌍대성의 원리
부울 함수의 표현
최소항 = 참 = SOP(Sum of Product)
최대항 = 부정 = POS(Product of Sum)
ex. F={1,3}F = \{1, 3\} =xy+xy= \overline{x}y + xy (SOP형: 출력이 1이 되도록 하는 최소항의 합 = 1 + 3) =(x+y)(x+y)= (x + y)(\overline{x}+ y) (POS형: 출력이 0이 되도록 하는 최대항의 곱 = 0 * 2)
부울 함수의 간소화
카르노 맵
진리표의 특수한 형태 - 변수가 1비트만 다르도록 나열: 00, 01, 11, 10
인접한 항을 2의 거듭제곱만큼 묶으면 간소화 가능 (SOP형에서는 1인 칸을, POS형에서는 0인 칸을 묶는다)
연산규칙 활용
논리게이트
트랜지스터, 저항 등을 조합하여 논리연산 구현
게이트를 조합해서 논리회로 구성
기억능력이 있으면 (= 피드백 회로가 있으면) 순차논리회로, 없으면 조합논리회로
AND 게이트, NAND 게이트
OR 게이트, NOR 게이트
XOR 게이트, XNOR 게이트
NOT 게이트

조합논리회로

입력 변화에 따라 출력이 변화하는 회로
저장을 위한 기억소자 없이 논리게이트로만 구성
입력 변화가 전파되는 시간이 필요하므로, 지연이 발생
인코더, 멀티플렉서
인코더(ex. 8x3): 2n2^n개의 입력에 대해 n비트 출력이 나오는 회로 (부호화)
멀티플렉서(ex. 8x1): 2n2^n개 입력을 n비트 선택선을 이용해 선택해서 하나의 입력이 나오는 회로
디코더, 디멀티플렉서
디코더(ex. 3x8): n비트 입력에 대해 2n2^n개의 출력이 나오는 회로 (복호화)
디멀티플렉서(ex. 1x8): 1비트 입력, n비트 선택선에 대해 2n2^n개 중 하나의 선로로만 입력이 나오는 회로
가산기/감산기
반가산기(XOR + AND)/전가산기(전가산기 2개 + OR)
반감산기(반가산기 + NOT)/전감산기
부호 비트를 활용한 가감산기
가산기의 병렬처리

순차논리회로

입력 뿐 아니라 상태에 따라 출력이 결정되는 회로
조합회로와 기억회로(피드백 회로)로 구성
직전 상태를 기억
클럭 여부에 따라 동기식(클럭 O)과 비동기식(클럭 X)으로 구분
변화 시점에 따라 레벨 트리거와 에지 트리거로 구분
플립플롭: 동기식 에지 트리거
SR
S는 상태를 1로, R은 상태를 0으로 변경. 입력이 (0, 0)이면 이전상태
기본적인 플립플롭의 형태
(1, 1)을 입력으로 받을 수 없으므로 JK플립플롭 사용
JK
SR 플립플롭의 개선판
J = S, K = R
(0,0), (0,1), (1,0)은 SR 플립플롭과 동일. (1,1)일 때는 상태 반전
T(JK→T)
JK 플립플롭의 특수한 형태(J=K=T)
입력이 0이면 기존 상태 유지, 입력이 1이면 상태 반전
D(SR→D)
D 플립플롭의 특수한 형태
입력이 곧 다음 상태
그럼 왜? 클럭 신호에 맞춰 신호를 주기 위해!
클럭 신호가 있어야 플립플롭의 출력이 변경된다는 점 이용
클럭 전 까지는 이전 출력이 D 플립플롭에서 나오고 있는 상황
클럭 신호가 있으면 그제서야 출력 변경 = 버퍼 역할
래치: 비동기식 레벨 트리거
순차논리회로의 응용
입출력 방식 구분
직렬방식: 한 번에 하나의 비트 전달. 간단한 회로이지만 여러 사이클이 필요
병렬방식: 한 번에 모든 비트 전달. 전송 속도가 빠르지만 회로가 복잡
입출력에 각각 어떤 방식을 쓰는지에 따라 4가지 입출력 방식이 있음 (직렬입력-병렬입력, 병렬입력-병렬출력, …)
레지스터
카운터

컴퓨터 연산

정수형 자료형

보수 표현방식
n진수 → n의 보수(합이 n자릿수+1n^{자릿수+1} ), n-1의 보수(합이 n자릿수+11n^{자릿수+1} - 1 )
ex. 880 10의 보수: 120 9의 보수: 119
n의 보수는 n - 1의 보수에서 1을 더하는 것과 같음
부호화 크기 표현방식(Signed-Magnitude Representation)
나머지 비트는 그대로 두고, MSB로 부호 표현
연산 불가능
1의 보수 표현 (1’s Complement Representation)
1의 보수를 취해 음수 표현
이진법에서 1의 보수는 각 비트를 뒤집는 것과 같음
0 vs -0 문제와 캐리 문제 발생
2의 보수 표현(2’s Complement Representation)
2의 보수를 취해 음수 표현
GOAT. 부호화 크기 방식과 1의 보수 표현의 문제 해결
ex. -7을 8비트 표현 부호화 크기 표현 방식: 1000 0111 1의 보수 표현 방식: 1111 1000 2의 보수 표현 방식: 1111 1001
산술논리연산장치(ALU)에는 보수기가 있어서 보수 표현을 간단하게 해결
2의 보수 표현 방식의 연산
덧셈, 뺄셈
곱셈, 나눗셈

실수형 자료형

고정소수점 vs 부동소수점
IEEE 754
단일정밀도(Single Precision)
32비트 = 1(sign) + 8(exponent) + 23(mantissa)
모든 시스템에 구현
배정밀도(Double Precision)
64비트 = 1(sign) + 11(exponent) + 52(mantissa)
더 큰 범위나 정밀도가 필요한 경우 사용
전용 레지스터와 명령어 (→ 연산 파이프라인)
덧셈, 뺄셈
곱셈, 나눗셈

2. 구성요소

중앙처리장치

명령어 구성

각 명령어(instruction)는 연산자(opcode)와 피연산자(operand)로 구성
연산자: 어떤 작업을 수행할 지 명시 - 연산코드(산술/논리연산, 자료 전달, 분기 등) + 명령어 형식 + 주소지정방식
피연산자: 연산에 필요한 자료 - 상수, 레지스터 번호, 메모리 주소
연산자마다 필요로 하는 피연산자의 개수가 다르다
0-주소 명령어 (ex. ret)
1-주소 명령어 (ex. push $RSP)
2-주소 명령어 (ex. mov [$rsp + 0x16], $rax): 입출력 1, 입력 1
3-주소 명령어 (ex. imul $eax, [$rsp + 0x16], 4): 입력 2, 출력 1
note) x86과 같은 CISC는 이러한 분류로 명확하게 나누어지지 않는다. 0x55(push $esp)와 같이 0주소 명령어처럼 보이지만 opcode에 피연산자가 포함되어 있는 경우도 있고, imul 과 같이 하나의 인스트럭션이 여러 주소 형식을 갖는 경우도 있다

주소 지정 방식

연산자에 따라 피연산자를 다르게 해석
유효주소: 실제로 사용할 데이터가 저장된 위치
operand의 값을 적절하게 해석해서 실제 참조할 데이터가 있는 유효주소를 계산 (→ 적은 비트 수로 더 많은 주소 사용)
opcode는 작업의 종류와 주소 지정 방식을 모두 포함
직접 주소 지정 방식(Direct Addressing): 그대로 유효주소로 사용 (ex. push [0xdeadbeef])
즉치 주소 지정 방식(Immediate Addressing = Imm): 상수 값을 그대로 사용 (ex. push 0x16)
묵시적 주소 지정 방식(Implied Addressing): opcode에 피연산자 정보 포함 (ex. 0x55 = push $rsp)
레지스터 주소 지정(Register Addressing): 레지스터 번호를 유효주소로 사용 (ex. push $rsp)
간접 주소 지정(Indirect Addressing): 주소에 저장되어 있는 다른 주소를 유효주소로 사용
Note) x86에는 간접 주소 지정 방식이 없음
레지스터 간접 주소 지정방식(Register-Indirect Addressing Mode): 레지스터에 저장된 주소를 유효주소로 사용 (ex. push [$rax])
변위 주소 지정 방식(Displacement Addressing Mode): 레지스터 간접 주소 + 직접 주소
레지스터에 저장된 값을 기준으로, 피연산자에 저장된 주소만큼 이동하여 유효주소 결정
상대 주소 지정 방식(Relative Addressing Mode): PC + 변위(ex. mov $rsi, [$rip + 0xff])
인덱스 주소 지정 방식(Indexed Addressing Mode): 인덱스 레지스터 + 변위(ex. cmp [$rsi + 0xff], 0xff)
베이스-레지스터 주소 지정 방식(Base-Register Addressing Mode): 스택 포인터 등의 베이스 레지스터 + 변위(ex. push [$rbp - 0xff])
Note) 세그먼테이션 기법 → 세그먼트 레지스터

명령어 종류

데이터 전달 명령어(ex. MOV)
산술,논리 연산 명령어(ex. LEA, SHR, AND, ADD)
분기 명령어(ex. JMP, JNE, CALL, RET)
기타 명령어
인터럽트 명령(ex. INT, SYSCALL)
입출력 전송(for PMIO) (ex. IN, OUT)

구성요소

ALU(연산)
가산기, 보수기, 이동기(Shifter) 등으로 구성
제어장치에서 명령을 받아 연산을 수행하고 레지스터(ACC) 및 상태 플래그 갱신
레지스터(저장)
ALU 관련 레지스터
ACC(Acculmulator)
Status Flags(CF, OF, ZF, SF, …)
제어장치 관련 레지스터
System Flags(Interrupt, Real Mode, …)
PC(Program Counter)
IR(Instruction Register)
버스 관련
MAR(Memory Address Register)
MBR(Memory Buffer Register)
제어장치(제어)
제어신호 발생기, 주소 처리기 등으로 구성
명령어(=외부신호) 해석 후 제어신호(=마이크로연산)를 만듦
ALU의 결과에 따라 다음 연산 결정
제어신호 발생기 구성방식
마이크로프로그램 제어방식: 제어장치 내부 ROM → 명령어에 따라 ROM에 저장된 제어 워드 인출
하드와이어 제어방식: 명령어에 따라 순차, 조합논리회로에서 제어 워드 생성
내부버스(전달)
주소 버스, 제어 버스, 데이터 버스로 구성
내부 버스 ≠ 외부 버스(시스템 버스, IO 버스 (→ DMA, 사이클 스틸링))
외부 버스(시스템 버스)와의 연결경로 - 버퍼 레지스터(MAR, MBR), 시스템 버스 인터페이스

명령어 사이클 (2단계 명령어 사이클)

명령어 처리 흐름
1.
인출 사이클: Fetch, Decode
2.
[간접 사이클]: Operand Fetch
3.
실행 사이클: Execution
4.
[인터럽트 사이클]: 필요시 커널로 컨텍스트 스위칭, ISR 호출 후 복귀
5.
연산 결과에 따라 PC 설정(조건부 분기), 인출 사이클부터 반복
인출 사이클
명령어 인출(Fetch) MAR ← PC PC ← PC + 1 MBR ← [MAR] IR ← MBR
명령어 해독(Decode)
IR에 저장된 워드 중 연산코드는 제어신호 발생기로, 피연산자는 주소 처리기로 이동
제어 신호 발생기에서는 명령어를 해독해 마이크로 연산을 단계적으로 실행
제어 워드를 만들어 내부 버스로 전달
간접 사이클 = 피연산자 인출(Operand Fetch)
실행 사이클 (Execution)
인터럽트 사이클
하나의 명령어를 끝낸 후에 인터럽트 발생 확인
인터럽트가 있으면 ISR 호출

고성능 컴퓨팅

파이프라이닝
하나의 코어에서 여러 명령어를 동시에 실행하는 병렬 처리 기법
인스트럭션은 인출, 해독, 실행, 재기록 단계를 순차적으로 진행
명령이 실행 단계에 있으면 인출, 해독을 위한 기능 유닛은 유휴 상태
유휴 시간을 줄이기 위해 다음 명령어를 미리 인출, 해독하여 명령어 실행을 중첩 ⇒ 처리량(Throughput) 증가
파이프라이닝 종류
슈퍼 파이프라인: 하나의 사이클이 끝나기 전에 다음 사이클을 시작하여 처리 속도를 높이는 기법
슈퍼스칼라: 파이프라인된 기능 유닛을 여러 개 두어 명령어를 병렬로 실행하는 기법
VLIW/EPIC: 컴파일러 단에서 명령어를 분석하여 병렬 실행 가능한 명령어를 삽입해 처리하는 기법
명령어 파이프라이닝
2단계 파이프라이닝
명령어 인출 - 명령어 실행 사이클
but, 파이프라인을 위해서는 인출과 실행 단계의 처리시간을 같게 맞춰야 할 필요
가장 긴 처리시간에 맞추기 위해 기다려야 함 = 효율
4단계 파이프라이닝
인출(Fetch) - 해독(Decode) - 실행(Execution) - 재기록(Write Back) 사이클
단계를 세분화할수록 단계별 처리시간을 줄일 수 있고, 여러 명령어를 중첩할 수 있음
but, 무작정 단계를 늘리면 회로가 복잡해지고 해저드가 더 자주 발생
연산 파이프라이닝
정수형 자료의 곱셈이나 실수형 자료의 연산같이 복잡한 연산을 여러 단계로 나누어 병렬처리
ex) 부동소수점 덧셈을 위한 파이프라인
1.
(A) 수 a와 b의 지수부를 비교
2.
(A) 지수가 일치하도록 정규화 (B) 기수가 일치하도록 정규화
3.
(B) 기수의 덧셈연산
4.
(A) 정규화된 지수 저장 (B) 계산된 기수 저장
파이프라인 해저드
구조적 해저드
하드웨어 자원이 부족하여 명령어 간 자원 충돌이 발생하는 상황
파이프라인에 들어간 각 명령어가 요구하는 기능 유닛이 충분하지 않은 경우 처리 지연이 생김
ex) 메모리 포트가 하나인 CPU에서, LOAD [M1], [M2] 같이 두 번의 포트 접근이 필요한 인스트럭션 실행
해결: 자원 확장, 버블 삽입(Pipeline Stall), 명령어 제약
ex) Intel x86: 다중 ALU, 메모리-메모리 이동 명령어 금지
데이터 해저드
앞선 명령어의 결과가 다음 명령어에서 필요할 때 발생하는 문제
RAW(Read After Write), WAR(Write After Read), WAW(Write After Write) 유형
해결: 비순차적 실행(Out-of-Order Execution - 의존성이 있는 오퍼랜드의 재배치), 오퍼랜드 전달(Operand Forwarding - 재기록 전에 ALU로 전달), 버블 삽입
제어 해저드
분기 명령어의 결과가 결정되기 전까지 다음 명령어를 파이프라인에 넣을 수 없는 상황
버블을 계속 삽입하면 낭비되는 사이클이 너무 많음
해결: 브랜치 예측 → 예측된 명령어를 일단 실행
예측이 맞으면 재기록하고 계속 진행
예측이 틀리면 잘못된 명령어를 무효화하고 올바른 명령 실행
Note) 병행 처리 문제는 데이터베이스의 트랜잭션 처리에서도 중요하게 다루는 문제
트랜잭션의 의존성을 파악해서 직렬화 비순차적 실행
2단계 로킹 버블 삽입
멀티코어
하나의 프로세서 안에 여러 개의 CPU코어를 탑재한 구조
각각의 코어는 독립적인 ALU, CU, 레지스터를 갖지만 캐시 등 자원을 공유
Note) MESI 프로토콜: 각 코어의 d-cache를 동기화하여 일관성 유지
but 포트 개수나 버스 대역폭 등은 한계가 있어서 코어 수에 비례해 성능이 증가하지 않음
하이퍼쓰레딩(SMT)
SMT는 하나의 코어에서 동시에 여러 쓰레드를 처리하는 기술
SMT와 슈퍼스칼라는 하드웨어 자원을 병렬로 활용한다는 점에서 기능적으로 유사
하지만, 각각 TLP와 ILP를 위한 기술임
ILP(Instruction-Level Parallelism): 하나의 명령어를 병렬로 실행하는 데에 집중
TLP(Thread-Level Parallelism): 쓰레드 단위로 병렬 실행하는 데에 집중
최신 프로세서들은 멀티코어 + SMT + 파이프라인을 모두 사용해 고성능으로 처리함
Note) 멀티코어 ≠ 멀티프로세서

ISA

CISC(Complicated Instruction Set Computer)
다수의 명령어, 다양한 주소 지정 방식, 가변 명령어 길이: 명령어의 개수를 줄여 성능 향상
RISC에 비해 코드 길이가 짧음, 기능이 많음 = 고성능 PC에 유리
회로 구성이 어려움(→마이크로프로그램 제어방식)
파이프라이닝이 어려움 - 최근에는 CISC를 사용하는 아키텍쳐에서도 CPU 내부에서 하나의 명령어를 몇 개의 부 명령어로 나누어 RISC처럼 작동
ex) x86-64, PowerPC 등
RISC(Reduced Instruction Set Computer)
적은 수의 명령어, 한정적인 주소 지정 방식, 고정 명령어 길이: 명령어당 실행시간을 줄여 성능 향상
CISC에 비해 코드 길이가 긺, 기능이 적음
회로 구성이 간단함(→하드와이어드 제어방식)
파이프라이닝에 유리함 = 임베디드 등 저전력 설계에 유리
ex) ARM, AVR, RISC-V 등

기억장치

기억장치 분류

기억장치는 프로그램과 데이터를 저장
분류 기준
CPU에 대한 물리적인 접근성: 레지스터 > 캐시메모리 > 주기억장치 > 보조기억장치
접근방법
임의접근(Random Access): 주소를 알면 즉시 그 위치에 접근 가능
직접접근(Direct Access): 가장 가까운 주소로 이동한 후 순차적 접근
순차접근(Sequential Access): 저장된 순서에 따라 순차적 접근
저장성질: 휘발성(Volatile), 비휘발성(Non-volatile)
저장방식: 반도체, 자기장, 광학 등
대표적인 기억장치
장치
계층
CPU 접근성
접근방법
저장성질
저장방식
SRAM
캐시 메모리
CPU 내부
임의 접근
휘발성
반도체(플립플롭)
DRAM
주기억장치
시스템 버스(직접 통신)
임의 접근
휘발성
반도체(커패시터)
ROM
주기억장치
시스템 버스(직접 통신)
임의 접근
비휘발성
반도체(물리적 회로)
자기디스크
보조기억장치
시스템 버스(주기억장치에 로드)
직접 접근
비휘발성
자기장
SSD
보조기억장치
시스템 버스(주기억장치에 로드)
임의 접근
비휘발성
반도체(NAND 플래시)
광디스크
보조기억장치
시스템 버스(입출력장치)
직접 접근
비휘발성
광학

기억장치 계층구조

기억장치 계층구조
병목은 주로 CPU 안팎으로 데이터를 전달하는 상황에서 발생
접근속도와 비용은 반비례하므로, 지역성을 활용한 기억장치 계층구조 사용
프로그램이 사용하는 데이터는 일정한 지역성을 가져서, 접근이 반복된다는 특징이 있음
공간적 지역성(Spatial Locality): 물리적으로 인접한 데이터를 자주 사용 ex) 배열
시간적 지역성(Temporal Locality): 한 번 사용한 데이터를 다시 사용 ex) 반복문 코드
상위 계층은 하위 계층의 지역성을 활용하는 캐시 역할 ⇒ CPU는 상위 계층의 빠른 속도와 하위 계층의 큰 용량을 모두 사용
하위 계층으로 갈 수록 접근속도가 느려지고, 용량과 비용이 커지는 특성
레지스터
CPU 내부에 위치, 연산에 직접 사용하는 데이터
캐시메모리
CPU 내부에 위치, 주기억장치의 접근속도 증가
주기억장치
CPU 외부에 위치, 실행중인 프로세스의 정보 저장
Note) 프로그램이 주기억장치에 로드되어야 실행중인 프로세스가 됨
보조기억장치
느리지만 비휘발성, 큰 용량 → 주기억장치를 보조 (보조기억장치는 CPU와 직접 통신 X)
Note) 가상메모리 시스템에서 페이지는 보조기억장치에 있다가 주기억장치로 적재됨

주기억장치

RAM
DRAM(Dynamic Random Access Memory)
캐퍼시터에 저장: 리프래시가 필요하고 동작이 느리나 집적화에 유리
SDRAM(Synchronus RAM), DDR(Double Data Rate)등 다양한 방식이 있음
주기억장치에 사용
SRAM(Static Random Access Memory)
플립플롭에 저장: 리프래시가 필요 없고 동작이 빠르나 가격이 비싸고 집적화에 한계
캐시메모리에 사용
ROM
펌웨어나 BIOS같은 프로그램을 저장하는 데 사용 → 저장된 프로그램을 수정할 필요가 없음
읽기 전용이므로 제어신호가 없음(주소버스, 데이터 버스와만 연결)
종류에 따라 재기록이 가능하기도 함
Masked ROM: 제조 시 물리적으로 데이터 기록, 수정 불가능
PROM: WORM으로, 한 번 기록하면 끝
EEPROM: 전기적으로 내부 데이터를 쓸 수 있음 → 플래시 메모리로 발전

캐시 기억장치

CPU와 중앙처리장치의 속도 차이를 극복하기 위해 사용
CPU → MMU 캐시 ( 주기억장치 보조기억장치)
찾으려는 데이터가 있으면 Cache Hit, 없으면 Cache Miss
캐시 미스 발생시 캐시 라인을 교체하고 주기억장치에서 캐시로 데이터 이동. 이후 CPU에 전달
캐시 매핑(사상) 정책
직접 매핑(Direct Mapping)
주기억장치의 주소를 캐시 라인에 매핑 ex) [0x01, 0x11]은 1번 라인에, [0x02, 0x12]는 2번 라인에 저장
주소를 인덱스-태그로 분리
인덱스를 캐시 라인의 주소로 사용, 태그 + 데이터를 기록
간단하지만 적중률이 매우 낮음 - 잦은 교체
연관 매핑(Associative Mapping)
주소 전체 + 데이터를 기록
캐시되어있는지 확인하려면 캐시 전체를 검색해야 하므로 회로가 복잡하고 오버헤드가 큼
집합-연관 매핑(Set-Associative Mapping)
직접 매핑과 연관 매핑을 합친 형태
한 라인에 n개의 데이터를 저장(set) = n-way set-associative cache (직접 매핑은 1-way set-associative cache)
주기억장치의 주소별로 어떤 set에 저장될 지는 결정
하나의 set에서 데이터를 찾을 때에는 연관 매핑처럼 캐시의 태그를 사용
Note) 캐시라인과 주기억장치의 매핑 방법은 분산 데이터베이스의 파티셔닝과 유사
직접 매핑 해시 분할
집합 연관 매핑 목록 분할
캐시 교체 정책
FIFO(First-In-First-Out): 오래된 캐시 라인을 교체
LFU(Least Frequently Used)
LRU(Least Recently Used)
캐시 쓰기 정책
즉시 쓰기(Write-Through)
캐시와 주기억장치 모두에 기록
데이터의 일관성을 보장할 수 있지만, 쓰기 작업은 캐시 사용의 효과가 없음
나중 쓰기(Write-Back)
캐시에만 변경을 기록, 캐시 교체 시에 주기억장치에 기록
캐시 사용의 효과를 극대화할 수 있지만, 데이터의 불일치가 발생할 수 있음
특히, 멀티 코어 프로세서는 캐시 동기화가 필요

보조 기억장치

자기디스크
SSD
RAID

입출력장치

시스템 버스

버스 구분
기능에 따른 구분: 데이터버스, 주소버스, 제어버스
소유에 따른 구분: 전용 버스(기능별 전용 버스), 다중화 버스(하나의 선로를 여러 용도로 사용)
타이밍에 따른 구분: 동기식 버스, 비동기식 버스
버스 중재
버스 구조는 하나의 선로에 여러 장치가 연결 → 경합 발생
동시에 버스 요청이 있을 때 정해진 기준에 따라 권한 부여(= 버스 마스터 선택)
버스 중재 방식
중앙집중식 병렬 중재 방식
하나의 버스 중재기에 장치가 병렬로 연결
장치 수만큼 버스 요청 신호선과 버스 승인선이 필요
중앙집중식 직렬 중재 방식
데이지 체인 방식 = 직렬로 연결된 선을 따라 버스 요청/승인 신호 전달
장치의 버스 독점 사용 문제
폴링 방식
버스 중재기가 주기적으로 장치의 상태를 확인
폴링선이 많이 필요
Note) HDLC 프로토콜의 요청 제어와 유사 (폴링, 요청 방식)
버스 중재기 ← 입출력 제어기 또는 중앙처리장치
IO버스
CPU와 RAM은 입출력장치에 비하면 고속
버스의 대역폭을 확보하기 위해 입출력 장치가 직접 연결된 버스를 구분
IO버스와 시스템 버스는 입출력 제어기를 통해 연결

입출력장치 제어

입출력장치 제어기(Device Controller)
입출력장치 내부 부품
입출력장치의 하드웨어 제어
전송속도 제어(버퍼링), 오류 검출, 타이밍 제어 기능
입출력 제어기(I/O Controller)
컴퓨팅시스템의 부품 - DMA 컨트롤러, IO 프로세서 등
CPU의 명령 수행, 버스 중재

입출력 주소지정

MMIO(Memory-Mapped I/O)
주기억장치 주소 영역의 일부분을 입출력장치에 할당
주기억장치와 같은 명령어를 사용하여 입출력 작업
PMIO(Port-Mapped I/O, Isolated I/O)
별도 주소 영역을 사용
특수 명령어를 사용하여 입출력 작업

입출력 방법

CPU 제어
Programmed I/O: CPU가 지속적으로 폴링하며 상태 확인, 입출력 제어
Interrupt-Based I/O
CPU가 입출력 명령어를 보내면 장치에서 수행이 끝난 후 인터럽트 발생
입출력장치 CPU로 데이터 전송
어느 장치에서 IO 인터럽트가 발생했는지 식별해야 함
다수의 인터럽트선
소프트웨어 폴
별도 처리기 사용
DMA(Direct Memory Access)
인터럽트 기반 IO와 유사하지만, 입출력장치에서 주기억장치에 직접 접근
입출력장치 RAM으로 데이터 전송
DMA 처리기에서 관리
제어회로, 주소 레지스터, 데이터 레지스터, 단어 계수 레지스터로 구성
DMA를 사용한 입출력 과정
1.
CPU → DMA: 입출력 명령어 전송
2.
DMA → CPU: Bus Request
3.
CPU → DMA: Bus Grant
4.
IO장치 → RAM (또는 RAM → IO장치): 데이터 전달
5.
DMA → CPU: Interrupt
입출력 요청 시 워드 수 전달 → 단어 계수 레지스터를 1씩 감소시키며 데이터 전달
Note) DMA 처리기가 버스를 사용중이면 CPU의 버스 사용은 지연됨(사이클 스틸링)
Channel I/O
별도의 입출력 프로세서(IOP) 사용
메인프레임 등 대형 시스템에서 사용하는 방식
DMA와 유사, IOP RAM
여러 개의 입출력 장치를 동시에 관리, 채널을 시분할 공유(멀티플렉싱)