
여러 비트가 모이면?
정보 단위
| 단위 | 의미 |
|---|---|
| 1 Byte | 8 bit |
| 1 KB | 1,000 Byte |
| 1 MB | 1,000 KB |
| 1 GB | 1,000 MB |
| 1 TB | 1,000 GB |
※ 1,024단위는 KiB, MiB 등 2진 기반 단위.
프로그램이 2GB라고 해서 CPU가 한 번에 2GB를 읽는 게 아니다.
CPU는 자신의 워드 크기 단위로 데이터를 처리한다.
워드 크기는 CPU 아키텍처를 결정하는 핵심 요소
(주소 공간 크기, 레지스터 크기, 연산 성능 등)
예)
2진수는 너무 길고 읽기 어렵기 때문.
예)
10000000 (8자리)0x80 (2자리)네트워크(MAC 주소, IPv6) 등에서도 16진법을 많이 사용한다.
프로그래밍에서 유명한 문제:
0.1 + 0.2 == 0.3 # False
왜냐?
10진의 0.1은 2진에서 무한 반복 소수가 되기 때문에
CPU는 ‘근사값’을 저장한다. → 항상 약간의 오차가 존재.

1.xxxxxx 형태(정규화), 앞의 1은 저장하지 않음면접에서 단골 질문이다.
문자 집합(Character Set)
컴퓨터가 어떤 문자들을 표현할 수 있는지 정의한 목록
예)
인코딩(Encoding)
문자 → 0과 1(코드값) 변환
디코딩(Decoding)
0과 1 → 문자 변환
1000001(₂)한글 X
C7D1B1DB 한글 조합 불가 → 모든 한글 표현 불가능유니코드는 “문자에 부여된 코드 포인트”를 정의한 것이고,
이 값을 어떻게 저장할지는 UTF 방식에 따라 달라진다.
| 인코딩 | 특징 |
|---|---|
| UTF-8 | 가변 길이(1~4바이트), 웹 표준 |
| UTF-16 | 가변 길이(2~4바이트), Windows 내부 |
| UTF-32 | 고정 길이(4바이트), 메모리 많이 씀 |
예시 한글
UTF-8 인코딩 시:
ED 95 9CEA B8 80이미지, 파일, 바이너리 데이터를
문자열 형태(ASCII)로 안전하게 변환하는 방식.
=) 사용함명령어는 두 영역으로 구성된다.
무엇을 할지
예: ADD, MOVE, LOAD, JUMP, COMPARE …
연산에 사용할 데이터 또는 주소
대부분 주소(address field)가 들어간다.
예)
더해라 100번지 값에 10을
CPU가 직접 실행하는 0/1 정보
보기 매우 어려움
기계어를 사람이 읽을 수 있게 번역한 언어
CPU 아키텍처별로 다름
예: CISC 기반(x86)
push rbp
mov rbp, rsp
imul eax, eax
ret
예: RISC 기반(ARM)
push {r7}
mul r3, r3, r3
bx lr
CPU마다 명령어·레지스터 체계가 다르기 때문에
기계어/어셈블리어도 반드시 달라진다.
CPU는 프로그램을 “명령어 단위"로 읽고 실행한다.
이때 각 명령어는 다음 주기를 반복한다.
메모리에서 명령어를 가져오기
레지스터 PC(Program Counter)가 명령어 주소를 가리킴
명령어의 오퍼랜드가 메모리 주소일 경우
추가로 메모리에 접근해 데이터를 가져오는 단계
ALU/레지스터/메모리를 이용해 명령어 실제 실행
I/O, 예외, 타이머 등 외부 요청 처리
→ 다음 장에서 본격적으로 등장
CPU 안에는 여러 종류의 ‘초고속 메모리’가 있다. 이를 레지스터라고 한다.
대표 레지스터들을 보자.

CPU 연산 결과에 대한 상태 정보가 담긴 비트 모음
대표 플래그:
| 플래그 | 의미 |
|---|---|
| Zero | 연산 결과 = 0 |
| Sign | 결과가 음수인지 |
| Carry | 올림/빌림 발생 |
| Overflow | 오버플로우 발생 |
| Interrupt | 인터럽트 허용 여부 |
| Supervisor | 커널 모드인지 |
이 값들을 보고 CPU는 다음 명령어의 흐름을 결정한다.
인터럽트는 CPU 작업을 중단시키는 신호다.
종류는 크게 2가지
CPU 내부에서 발생
(예: 0으로 나누기, 페이지 폴트, 잘못된 명령어)
CPU 외부에서 발생
(예: 키보드 입력, 마우스 이벤트, 프린터 작업 완료)
인터럽트 발생 → CPU가 처리하는 절차는 항상 동일하다.
하드웨어가 CPU에게 인터럽트 요청 신호 보냄
CPU는 명령어 끝날 때 인터럽트 플래그를 확인
인터럽트 허용 상태라면 현재 작업을 스택에 백업
인터럽트 벡터를 보고
→ 어떤 인터럽트 서비스 루틴(ISR)을 실행할지 결정
ISR 실행
끝나면 스택에서 복구 → 이전 작업 재개
인터럽트 = 일종의 자동 호출 함수
인터럽트 벡터
인터럽트 서비스 루틴을 식별하기 위한 정보
인터럽트 서비스 루틴의 시작 주소를 포함하고 있음
CPU가 인터럽트 요청을 보낸 대상으로부터 버스를 통해 인터럽트 벡터를 전달 받는다.

클럭 높으면 빠르지만 발열·전력 증가 → 한계 존재.
| 종류 | 의미 | 예 |
|---|---|---|
| 하드웨어 스레드 | 물리적 병렬 처리 단위 | 4스레드 CPU |
| 소프트웨어 스레드 | 실행 흐름 단위(코드) | Thread.run() |
물리적으로 동시에 실행
→ 코어 또는 하드웨어 스레드 수가 증가해야 가능
빠르게 번갈아 실행되어 동시에 실행되는 것처럼 보임
→ 단일 코어에서도 가능

CPU는 명령어를 다음 단계로 나누어 겹쳐서 처리한다.
이 단계들을 공장 생산 라인처럼 겹쳐 실행하면
CPU가 쉬는 시간이 없어져 성능이 크게 증가한다.

| CISC (x86) | RISC (ARM, M1) |
|---|---|
| 명령어 복잡·길이 불규칙 | 명령어 단순·규칙적 |
| 하나의 명령어로 많은 기능 가능 | 명령어 수 많지만 단순 |
| 파이프라이닝 비효율적 | 파이프라이닝 최적화 |
데이터 의존성 문제
이전 명령어 결과가 필요한데 아직 나오지 않은 경우
"A = B + C" 다음에 "D = A + E" 같은 패턴
프로그램의 갑작스러운 변화
분기, 조건문, JUMP로 인해 PC가 갑자기 변경됨
→ 이미 인출한 명령어들이 의미 없음
둘 이상의 명령어가 동시에 같은 CPU 자원을 쓰려고 할 때
(ALU 충돌, 레지스터 충돌 등)