1. 컴퓨터 구조의 큰 그림
1. 컴퓨터가 이해하는 정보
(1) 데이터와 명령어
- 데이터(Data): 숫자, 문자, 이미지, 동영상 등 정적인 정보
- 명령어(Instruction): 데이터를 어떻게 처리할지를 지시하는 정보
(2) 데이터와 명령어의 차이점
| 구분 | 설명 |
|---|
| 데이터 | 숫자, 문자, 이미지, 영상 등 컴퓨터가 저장하고 처리할 정보 |
| 명령어 | 데이터를 조작하거나 연산하기 위해 CPU가 실행하는 명령 |
- 예시
1과 2를 더하는 연산: 명령어
"hello world" 문자열: 데이터
cat.jpg 이미지 파일: 데이터
- 명령어의 처리 과정
- CPU가 메모리에서 명령어를 가져와 해석하고 실행
- CPU의 종류에 따라 실행 가능한 명령어가 다름
- 특정 명령어를 처리하는 순서가 정해져 있으며 이를 명령어 사이클이라 함
2. 컴퓨터의 핵심 부품
컴퓨터의 핵심 부품은 CPU(중앙처리장치), 메모리(RAM, 캐시), 보조기억장치(SSD, HDD), 입출력장치(키보드, 마우스, 모니터 등) 로 구성된다.
(1) CPU(중앙처리장치)

- 데이터를 읽고 해석하여 실행하는 역할을 담당
- CPU의 주요 구성 요소
- 연산장치(ALU, Arithmetic Logic Unit): 산술 및 논리 연산 수행
- 제어장치(CU, Control Unit): 명령어 해석 및 실행 과정 관리
- 레지스터(Register): 명령어와 데이터를 저장하는 초고속 임시 저장장치
(2) 메모리와 캐시 메모리
- 메인 메모리(RAM): 실행 중인 프로그램과 데이터를 저장하는 휘발성 저장소
- 캐시 메모리(Cache Memory): CPU가 자주 사용하는 데이터를 저장하여 처리 속도 향상
메모리의 특징
| 구분 | 설명 |
|---|
| RAM | 실행 중인 프로그램과 데이터를 저장하는 공간 |
| 캐시 메모리 | CPU가 빠르게 접근할 수 있는 작은 크기의 고속 메모리 |
| 휘발성(volatile) 메모리 | 전원이 꺼지면 데이터가 사라지는 특징 (RAM) |
(3) 보조기억장치
- 전원이 꺼져도 데이터가 유지되는 비휘발성(non-volatile) 저장장치
- 주요 장치
- HDD(하드 디스크): 회전하는 자기 디스크를 이용해 데이터 저장
- SSD(솔리드 스테이트 드라이브): 반도체 기반 저장장치로 HDD보다 빠름
- USB, SD 카드: 휴대용 저장 장치
(4) 입출력장치
- 입력장치(Input Device): 사용자로부터 데이터를 입력받는 장치
- 출력장치(Output Device): 처리된 데이터를 사용자에게 출력하는 장치
(5) 메인 보드와 버스
- 메인보드(Mainboard): 컴퓨터의 핵심 부품을 연결하는 기판
- 버스(Bus): CPU, 메모리, 보조기억장치 등 주요 부품 간 데이터를 전달하는 통로
- 시스템 버스: CPU와 메모리를 연결
- 입출력 버스: CPU와 입출력장치를 연결
(6) 저장장치의 계층 구조
저장장치는 속도, 용량, 가격을 기준으로 계층 구조를 갖는다.
| 저장장치 계층 | 속도 | 용량 | 가격 |
|---|
| 레지스터 | 가장 빠름 | 매우 작음 | 가장 비쌈 |
| 캐시 메모리 | 매우 빠름 | 작음 | 비쌈 |
| RAM | 빠름 | 중간 | 중간 |
| 보조기억장치 (SSD, HDD) | 느림 | 큼 | 저렴 |
- 속도가 빠를수록 용량이 작고 가격이 비싸며, 속도가 느릴수록 용량이 크고 가격이 저렴하다.
2. 컴퓨터가 이해하는 정보
1. 데이터 - 0과 1로 숫자 표현하기
컴퓨터는 모든 데이터를 이진수(0과 1) 로 표현한다.
(1) 비트와 바이트
- 비트(bit): 데이터의 최소 단위(0 또는 1)
- 바이트(byte): 8비트(1바이트) 단위로 데이터를 저장
- 기본 단위 변환
- 1 Byte = 8 비트
- 1 KB = 1,000 Byte
- 1 MB = 1,000 KB
- 1 GB = 1,000 MB
- 1 TB = 1,000 GB
(2) 이진수로 숫자 표현
- 10진수(Decimal) → 2진수(Binary) 변환
- 1 → 1
- 2 → 10
- 3 → 11
- 4 → 100
- 5 → 101
- 숫자를 표현할 때 0과 1을 사용하며, 자릿수를 채우기 위해 앞에 0을 추가(자릿수 정렬) 한다.
(3) 16진수 표현 (Hexadecimal)
- 이진수는 너무 길어지므로, 16진수(0~F)를 사용하여 줄여서 표현
- 16진수 변환
- 10진수: 0, 1, 2, ..., 9, 10, 11, 12, 13, 14, 15
- 16진수: 0, 1, 2, ..., 9, A, B, C, D, E, F
- 예시
- 10진수
255 → 2진수 1111 1111 → 16진수 FF
- MAC 주소, IPv6 주소 등에 16진수를 사용
2. 실수 표현 (부동 소수점)
컴퓨터는 부동 소수점 방식(IEEE 754) 을 사용하여 실수를 저장한다.
(1) 실수 저장 방식

