
컴퓨터 구조 및 설계(David A. Patterson & John L. Hennessy) 와 학부 '컴퓨터 구조' 강의를 기반으로 이해한 내용을 정리하였습니다.
컴퓨터 구조를 이해하기 위한 하드웨어적 기반을 다져보려 합니다.
주구장창 AI를 공부하기 위해 프로그래밍 언어, 자료구조, 알고리즘 이런 것들만 공부해오면서 늘 따라다니던 몇 가지 단어들이 있었어요.
메모리, CPU 등등
늘 추상적인 코딩만을 배워오다가 코딩이 잘 실행되기 위해서 고려해야할 중요한 사항은 하드웨어였죠.
LLM, Graphics 등 복잡한 연산을 위해서는 그래픽카드가 매우 중요하다는 것은 젠슨 황 형님을 비롯해서 많은 곳에서 우린늘 들어왔기에 익히 체감하고 있습니다.
나중에 소프트웨어를 연구를 하더라도 하드웨어에 대한 이해가 필수임을 알고 있었지만 늘 쉬쉬했습니다.
이 기회로 제대로 컴퓨터를 파헤쳐 봅시다.
이 과목을 A+ 받으면 조립 컴퓨터 견적을 더 잘 짤 수 있을까요? ㅎ
컴퓨터 구조 과목의 궁극적 목적은 소프트웨어를 효과적으로 실행하는 방법을 체득함에 목적이 있습니다.
그 기반 기술로서 디지털 논리회로의 개념을 먼저 라이트하게 짚고 넘어가야 이해가 더 효율적입니다.
Digital System
Digital System은 이산적(discrete)인 정보를 처리하는 시스템입니다.
- 시스템: input을 받아서 output을 내보내는 장치
디지털 시스템의 핵심 구성요소
- 이산적 입력(Discrete Inputs)
- 이산적 출력(Discrete Outputs)
- 시스템 상태(System State)
상태(State)의 개념
상황을 가정해봅시다. 친구한테 '내일이 며칠이냐?' 라는 질문을 받았다면 우리는 오늘이 며칠인지를 알아야 할꺼에요.
이 때 '오늘 날짜' 는 상태가 되겠죠.
즉, 상태는 영구불변한 것이 아닌 시간이 지남에 따라 변한다는 것을 의미합니다.
함수로 표현한다면
input = "Plus 1" # 하루 더한 날
state = "오늘 날짜"
시스템은 입력과 상태를 결합하여 output(내일 날짜)을 생성할 거에요. 상태도 discrete하게 저장되고 적절히 업데이트 하겠죠.
신호(Signal)
Signal은 물리적 양으로 표현되는 정보 변수 입니다.
디지털 시스템에서는 discrete 값을 취하고, 가장 보편적인 형태로 이진 값(Binary Values), 즉 두 단계(Two Level) 입니다.
이진 값은 우리가 알고 있는 이진법 뿐만 아니라 여러가지로, 다양하게 표현할 수 있어요.
숫자로는 우리가 알고 있듯이 0과 1
논리로는 True / False
전압으로는 Low / High
스위치로는 Off / On
전압 범위와 이진 신호
이론적으로는 0V = 0, 1V = 1 처럼 딱 떨어지면 좋겠지만, 실제 물리 세계는 연속적(continuous)이에요.
전압이 급격히 떨어지거나 올라가는 것이 아니라 완만하게 변화하죠.
그래서 이를 극복하기 위해서 범위(Range)를 설정합니다.
출력 기준은 엄격하게
- 0.9V 이상이면 HIGH(1), 0.1V 이하면 LOW(0)
입력 기준은 너그럽게
- 0.6V 이상이면 HIGH, 0.4V 이하면 LOW

