프로그램 카운터 (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 동작
FetchMAR←PC, 명령어 읽기, PC←PC+명령어크기
DecodePC 변경 없음
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)

항목PCSPIR
저장 내용다음 명령어 주소스택 최상단 주소현재 명령어
자동 변경Fetch마다 증가PUSH/POPFetch마다 갱신
분기 시목적지로 점프변경 없음분기 명령어 저장

Ⅳ. 실무 적용 방안 (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