- 32비트 실수 표현: 부호(1비트) + 지수(8비트) + 가수(23비트)
- 64비트 실수 표현: 부호(1비트) + 지수(11비트) + 가수(52비트)
(2) 오차 발생
- 실수는 이진수로 정확히 표현하기 어려워, 반올림 오차가 발생
0.1 + 0.2 를 계산하면 0.3 이 아니라 0.30000000000000004 가 나올 수도 있음
3. 데이터 - 0과 1로 문자 표현하기
컴퓨터는 문자를 숫자로 변환하여 저장하며, 이를 문자 인코딩(character encoding) 이라 한다.
(1) ASCII 코드

- 7비트(128개 문자)로 영문, 숫자, 특수문자 표현
- 예:
A = 65, B = 66, a = 97, b = 98
(2) 확장 문자 인코딩
- ASCII는 영어만 표현 가능하여, 한국어 등 다국어 표현을 위해 EUC-KR, Unicode(UTF-8, UTF-16, UTF-32) 등이 등장
- EUC-KR: 한국어 문자 표현 (2바이트)
- Unicode: 모든 언어를 표현 가능
- UTF-8 (가변 길이, 웹에서 많이 사용)
- UTF-16 (일부 시스템에서 사용)
- UTF-32 (고정 길이, 저장 공간이 큼)
(3) Base64 인코딩
- 바이너리 데이터를 문자로 변환하는 방식
- 이메일, URL 인코딩 등에 사용됨
4. 명령어 (Instruction)
컴퓨터는 수행할 동작(연산)과 수행할 대상(데이터) 으로 명령어를 구성한다.
(1) 명령어의 구성
| 요소 | 설명 |
|---|
| 연산 코드 | 수행할 연산 (덧셈, 곱셈 등) |
| 오퍼랜드(Operand) | 연산 대상 (데이터 또는 주소) |
(2) 주요 연산 코드
- 데이터 전송
MOVE (데이터 이동)
STORE (메모리에 저장)
LOAD (메모리에서 CPU로 불러오기)
- 산술/논리 연산
ADD, SUBTRACT (덧셈, 뺄셈)
MULTIPLY, DIVIDE (곱셈, 나눗셈)
AND, OR, NOT (논리 연산)
- 제어 흐름 변경
JUMP (특정 주소로 이동)
CALL, RETURN (함수 호출 및 복귀)
- 입출력
READ, WRITE (입출력 장치 데이터 처리)
(3) 스택(Stack)과 PUSH, POP
- 명령어 실행 시 스택(Stack, 후입선출 구조) 을 사용
PUSH: 데이터를 스택에 저장
POP: 데이터를 스택에서 꺼냄
5. 기계어와 어셈블리어
(1) 기계어(Machine Code)
- CPU가 직접 실행하는 0과 1의 이진 코드
- 사람은 해독하기 어려움
(2) 어셈블리어(Assembly)
- 기계어를 사람이 읽을 수 있도록 만든 저수준 언어
- 예제 (x86 어셈블리어)
mov eax, 5
add eax, 3
(3) CISC vs RISC
- CISC (Complex Instruction Set Computer)
- 복잡한 명령어 집합 사용 (ex: x86)
- 한 개의 명령어로 여러 동작 수행 가능
- RISC (Reduced Instruction Set Computer)
- 단순한 명령어 집합 사용 (ex: ARM)
- 실행 속도가 빠름
6. 명령어 사이클
CPU는 명령어를 읽고(인출), 해석하고, 실행하는 과정을 반복하며 이를 명령어 사이클(Instruction Cycle) 이라 한다.
(1) 명령어 사이클 과정