출력은 엄격하고 입력은 유연한 이유는 출력이 전선을 통해 전달되면서 전압이 떨어질 수 있기 때문이에요. 즉, 노이즈를 감안한 거라고 볼 수 있죠. 따라서 입력 쪽에서 더 넓은 범위를 허용해야 안정적으로 동작할 수 있습니다.
전이(Transition) 구간에서는 데이터를 취하면 안돼요. 이 구간에서는 값이 0인지 1인지 보장할 수 없기 때문입니다.
| 장치 | Binary 표현 방식 |
| CPU | 전압(Voltage) |
| Disk | 자기장 방향(Magnetic field direction) |
| CD | 표면 홈의 유무(Surface pits/light) |
| Dynamic RAM | 전하(Electrical charge) |
현재 기술에서는 Digital = Binary 라고 보면 됩니다.
양자 컴퓨팅이 발전하면 이진수가 아닌 더 많은 종류를 표현하게 될 수도 있겠죠?
Combinational Circuits

조합 회로(Comnbinational Circuits)는 출력이 오직 현재 입력의 조합(Combination)에 의해서만 결정되는 회로에요.
수식으로 표현해보면 아래와 같습니다.
$$Z = f(X)$$
과거 입력은 출력에 영향을 주지 않습니다. 입력 변화에 즉시 반응하죠.
입력이 m개이고 각각 0 또는 1이면, 가능한 입력 조합은 $2^m$ 가지 입니다. 예컨대, 입력이 3개면 8가지 조합이 생기는 거죠.
조합 회로의 기본 구성 블록은 논리 게이트(Logic Gate) 입니다.

Basic Logical Operations(기본 논리 연산)을 아래의 표를 통해 정리합시다.
| 연산 | 수식 | 설명 |
| AND | Z = X × Y | 둘 다 1일 때만 1. 점(dot) 또는 생략하여 표기 |
| OR | Z = X + Y | 하나라도 1이면 1. 더하기(+)로 표기 |
| NOT | Z = X' | 값을 반전. 프라임('), 오버바, 틸드(~)로 표기 |

