프로그램 카운터 (Program Counter, PC)
핵심 인사이트 (3줄 요약)
CPU가 다음에 실행할 명령어의 메모리 주소를 저장하는 레지스터. 명령어를 인출(Fetch)할 때마다 자동으로 증가하고, 분기·인터럽트·서브루틴 호출 시 새 주소로 점프한다. 컨텍스트 스위치 시 PC 값을 PCB에 저장·복원하여 프로세스 실행 상태를 유지한다.
1. 개념
프로그램 카운터(Program Counter, PC)는 CPU가 다음에 인출(Fetch)해야 할 명령어의 메모리 주소를 저장하는 특수 레지스터다. Instruction Pointer(IP)라고도 불린다.
비유: "책의 페이지 번갈아 보는 책갈피" — 어디까지 읽었는지 표시하고, 다음엔 어디 읽어야 하는지 알려준다.
2. 등장 배경
- 순차 실행의 필요: 명령어를 메모리에서 순서대로 가져오려면 현재 위치 추적이 필수
- 폰노이만 구조의 핵심: 명령어와 데이터를 같은 메모리에 저장 → PC로 명령어 위치 구분
- 제어 흐름: 조건 분기, 함수 호출, 인터럽트 처리 등 비순차 실행 지원
3. 구성 요소
| 관련 레지스터 | 역할 |
|---|---|
| PC (Program Counter) | 다음 실행할 명령어 주소 |
| IR (Instruction Register) | 현재 실행 중인 명령어 저장 |
| MAR (Memory Address Register) | 메모리 접근 주소 |
| MDR (Memory Data Register) | 메모리에서 읽은 데이터 |
4. 핵심 원리
[명령어 사이클과 PC 동작]
초기: PC = 0x1000
1. Fetch:
MAR ← PC (= 0x1000)
MDR ← Memory[MAR]
IR ← MDR
PC ← PC + 4 (자동 증가, 명령어 크기만큼)
2. Decode: IR의 명령어 해석
3. Execute: 연산 수행
- 일반 명령어: PC = 0x1004 (다음 명령어)
- JUMP 명령어: PC ← 목적지 주소 (점프)
- 함수 호출: 스택에 현재 PC 저장 후 PC ← 함수 주소
- 인터럽트: PC ← 인터럽트 핸들러 주소
5. 장단점
| 장점 | 단점 |
|---|---|
| 순차 실행을 단순하게 구현 | 단독으로는 비순차 실행 지원 한계 |
| 분기·함수 호출·인터럽트 처리 통합 | 파이프라인에서 분기 예측 실패 시 PC 복구 오버헤드 |
| 컨텍스트 스위치 시 PCB 저장으로 멀티태스킹 지원 | 양자 컴퓨터 모델에서는 PC 개념이 없음 |
6. 다른 것과 비교
| 항목 | PC (Program Counter) | SP (Stack Pointer) | LR (Link Register) |
|---|---|---|---|
| 저장 내용 | 다음 명령어 주소 | 현재 스택 최상단 주소 | 함수 복귀 주소 |
| 변경 시점 | 매 Fetch마다 자동 증가 + 분기 시 점프 | PUSH/POP 시 ±word | 함수 호출(BL) 시 |
| 역할 | 실행 흐름 제어 | 지역변수·리턴주소 관리 | 함수 복귀 (ARM) |
| 컨텍스트 스위치 | PCB에 저장·복원 | PCB에 저장·복원 | PCB에 저장·복원 |
선택 기준: PC는 실행 위치, SP는 스택 관리, LR은 ARM 아키텍처의 빠른 복귀용
7. 활용 사례
- 컨텍스트 스위치: OS가 프로세스를 전환할 때 현재 PC 값을 PCB(Process Control Block)에 저장 → 나중에 복원하여 정확한 위치에서 재개
- 디버거: 브레이크포인트 = 특정 주소에서 PC를 멈추게 하는 장치
- JIT 컴파일러: 생성된 기계어 코드의 시작 주소로 PC를 점프시켜 동적 코드 실행
8. 코드 예시
# PC 동작 시뮬레이션 (Python)
class SimpleCPU:
def __init__(self):
self.pc = 0 # Program Counter
self.memory = {}
self.registers = {}
def fetch(self):
instruction = self.memory.get(self.pc, None)
self.pc += 1 # ← PC 자동 증가
return instruction
def jump(self, address):
self.pc = address # ← 분기: PC를 목적지로 점프
# 실행
cpu = SimpleCPU()
cpu.memory = {0: "LOAD R1 5", 1: "LOAD R2 3", 2: "ADD R1 R2", 3: "JUMP 0"}
print(cpu.fetch()) # PC=0 → "LOAD R1 5", PC becomes 1
print(cpu.fetch()) # PC=1 → "LOAD R2 3", PC becomes 2
10. 실무에선? (기술사적 판단)
- 파이프라인 해저드: 분기 명령어 실행 시 PC가 변경되어 이미 fetch된 명령어를 버려야 함(제어 해저드) → 분기 예측(Branch Prediction)으로 해결
- 보안: ROP(Return-Oriented Programming) 공격은 PC를 조작하여 악의적인 코드 흐름 생성 → ASLR, CFI(Control Flow Integrity)로 방어
- 디버깅: GDB의
step,next,jump명령어는 모두 PC를 직접 제어
11. 관련 개념
- 명령어 사이클 (Instruction Cycle)
- 파이프라이닝 (Pipelining)
- PCB (Process Control Block)
- 컨텍스트 스위치 (Context Switch)
- 분기 예측 (Branch Prediction)
어린이를 위한 종합 설명
PC는 "악보의 손가락 위치"야!
피아노를 칠 때:
- 악보에는 음표들이 쭉 적혀 있어
- 손가락으로 "지금 여기!" 가리키고 있어
- 한 음표 치면 → 손가락이 오른쪽으로 이동!
악보: 도-레-미-파-솔
↑
손가락(PC)
한 음표 치면:
악보: 도-레-미-파-솔
↑
손가락이 이동!
PC가 바로 그 "손가락"이야.
- 컴퓨터는 PC가 가리키는 명령어를 실행하고
- PC를 다음 명령어로 이동시켜
- 이렇게 프로그램이 순서대로 실행돼!
"JUMP" 명령어는? → 손가락을 갑자기 다른 쪽으로 이동! 🎵
📝 기술사 모의답안 (2.5페이지 분량)
문제 예시
"프로그램 카운터(PC)의 개념과 동작 원리를 설명하고, 컨텍스트 스위치 및 파이프라인과의 관계를 논하시오."
Ⅰ. 개요 (0.2p)
PC(Program Counter)는 CPU가 다음에 실행할 명령어의 메모리 주소를 저장하는 레지스터로, 폰노이만 아키텍처에서 명령어 인출(Fetch) 단계의 핵심 요소다.
- 등장 배경: 프로그램을 메모리에 순서대로 저장하고 하나씩 실행하기 위한 위치 추적 메커니즘 필요
- 핵심 목적: 순차 실행, 분기 처리, 멀티태스킹(컨텍스트 스위치) 지원
Ⅱ. 구성 요소 및 핵심 원리 (0.8p)
명령어 사이클과 PC
| 단계 | PC 동작 |
|---|---|
| Fetch | MAR←PC, 명령어 읽기, PC←PC+명령어크기 |
| Decode | PC 변경 없음 |
| Execute (일반) | PC 변경 없음 (이미 증가됨) |
| Execute (분기) | PC←분기 목적지 주소 |
| Execute (함수호출) | 스택에 PC 저장, PC←함수 주소 |
| 인터럽트 발생 | PCB에 PC 저장, PC←ISR 주소 |
컨텍스트 스위치 시 PC 저장:
프로세스A 실행 중 → 타이머 인터럽트 발생
→ 현재 PC(0x4A20) → PCB_A에 저장
→ PCB_B에서 PC(0x8B10) 복원
→ 프로세스B가 0x8B10부터 실행 재개
Ⅲ. 기술 비교 분석 (0.5p)
| 항목 | PC | SP | IR |
|---|---|---|---|
| 저장 내용 | 다음 명령어 주소 | 스택 최상단 주소 | 현재 명령어 |
| 자동 변경 | Fetch마다 증가 | PUSH/POP | Fetch마다 갱신 |
| 분기 시 | 목적지로 점프 | 변경 없음 | 분기 명령어 저장 |
Ⅳ. 실무 적용 방안 (0.5p)
| 분야 | 활용 | 기대 효과 |
|---|---|---|
| OS 멀티태스킹 | 컨텍스트 스위치 시 PCB에 PC 저장·복원 | 정확한 프로세스 실행 재개 |
| 보안 | ASLR로 PC 예측 공격(ROP) 방지 | 메모리 공격 난이도 향상 |
| 파이프라인 | 분기 예측으로 PC 오예측 패널티 최소화 | CPI 20~30% 개선 |
Ⅴ. 기대 효과 및 결론 (0.5p)
| 효과 영역 | 내용 | 정량적 목표 |
|---|---|---|
| 실행 정확성 | 명령어 인출 위치 정확히 추적 | 명령어 순서 오류 0% |
| 멀티태스킹 | 컨텍스트 스위치로 수십~수백 프로세스 동시 실행 지원 | 컨텍스트 스위치 1μs 이내 |
PC는 폰노이만 아키텍처의 핵심 레지스터로, 순차 실행에서 파이프라인, 비순차 실행(OoO)까지 모든 CPU 설계의 근간을 이룬다. ARM 아키텍처의 LR, x86의 RIP처럼 명칭은 달라도 역할은 동일하며, RISC-V의 개방형 설계에서도 PC 개념은 그대로 유지된다.
※ 참고: Patterson & Hennessy "Computer Organization and Design", Intel 64 Architecture SDM 3A