- 인출(Fetch): 명령어를 메모리에서 가져옴
- 해석(Decode): 명령어를 해석
- 실행(Execute): 명령어를 실행
- 저장(Store): 실행 결과를 저장
(2) 간접 사이클
- 연산에 필요한 추가 데이터(주소)가 있을 경우 간접 사이클(Indirect Cycle) 을 수행하여 데이터를 불러옴
3. CPU
1. 레지스터(Register)
(1) 레지스터란?
- CPU 내부의 초고속 임시 저장 공간
- 프로그램 실행 중 필요한 데이터를 저장하고 관리
- 다양한 종류의 레지스터가 있으며, 각 레지스터는 특정한 역할을 수행
(2) 주요 레지스터 종류
| 레지스터 유형 | 설명 |
|---|
| 명령어 레지스터 (IR, Instruction Register) | 현재 실행 중인 명령어 저장 |
| 프로그램 카운터 (PC, Program Counter) | 다음에 실행할 명령어의 메모리 주소 저장 |
| 범용 레지스터 (General Purpose Register) | 데이터를 저장하고 연산 수행에 활용 |
| 플래그 레지스터 (Flag Register) | 연산 결과에 대한 상태 정보 저장 (예: 오버플로우, 캐리 플래그) |
| 스택 포인터 (SP, Stack Pointer) | 스택 메모리의 최상단 주소 관리 |
2. 인터럽트(Interrupt)
(1) 인터럽트란?
- CPU가 실행 중인 작업을 일시 중단하고, 긴급한 작업을 우선 처리하는 기법
- 외부(하드웨어) 또는 내부(소프트웨어)에서 발생
- 예: 키보드 입력, 마우스 클릭, 타이머 이벤트 등
(2) 인터럽트 종류

| 종류 | 설명 |
|---|
| 하드웨어 인터럽트 (Hardware Interrupt) / 동기 인터럽트 (Synchronous Interrupt) | 외부 하드웨어 장치에서 발생, CPU의 작업을 중단하고 즉시 처리 (예: 키보드 입력, 마우스 클릭) |
| └ 마스커블 인터럽트 (Maskable Interrupt) | 우선순위가 낮아 무시될 수 있는 인터럽트, CPU가 명시적으로 허용해야 처리됨 |
| └ 스푸리어스 인터럽트 (Spurious Interrupt) | 원인 불명의 잘못된 신호로 발생하는 인터럽트, 종종 하드웨어 오류나 전기적 잡음으로 발생 |
| 소프트웨어 인터럽트 (Software Interrupt) / 비동기 인터럽트 (Asynchronous Interrupt) | 명령어 실행 중 소프트웨어에서 발생, 주로 시스템 호출이나 예외 처리에 사용됨 (예: 운영체제 호출, 0으로 나누기) |
3. 예외 처리(Exception Handling)
(1) 예외(Exception)란?
- 프로그램 실행 중 예상치 못한 오류(예: 0으로 나누기, 메모리 접근 오류)가 발생하는 상황
- 예외가 발생하면 CPU는 예외 처리 루틴을 실행한 후 다시 원래 작업으로 복귀
(2) 예외의 종류
| 종류 | 설명 |
|---|
| 폴트(Fault) | 예외가 발생한 명령어를 다시 실행 |
| 트랩(Trap) | 예외 발생 후 다음 명령어 실행 |
| 중단(Abort) | 프로그램을 강제 종료 |
| 소프트웨어 인터럽트 | 사용자 정의 인터럽트 |
4. CPU와 인터럽트 처리

