[컴퓨터 시스템] 9. CPU는 명령을 어떤 단계로 실행할까
8편에서 CPU를 회로들의 계층 구조로 봤다면, 이번에는 그 CPU가 실제로 명령을 어떻게 처리하는지 봐야 합니다. 프로그램 실행을 이해하려면 결국 CPU가 한 줄의 일을 어떤 단계로 쪼개 처리하는지 알아야 합니다.
이번 글은 fetch-decode-execute 흐름을 중심으로 레지스터, 프로그램 카운터, 파이프라인의 필요성을 묶어 설명합니다. 뒤에서 어셈블리를 볼 때도 이 실행 흐름이 기준이 됩니다.
- CPU 명령 처리의 기본 흐름 fetch-decode-execute
- 프로그램 카운터와 레지스터가 왜 필요한지
- 명령 하나를 단계로 쪼개 보는 이유
- 파이프라인이 생기는 이유와 기본적인 위험
- 간단한 명령열을 단계별로 추적하는 방법
1. 명령 실행은 읽기-해석-실행의 반복이다
CPU는 프로그램 전체를 한 번에 이해하지 않습니다. 메모리에서 다음 명령을 가져오고(fetch), 그것이 무슨 뜻인지 해석하고(decode), 실제 연산이나 데이터 이동을 수행(execute)하는 반복 구조로 움직입니다.
이 기본 흐름을 잡아두면 뒤에서 어셈블리 한 줄을 볼 때도, 그것이 단순 문자열이 아니라 CPU에게 내리는 매우 구체적인 작업 지시라는 점이 잘 보입니다.
2. 레지스터는 CPU 안의 빠른 작업대다
CPU가 모든 중간 값을 RAM에만 두고 계산하면 너무 느립니다. 그래서 CPU 안에는 아주 작지만 매우 빠른 저장 공간인 레지스터가 있습니다.
레지스터를 작업대라고 생각하면 좋습니다. 당장 계산할 값과 결과를 잠시 올려두고 빠르게 처리하는 공간입니다.
| 자원 | 어떤 감각으로 보면 좋은가 | 왜 중요한가 |
|---|---|---|
| 레지스터 | CPU 안의 즉석 작업대 | 가장 자주 쓰는 값을 빠르게 다룬다 |
| RAM | 더 큰 작업 창고 | 많은 데이터를 담지만 접근은 더 느리다 |
3. 프로그램 카운터는 흐름을 잃지 않게 해주는 기준점이다
CPU가 다음에 무엇을 해야 하는지 잊지 않으려면, 현재 어느 명령까지 왔는지를 계속 기억해야 합니다. 그 역할을 하는 것이 program counter입니다.
순차 실행에서는 보통 다음 명령으로 한 칸 이동하지만, 분기나 함수 호출이 생기면 이 값이 크게 바뀝니다. 그래서 program counter는 실행 흐름 자체를 보여 주는 핵심 단서입니다.
4. 파이프라인은 명령 단계를 겹쳐 성능을 높인다
명령 하나를 다 끝낸 뒤 다음 명령을 시작하면 CPU 자원이 놀게 되는 순간이 많습니다. 그래서 여러 명령이 서로 다른 단계에 동시에 올라오도록 겹치는 구조가 파이프라인입니다.
예를 들어 첫 명령이 execute 단계에 있을 때, 두 번째 명령은 decode, 세 번째는 fetch에 들어갈 수 있습니다. 이렇게 하면 처리량이 좋아집니다.
| 이점 | 대가 |
|---|---|
| 동시에 여러 명령을 서로 다른 단계에 올려 처리량을 높인다 | 의존성, 분기, 자원 충돌 때문에 흐름이 꼬일 수 있다 |
5. 조금만 복잡해져도 위험이 생긴다
파이프라인이 좋아 보이기만 하는 것은 아닙니다. 앞 명령 결과가 아직 안 나왔는데 뒤 명령이 그 값을 필요로 하거나, 분기 결과를 모르는 상태에서 다음 명령을 미리 가져오면 충돌이 생깁니다.
그래서 성능 이야기는 늘 '겹쳐서 빨라진다'와 '겹치다 보니 새 문제가 생긴다'를 함께 봐야 합니다.
| 위험 종류 | 쉬운 설명 |
|---|---|
| data hazard | 앞 결과가 필요한데 아직 안 나왔다 |
| control hazard | 분기 방향을 아직 모른다 |
| structural hazard | 같은 자원을 동시에 쓰려 한다 |
6. 직접 해볼 문제: 명령 세 줄을 단계별로 상상해 보자
아래 문제는 어셈블리를 깊게 몰라도 됩니다. 앞 명령의 결과를 뒤 명령이 바로 쓰려고 할 때 왜 파이프라인이 신경을 써야 하는지 감각만 잡으면 충분합니다.
1) R1 = R2 + R3
2) R4 = R1 + 1
3) R5 = R4 + 1이번 글에서 기억할 것
스스로 점검
다음 글 예고
다음 글에서는 이 실행 흐름을 바탕으로, 어셈블리를 왜 C와 하드웨어 사이의 번역본처럼 읽을 수 있는지 정리합니다.
'학습 자료 글 > 컴퓨터시스템' 카테고리의 다른 글
| 컴퓨터시스템 기초 11. 레지스터와 스택 프레임은 함수 호출을 어떻게 드러낼까 (0) | 2026.03.31 |
|---|---|
| 컴퓨터시스템 기초 10. 어셈블리는 왜 C와 하드웨어 사이의 번역본일까 (0) | 2026.03.31 |
| 컴퓨터시스템 기초 8. 논리 게이트에서 CPU까지 어떤 연결이 생길까 (0) | 2026.03.31 |
| 컴퓨터시스템 기초 7. 왜 실수는 10진수처럼 정확하게 저장되지 않을까 (0) | 2026.03.31 |
| 컴퓨터시스템 기초 6. 바이트 순서는 왜 값을 다르게 보이게 만들까 (0) | 2026.03.31 |