추가적인 파생 논리 연산
| 연산 | 수식 | 설명 |
| NAND | (X×Y)' | AND의 반전. 둘 다 1일 때만 0 |
| NOR | (X+Y)' | OR의 반전. 둘 다 0일 때만 1 |
| XOR | X ⊕ Y | 서로 다를 때만 1 (Exclusive OR) |
| XNOR | (X ⊕ Y)' | 서로 같을 때만 1 |
NAND 게이트는 실용적으로 매우 중요해요. 모든 논리 회로를 NAND 게이트만으로 구현할 수 있답니다(Universal Gate).
AND + OR 조합을 NAND로 통일하면 제조와 관리가 훨씬 효율적이에요.
Boolean Algebra
부울 대수(Boolean Algebra)는 이진 변수와 논리 연산을 다루는 대수 체계입니다.
일반 대수와 비슷하지만 중요한 차이점들이 있어요.
부울 식(Boolean Expression)은 이진 변수, 상수 0과 1, 논리 연산(AND, OR, NOT), 괄호로 구성됩니다.
| 0과 1에 관한 연산 | |
| X + 0 = X | X × 1 = X |
| X + 1 = 1 | X × 0 = 0 |
| 멱등 법칙(Idempotent Laws) | |
| X + X = X | X × X = X |
| 이등 부정 법칙(Involution Law) |
| (X')' = X |
| 상보 법칙(Laws of Complementarity) | |
| X + X' = 1 | X × X' = 0 |
산술 합이 아니라 논리 합이라는 것을 꼭 명심합시다.
우리가 흔히 보던 연산자들이라도 결과가 다르죠? 처음이라 그런지 매우 혼란스럽네요. 논리합이라는 있어보이는 용어보다 집합 개념이지만 거기에 기호만 바뀌었다라고 생각하는게 더 편할 것 같습니다.
1은 전체 집합이고 0은 공집합이라고 보면 어떨까요? 프라임 ' 은 여집합이라고 보면 한결 편해지는 것 같습니다.
고딩 시절처럼 차라리 합집합 ∪, 교집합 ∩ 기호로 보는게 더 편할텐데, 그 시절이 그립네요.
하지만 계속 눈에 익으면 이게 더 편할 날이 올꺼라 믿어봅니다. 전공자가 되어야죠.
조금 더 나아가서, 집합 배우던 시절을 떠올려 봅시다.
논리합이지만 결국 집합의 관점이라 한다면 배웠던 세 가지 법칙이 있었죠.
| 교환 법칙(Commutative Laws) | |
| X + Y = Y + X | XY = YX |
| 결합 법칙(Associative Laws) | |
| (X + Y) + Z = X + (Y + Z) | (XY)Z = X(YZ) |
| 분배 법칙(Distributive Laws) | |
| X(Y + Z) = XY + XZ | X + YZ = (X + Y)(X + Z) |
여기서 주목할 것이 있어요.
분배 법칙이 라떼 수학의 정석을 보던 시절에 없던 게 보여서 당혹스러웠습니다.
일반 대수에서는 성립하지 않는 부울 대수만의 특수한 분배법칙이에요.
AND와 OR의 관계가 철저하게 대칭적인 모습 잘 익혀보아요.
DeMorgan's Laws
나왔습니다. 집합 배울 때 안나오면 서러운 드모르간 법칙
| 드모르간 법칙(DeMorgan's Laws) | |
| (X + Y)' = X' × Y' | (X × Y)' = X' + Y' |
합의 보수 = 각 보수의 곱, 곱으 보수 = 각 보수의 합. 이것은 n개의 변수로 일반화 시켜볼 수 있습니다.
($X_1$ + $X_2$ + ... + $X_n$)' = $X_1$' × $X_2$' × ... × $X_n$'
물론 반대도 성립하겠죠?
드모르간 법칙이 어디에 쓰이면 실용적일까요?
모든 변수를 각각 NOT한 다음 AND하는 대신, 모두 OR한 뒤 한 번만 NOT해도 같은 결과를 얻어요. 이렇게 하면 NOT Gate를 줄일 수 있습니다.
더 있어보이는 말로, AND + OR 회로를 NAND로 통일하는 핵심 원리가 바로 드모르간 법칙인 겁니다.
Combinational Components
이제 좀 더 논리회로 이름에 걸맞는 개념을 정리해봅시다. 조합소자(Combinational Components)에 대해 알아보아요.

IC(Integrated Circuit, 집적 회로)
IC는 다수의 전자 회로를 하나의 작은 칩 위에 집적한 겁니다. 모을 집, 쌓을 적.
AND, OR Gate를 일일이 따로 연결하던 방식에서 벗어나, 하나의 묶음으로 만들어 관리와 유지보수를 용이하게 합니다.
| 약어 | 의미 | 한국어 |
| SSI | Small-Scale IC | 소규모 집적회로(AND, OR, NOT Gate 수준) |
| MSI | Medium-Scale IC | 중규모 집적회로 |
| LSI | Large-Scale IC | 대규모 집적회로 |
| VLSI | Very Large-Scale IC | 초대규모 집적회로(현대 CPU) |
Decoder(디코더)
디코더는 코드화된 입력을 해독(decode)하여 출력하는 소자에요. n비트 입력을 받아 $2^n$ 개의 출력 중 하나만 1로 만듭니다.
딥러닝 공부할 때나 들었던 단어인데, 뉘앙스는 비슷하게 쓰이는 것 같습니다.
예시로 이해해 볼께요.
2-to-4 Decoder라는게 있다고 가정해봅시다.
2-to-4 Decoder는 입력 2비트(A1, A0), 출력 4개(D0~D3) 이라고 보면 됩니다.
| 상황 | 논리식 |
| A1 = 0, A0 = 0 → D0 = 1 (나머지 0) | D0 = A1' × A0' |
| A1 = 0, A0 = 1 → D1 = 1 (나머지 0) | D1 = A1' × A0 |
| A1 = 1, A0 = 0 → D2 = 1 (나머지 0) | D2 = A1 × A0' |
| A1 = 1, A0 = 1 → D3 = 1 (나머지 0) | D3 = A1 × A0 |
색깔 4개를 2비트 코드로 표현했다면, 코드 '11'이 들어왔을 때 '이건 녹색이야'라고 알려주는 장치가 디코더라고 볼 수 있습니다. D3이 1이면 녹색에 해당한다는 의미가 되겠죠.
Encoder
인코더는 디코더의 역(Reverse) 입니다. 입력 신호를 코드로 반환하는 소자 입니다. $2^n$ 개의 입력 중에 하나가 활성화되면 n비트 코드를 출력합니다.
하지만 이것은 문제점이 있어요.
수학적으로는 디코더의 역함수이지만, 실제로는 입력이 여러 개 동시에 1이 되거나, 모두 0일 수 있어요.
그래서 Priority Encoder를 씁니다.
여러 입력이 동시에 1이면 미리 정해진 우선순위에 따라 하나만 인코딩합니다. 모두 0인 경우에는 별도의 에러/유효성 출력 신호를 추가합니다.
Multiplexer(MUX)
멀티플렉서(MUX)는 여러 입력 신호 중 하나를 선택하여 단일 출력으로 내보내는 소자입니다. '데이터 선택기(Data Selector)' 라고도 하죠.


4-to-1 MUX
4개의 데이터 입력(I0 ~ I3)과 2비트 제어 입력(A, B), 1개의 출력(Z)
논리식
$$A'B'I0 + A'BI1 + AB'I2 + ABI3$$
위 논리식대로 라면 이때 제어 입력이 $00$이면 $I0$이 출력, $01$이면 $I1$이 출력, $10$이면 $I2$, $11$이면 $I3$가 출력됩니다.
이게 어디에 쓰일 수 있을까요?
PC 신호와 노트북 신호가 모두 빔프로젝터에 연결되어 있지만, 한 번에 하나만 화면에 출력되죠. 이때 어떤 소스를 선택할지 결정하는 것이 멀티플렉서의 역할이라고 볼 수 있습니다.
Quad 2-to-1 MUX
실용적으로는 1비트가 아닌 4비트 단위로 선택해야 합니다. 4개의 2-to-1 MUX를 묶되, 제어 신호(A)를 공유하는거죠.
이렇게 하면 4비트 데이터 2묶음 중 하나를 통째로 선택할 수 있다.
Demultiplexer
이름에서도 추론해볼 수 있죠. 멀티플렉서의 역연산 버전입니다.
하나의 입력 신호를 여러 출력 중 하나로 내보내는 소자입니다. 제어 신호로 어느 출력을 보낼 지 결정하는거죠.
Sequential Circuits
조합 회로와 달리, 순차 회로(Sequential Circuits)는 출력이 현재 입력 뿐 아니라 과거의 입력 / 출력(상태)에도 의존합니다.


수식으로 표현해보면 아래처럼 표현해볼 수 있어요.
$$Z = f(X, Q)$$
$$Q+ = g(X, Q)$$
여기서 $Q$는 현재 상태, $Q+$는 다음 상태를 의미합니다.

구조는 이렇습니다.
조합 회로 + 저장 소자(Storage Elements)
조합 회로 부분이 입력과 현재 상태를 받아 출력과 다음 상태를 생성하고, 저장 소자가 상태를 기억합니다.
내일 날짜를 알려주는 시스템이 있다면, 이 때 입력(X)은 '+1', 현재 상태(Q)는 '오늘 날짜', 출력(Z)은 '내일 날짜', 다음 상태(Q+)는 업데이트된 '오늘 날짜'가 됩니다.
순차 회로의 상태 수
저장 소자가 k개 이면, 표현 가능한 상태는 $2^k$가지입니다. 예를 들어 365일을 구별하려면 $2^9 = 512 >= 365$이므로 9비트(9개의 저장 소자)가 필요합니다.
Latch
래치는 클록 입력이 없는 저장 소자입니다. 가장 기본적인 형태는 NOR 게이트 2개를 피드백(feedback)으로 연결한 것이죠
SR Latch
S(Set) = 1이면 저장값을 1로, R(Reset) = 1이면 0으로 바꿉니다. 둘 다 0이면 현재 값을 유지(저장)합니다. 둘 다 1이면 정의되지 않는(undefined) 상태가 됩니다.
저장의 원리
NOR 게이트 2개를 연결하면 신호가 루프르 돌며 자기 값을 유지합니다. 외부에서 S나 R 신호를 주면 이 루프의 값이 바뀌어 새로운 값이 저장됩니다.
Flip-Flop
플립플롭은 클록 입력이 있는 저장 소자입니다.
래치에 클록(clock)을 결합하여, 특정 시간에만 값이 변경되도록 제한하죠.
왜 클록이 필요할까요?
학교의 셔틀버스 시간표를 생각하면 될 것 같습니다.
시간표, 매시 정각에 출발 한다고 정하면 모든 사람이 이를 통해서 스케줄링을 할 수 있을겁니다. 마찬가지로, 회로에서도 언제 저장할 것인지를 명확히 하면 설계와 동작이 훨씬 안정적이겠죠.
Clocked SR Flip-Flop
SR Latch 앞에 AND gate를 추가하여 클록(CP) 신호를 결합한다. CP-0dlaus, S, R과 무관하게 아무 변화가 없고, CP = 1 일 때만, S, R에 따라 동작합니다.

D Flip-Flop

SR Flip Flop은 사용자가 Set / Reset을 직접 조작해야 해서 불편합니다. D FF는 입력을 D(Data) 하나로 단순화합니다.
D = 0 이면 0을 저장하고, D = 1이면 1을 저장합니다. 내부적으로 D를 S에 연겨랗고 D'을 R에 연결하는 방식이죠.
| CP | D | Q(t + 1) |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
Edge-Triggered D Flip-Flop
Clocked 방식은 클록이 1인 전체 구간 동안 값이 바뀔 수 있어 제어가 어렵습니다. Edge-Triggered 방식은 클록의 모서리(edge) ㅡ 즉 0 -> 1 또는 1 -> 0으로 바뀌는 찰나 ㅡ 에서만 값이 변경됩니다.

- Positive Edge-Triggered: 0 -> 1 상승 모서리(rising edge)에서 동작. 심볼에 세모(▷)
- Negative Edge-Triggered: 1 -> 0 하강 모서리(falling edge)에서 동작. 심볼에 세모+동그라미
Edge-Triggered가 실용적인 이유가 있어요.
저장 타이밍을 극도로 좁혀서 설계의 안정성과 예측 가능성을 높이거든요.
Register
레지스터는 여러 개의 플립플롭을 묶어 다수의 비트를 저장하는 장치에요. 4개의 D 플립플롭을 묶으면 4비트 레지스터가 됩니다.
Serial-In Serial-Out (SISO)
입력 통로 1개, 출력 통로 1개.
플립플롭이 직렬로 연결되어 있습니다. 데이터가 한 비트씩 이동해요. 4비트를 모두 쓰려면 클록 4번, 읽으려면 여깃 여러 번 기다려야 합니다. 1차선 도로에 차가 4대가 가는 것과 같죠.
Serial-In Parallel-Out (SIPO)
입력은 직렬이지만 출력은 각 플립플롭에서 동시에 읽을 수 있습니다. 쓰기는 느리지만 읽기가 빠르죠.
Parallel-In Parallel-Out (PIPO)
입력과 출력 모두 병렬 입니다. 4비트를 동시에 쓰고 동시에 읽을 수 있습니다. 가장 실용적인 형태이죠.
'CS & AI > Computer Architecture' 카테고리의 다른 글
| <컴퓨터구조> Instruction Cont'd (0) | 2026.04.19 |
|---|---|
| <컴퓨터 구조> 기본 산술 instruction과 RISC-V Assembly Language 요약 (0) | 2026.04.17 |
| <컴퓨터구조> Instructions - Language of the Computer (0) | 2026.04.16 |
| <컴퓨터구조> Performance (0) | 2026.04.16 |
| <컴퓨터 구조> Computer Abstractions & Technology (0) | 2026.04.06 |
나의 성장 드라마
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!