- CPU가 실행 중 인터럽트가 발생하면, 현재 실행 중인 작업을 멈추고 인터럽트 서비스 루틴(ISR)을 실행 후 기존 작업 수행 재개
- 정상적으로 작업 진행
- 인터럽트 발생
- 인터럽트 서비스 루틴으로 점프
- 인터럽트 서비스 루틴 실행
- 기존 작업으로 리턴
- 기존 작업 수행 재개
5. CPU 성능 향상을 위한 요소
(1) 클럭 속도
- CPU의 클럭(clock)은 연산을 수행하는 주기적인 신호.
- GHz(기가헤르츠) 단위로 측정되며, 클럭이 높을수록 더 많은 연산 수행 가능.
- 1GHz = 10억 회 연산/초를 의미함.
(2) 멀티코어와 멀티스레드
- 멀티코어 CPU: 여러 개의 코어(Core)를 포함한 CPU로, 다중 작업(멀티태스킹)에 유리.
- 스레드(Thread): CPU 내에서 실행되는 독립적인 작업 단위.
- 멀티스레드 CPU는 하나의 코어에서 여러 개의 스레드를 실행 가능.
코어의 종류
| 코어 수 | 설명 |
|---|
| 싱글코어 (Single-core) | 단일 코어 CPU |
| 듀얼코어 (Dual-core) | 두 개의 코어 |
| 쿼드코어 (Quad-core) | 네 개의 코어 |
| 헥사코어 (Hexa-core) | 여섯 개의 코어 |
| 옥타코어 (Octa-core) | 여덟 개의 코어 |
| 데카코어 (Deca-core) | 열 개의 코어 |
(3) 하드웨어 스레드 vs 소프트웨어 스레드
| 구분 | 하드웨어 스레드 | 소프트웨어 스레드 |
|---|
| 정의 | CPU의 실제 물리적 코어에서 실행되는 스레드 | 프로그램(소프트웨어)에서 생성된 가상의 스레드 |
| 속도 | 직접 CPU에서 실행되므로 빠름 | CPU 스케줄러가 관리하므로 성능 영향 있음 |
| 예제 | 인텔 하이퍼스레딩, AMD SMT | Java, Python, C++의 Thread 클래스 |
6. CPU 성능 최적화 기술
(1) 파이프라이닝(Pipelining)

- CPU 성능을 높이기 위한 대표적인 기법.
- 하나의 명령어 실행 과정(인출, 해석, 실행, 저장)을 여러 개의 단계로 나누어 병렬 실행.
- 예: 5단계 파이프라인 → 하나의 명령이 실행되는 동안, 다음 명령어는 이미 실행 준비 상태.
(2) CISC vs RISC
CISC(Complex Instruction Set Computer)
- 명령어 집합이 크고, 복잡한 연산을 수행 가능.
- 명령어 하나로 여러 작업을 수행할 수 있음.
- 예제: x86 아키텍처.
RISC(Reduced Instruction Set Computer)
- 명령어가 단순하고 짧음.
- 각 명령어가 동일한 실행 시간을 가짐.
- 파이프라이닝 효율이 높음.
- 예제: ARM, M1 칩.
(3) 명령어 병렬 처리와 위험 요소
명령어 병렬 처리
- 여러 명령어를 동시에 실행하여 성능을 높이는 기법.
- CPU가 다중 명령어를 효율적으로 처리하도록 설계됨.
병렬 처리의 위험 요소
| 위험 요소 | 설명 |
|---|
| 데이터 위험(Data Hazard) | 이전 명령어의 실행이 끝나기 전에 다음 명령어가 실행될 때 발생 |
| 제어 위험(Control Hazard) | 분기 명령어(JUMP) 실행 시 발생 |
| 구조적 위험(Structural Hazard) | 두 개의 명령어가 같은 CPU 자원을 동시에 사용하려 할 때 발생 |
Ref. 📗《이것이 취업을 위한 컴퓨터 과학이다 with CS 기술 면접》, 강민철