CS — context switching followup
Context Switching 모의면접 직후 나온 후속 질문 5개 — 인터럽트·PCB·레지스터·캐시 히트율·메모리 계층을 결론→근거→예시 순으로 정리한 노트
Context Switching 모의면접 꼬리질문 정리
21번 Context Switching 모의면접 직후 나온 후속 질문 5개를 1:1로 정리한 노트. 본문은 21번 원본의 해당 섹션을 가리키고, 여기서는 답변만 짧게 결론 → 근거 → 코드/예 순으로 압축한다.
목차
1. interrupt가 뭘까
한 줄 결론 — Interrupt(인터럽트)는 CPU의 현재 실행 흐름을 강제로 중단시키고, IDT(Interrupt Descriptor Table)에 등록된 핸들러로 점프시키는 하드웨어 메커니즘이다. 컨텍스트 스위칭의 주요 발화점(타이머 인터럽트)이자, 모드 스위치의 본체 트리거이기도 하다.
1-1. 흐름
1
2
3
4
5
6
7
8
9
10
11
[CPU가 명령 N 실행 중]
↓
[인터럽트 신호 도착 — 타이머·키보드·NIC 등]
↓
[CPU가 현재 PC·플래그를 자동 저장 → 커널 스택으로]
↓
[IDT[인터럽트 번호] → 핸들러 주소 점프]
↓
[핸들러 실행 (커널 모드)]
↓
[iret 명령 → 원래 PC 복원 → 사용자 모드 복귀]
1-2. 세 종류
| 종류 | 발생 원천 | 예 |
|---|---|---|
| 하드웨어 인터럽트 (IRQ) | 외부 장치 신호 | 타이머(스케줄러 발화점), 키보드 입력, NIC 패킷 수신, 디스크 I/O 완료 |
| 소프트웨어 인터럽트 / Trap | 명시적 명령어 (int 0x80·syscall·sysenter) | 시스템 콜 호출 — 사용자 코드가 의도적으로 커널 진입 |
| 예외 (Exception) | CPU 내부 오류 | Page Fault, Divide-by-Zero, Invalid Opcode, General Protection Fault |
1-3. 컨텍스트 스위칭과의 관계
- 타이머 인터럽트 가 만료되면 → 커널 진입 → 스케줄러 실행 → 다른 스레드로 갈아끼우면 컨텍스트 스위치 발생.
- 모든 모드 스위치가 컨텍스트 스위치를 일으키는 건 아님 — 시스템 콜이 즉시 끝나면 같은 스레드가 사용자 모드로 복귀할 뿐 스위칭은 없음.
- 인터럽트 ≠ 컨텍스트 스위치 — 인터럽트는 트리거, 컨텍스트 스위치는 결과 중 하나.
21번 본문 §”컨텍스트 스위칭이 일어나는 경우” 첫 항목(타이머 인터럽트 만료) 참조.
2. PCB의 역할
한 줄 결론 — PCB(Process Control Block, 프로세스 제어 블록)는 OS가 한 프로세스의 모든 상태를 보관하는 커널 자료구조다. 식별·격리·자원·스케줄링·컨텍스트 저장 다섯 역할이 한 구조체 안에 모인다.
2-1. 다섯 역할
| 역할 | 보관 내용 |
|---|---|
| ① 식별 (Identification) | PID, 부모 PID, 사용자 ID, 프로세스 그룹 |
| ② 주소 공간 격리 (Isolation) | 페이지 테이블 베이스 주소(x86 CR3 값). 프로세스 전환 시 이 값이 CR3 레지스터로 적재되면서 가상 주소 공간이 통째로 바뀜 |
| ③ 자원 관리 (Resource) | 열린 파일 디스크립터 테이블, 핸들 테이블, 시그널 핸들러, 메모리 맵 영역(VMA), 작업 디렉토리 |
| ④ 스케줄링 상태 (Scheduling) | Ready / Running / Wait 상태, 우선순위, 누적 CPU 시간, time slice 잔량 |
| ⑤ 컨텍스트 저장 매체 (Context Storage) | 프로세스 단위 컨텍스트(레지스터 스냅샷은 보통 TCB에 들어가지만, 단일 스레드 프로세스나 옛 시스템에선 PCB에 직접 보관) |
2-2. OS별 실체
| OS | PCB 구조체 | 위치 |
|---|---|---|
| Linux | task_struct | <linux/sched.h> — 5,000+ 줄 거대 구조체. 스레드도 같은 구조 (NPTL: 1:1 스레드 모델) |
| Windows | EPROCESS | 커널 객체. 그 안에 KPROCESS(스케줄러용)와 별도로 ETHREAD/KTHREAD(스레드별)가 연결 |
| xv6 (교육용) | struct proc | proc.h — 한 페이지 안에 들어가는 단순 버전, 컨텍스트·페이지 디렉토리·파일 테이블만 보관 |
2-3. 컨텍스트 스위치 시 PCB의 흐름
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[현재 실행 중인 스레드 T_old]
↓
[1] T_old의 레지스터 → T_old의 TCB로 저장
↓
[2] PCB 비교: T_old의 PCB == T_new의 PCB?
├─ YES (같은 프로세스 내 스레드 전환)
│ └─ CR3 그대로, TLB 보존, 캐시 보존 → 빠름
└─ NO (프로세스 전환)
└─ T_new의 PCB.CR3 값을 CR3 레지스터에 적재
→ TLB flush (PCID 없으면)
→ 캐시 콜드 → 느림
↓
[3] T_new의 TCB에서 레지스터 복원
↓
[T_new 실행 시작]
2-4. 면접에서 강조 포인트
- “PCB는 프로세스 단위, TCB는 스레드 단위” — 둘이 분리돼 있어야 같은 프로세스의 스레드끼리 PCB를 공유해 전환 비용을 줄일 수 있음.
- CR3가 PCB에 들어 있다는 점이 주소 공간 격리의 물리적 구현 — 프로세스마다 다른 페이지 테이블을 가리키게 만드는 한 줄.
21번 본문 §”핵심 개념” → PCB 행 참조. 22번 IPC 본문도 PCB·페이지 테이블·핸들 테이블이 IPC 비용의 출발점이라고 짚음.
3. 레지스터는 메모리일까요?
한 줄 결론 — 일반적으로 “메모리”라 부르지 않는다. 둘 다 데이터 저장 공간이지만 위치·속도·접근 방식이 다르고, 운영체제·컴퓨터 구조 교과서에서도 레지스터는 메모리 계층(memory hierarchy)의 최상위 단으로 분류하되 “메모리”라는 용어와는 구분한다.
3-1. 차이를 한 표로
| 항목 | 레지스터 | 메인 메모리 (RAM) |
|---|---|---|
| 위치 | CPU 코어 내부 | CPU 외부, 메인보드의 메모리 슬롯 |
| 접근 속도 | ~0.3 ns | ~100 ns (300배) |
| 용량 | 64bit × 수십 개 (수백 바이트) | 수 GB |
| 접근 방식 | 이름으로 (rax, rbx, xmm0…) | 주소로 (MOV [0x1000], rax) |
| 명령어 인코딩 | opcode 안에 레지스터 번호가 직접 들어감 | opcode + 주소 계산 |
| 공유 | 컨텍스트 스위치 시 저장·복원 필요 (스레드마다 논리적으로 별개) | 같은 프로세스 내 스레드끼리 공유 |
| 재료 | SRAM (트랜지스터 6개/bit) | DRAM (트랜지스터+커패시터 1쌍/bit) |
3-2. 왜 “메모리”라 안 부르나
- 언어 관습 — “메모리에 쓴다”는 보통 RAM에 store 명령(
MOV [addr], r)을 보낸다는 뜻. 레지스터는 “레지스터에 둔다”고 따로 표현. - 주소 공간 분리 — 메모리는 가상 주소 공간 안에서 주소를 가지지만, 레지스터는 주소 공간 밖.
®ister같은 게 불가능(C/C++에서register키워드 변수에&못 씀이 이 때문). - MMU 적용 안 됨 — 페이지 테이블·TLB는 메모리 접근에만 적용. 레지스터는 MMU 통과 안 함.
- 캐시 계층 외부 — L1/L2/L3 캐시는 “메모리 계층의 일부”로 자주 묶이지만, 레지스터는 그 위에 별도로 놓임.
3-3. 그런데 왜 헷갈리나
- 메모리 계층(memory hierarchy) 다이어그램에선 레지스터를 맨 위에 그림. → “포함된다”고 오해 가능.
- 일부 ISA(Itanium 등)에선 레지스터 윈도우·메모리 매핑 레지스터 같은 모호한 케이스 존재.
- 임베디드·하드웨어에선 “메모리 매핑 I/O(MMIO) 레지스터”라는 표현 씀 → 이건 메모리 주소처럼 접근하는 디바이스 제어용 레지스터, CPU 범용 레지스터와 별개.
3-4. 면접 답변 한 줄
“레지스터는 메모리 계층의 최상위 단으로 분류되긴 하지만, 일반적으로 ‘메모리’라고 부르진 않습니다. CPU 코어 내부에 있고, 이름으로 접근하며, MMU·페이지 테이블이 적용되지 않는다는 점에서 RAM과 분명히 구분됩니다.”
21번 본문 §”핵심 개념” → “레지스터 vs 메모리” 행 참조.
4. 컨텍스트 스위칭 과정중 캐시 히트율 때문에 프로세스보다 스레드가 빠르다
한 줄 결론 — 스레드 전환은 같은 프로세스의 코드·힙·전역 데이터가 L1/L2/L3 캐시에 그대로 남아 있어 캐시 히트율을 유지하고, 프로세스 전환은 가상 주소 공간이 바뀌면서 TLB flush + 캐시 콜드(cache cold) 가 발생해 미스가 누적된다. 이게 “스레드 전환이 프로세스 전환보다 5~10배 빠르다”는 말의 핵심 근거.
4-1. 비용 비교 표
| 비용 항목 | 스레드 전환 (같은 프로세스 내) | 프로세스 전환 |
|---|---|---|
| 레지스터 저장·복원 | 발생 (~수백 ns) | 발생 (동일) |
| 커널 진입 (모드 스위치) | 발생 | 발생 |
| 페이지 테이블 베이스 (CR3) 교체 | 없음 | 발생 |
| TLB flush | 없음 (PCID 없어도 안 일어남) | 발생 (PCID 없으면 전체 flush) |
| L1/L2 캐시 콜드 | 없음 — 같은 코드·전역·힙이 그대로 살아있음 | 발생 — 새 프로세스 데이터 채워야 함 |
| L3 캐시 콜드 | 없음 | 부분 발생 (코어 공유라 일부 보존) |
| 분기 예측기 / 파이프라인 | 약간 무효화 | 더 크게 무효화 |
| 전체 비용 (대략) | 1~3 μs | 5~15 μs (스레드의 5~10배) |
4-2. 왜 같은 프로세스 스레드는 캐시가 살아있나
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
프로세스 P 안에 스레드 T1, T2가 있다고 하자.
T1이 코드 X 실행 → X의 명령어가 L1i, 데이터가 L1d/L2/L3에 캐시됨.
T1 → T2 컨텍스트 스위치:
- 둘 다 같은 P의 가상 주소 공간 공유
- 같은 페이지 테이블, 같은 가상→물리 매핑
- X의 코드/데이터는 같은 물리 주소에 그대로 있고,
캐시는 물리 주소로 인덱싱(보통 VIPT/PIPT)되므로 유효
- T2가 같은 코드 영역이나 전역 변수를 만지면 즉시 캐시 히트
T1 → T3 (다른 프로세스 Q의 스레드) 컨텍스트 스위치:
- 가상 주소 공간 자체가 바뀜 (CR3 교체)
- L1/L2의 데이터는 물리적으론 남아있지만, T3가 만질 주소들은
Q의 코드·힙·전역 → 캐시에 거의 없음
- 줄줄이 miss → DRAM 접근(~100ns) 반복 → 느려짐
4-3. TLB flush가 추가로 얹는 비용
- TLB(Translation Lookaside Buffer)는 가상→물리 주소 매핑을 캐싱하는 MMU 내부 캐시 (보통 64~1024 엔트리).
- 프로세스 전환 시 가상 주소 공간이 바뀌므로 TLB 엔트리가 무의미 → flush 필요.
- flush 이후 처음 메모리 접근들은 페이지 테이블 워크(page table walk) 를 다시 수행 → 4단계 페이징 시 메모리 4번 추가 접근.
- 현대 CPU의 PCID(Process Context ID, x86) / ASID(ARM) 는 TLB 엔트리를 프로세스별로 태깅해 전체 flush를 회피. 그래도 캐시 콜드는 막을 수 없음.
4-4. 면접에서 강조 포인트
- “5~10배 차이는 레지스터 저장량 차이가 아니라 TLB flush + 캐시 콜드의 간접 비용 차이입니다.” — 직접 비용은 거의 같음.
- “그래서 같은 프로세스 안에서 스레드를 쓰는 게 OS 차원에서 권장되는 동시성 모델입니다 (CPU 캐시 활용도 측면).”
- “단, 공유 메모리 경쟁으로 false sharing 같은 캐시 라인 오염이 일어나면 이 이점이 무효화될 수 있어요.” (멀티스레드 캐시 이슈로 꼬리 가능)
21번 본문 §”비용 요소” → “캐시 콜드”·”TLB flush” 행, §”비교” → “캐시 히트율로 본 스레드 우위” 행 참조.
5. RAM과 레지스터 사이의 저장공간
한 줄 결론 — L1 / L2 / L3 캐시 (SRAM 기반) 가 그 자리에 있다. 메모리 계층은 위로 갈수록 빠르고 작고 비싸며, 컨텍스트 스위칭 비용 분석에서 캐시 콜드가 결정적이라는 이야기가 바로 이 계층 때문이다.
5-1. 메모리 계층 한 표
| 단계 | 위치 | 용량 | 접근 시간 | 재료 | 특징 |
|---|---|---|---|---|---|
| 레지스터 (Register) | CPU 코어 내부 | 64bit × 수십 개 | ~0.3 ns | SRAM | 이름으로 접근, MMU 미적용 |
| L1 캐시 | 코어 전용 | 32~64 KB (i-cache + d-cache 분리) | ~1 ns (4 cycle) | SRAM | 명령(L1i) / 데이터(L1d) 분리. 가장 빠른 캐시 |
| L2 캐시 | 코어 전용 | 256 KB ~ 1 MB | ~3 ns (12 cycle) | SRAM | L1 miss 시 다음 단계 |
| L3 캐시 (LLC) | 여러 코어 공유 | 4 MB ~ 수십 MB | ~10 ns (40 cycle) | SRAM | 코어 간 공유 → 캐시 일관성(MESI) 프로토콜 동작 지점 |
| RAM (메인 메모리) | CPU 밖, 메모리 슬롯 | 8 ~ 128 GB | ~100 ns | DRAM | 가상 주소 → MMU/TLB → 페이지 테이블 → 물리 주소 |
| SSD/HDD | I/O 버스 | 수백 GB ~ 수 TB | ~100 μs (SSD) / ~10 ms (HDD) | NAND / 자기 | 페이지 폴트 시 스왑/메모리 맵 파일 |
5-2. SRAM vs DRAM — 왜 캐시는 빠르고 RAM은 느린가
| 항목 | SRAM (캐시·레지스터) | DRAM (메인 메모리) |
|---|---|---|
| 1 bit 구성 | 트랜지스터 6개 | 트랜지스터 1개 + 커패시터 1개 |
| 속도 | 빠름 (~ns) | 느림 (~10 ns + 행 활성화) |
| 밀도 | 낮음 (셀 크기 큼) | 높음 (작은 셀 → 대용량) |
| 단가 | 매우 비쌈 | 쌈 |
| 리프레시 | 불필요 | 주기적 리프레시 필요 (커패시터 누설) |
| 휘발성 | 휘발성 | 휘발성 |
→ “그래서 캐시는 비싸서 작고, RAM은 싸서 큰” 트레이드오프.
5-3. 캐시 라인과 캐시 미스
- 캐시는 바이트 단위가 아니라 캐시 라인(cache line, 보통 64 byte) 단위로 RAM과 주고받음.
- 캐시 미스 시 64 byte 한 묶음을 통째로 끌어옴 → 인접 데이터는 자동으로 따라옴(공간 지역성).
- 컨텍스트 스위치 직후 “캐시 콜드”는 결국 새 스레드의 워킹셋(working set)이 캐시에 채워질 때까지의 미스 누적.
5-4. TLB는 이 계층 어디인가
- TLB(Translation Lookaside Buffer)도 캐시의 일종이지만 데이터 캐시(L1/L2/L3)와 별개.
- 위치: MMU 안 (CPU 코어 내부의 한 모듈).
- 캐싱 대상: 가상 → 물리 주소 매핑 (페이지 테이블 엔트리).
- 보통 L1 TLB(~64 엔트리) + L2 TLB(~1024 엔트리) 2단 구성.
- 프로세스 전환 시 PCID/ASID 없으면 flush → 이후 페이지 테이블 워크 누적 (RAM 접근 4번까지).
5-5. 컨텍스트 스위칭 비용의 출처를 이 계층으로 분해
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
컨텍스트 스위치 직후 새 스레드 한 줄 실행:
[CPU가 명령 fetch]
↓ PC 가상 주소 → MMU → TLB lookup
├ TLB hit → 물리 주소 즉시 (~1 ns)
└ TLB miss → 페이지 테이블 워크 (~수십 ns + DRAM 4번)
↓ 물리 주소 → 캐시 lookup
├ L1i hit (~1 ns)
├ L2 hit (~3 ns)
├ L3 hit (~10 ns)
└ 미스 모두 → DRAM (~100 ns)
↓ 명령 디코드 → 실행
같은 프로세스 스레드 전환:
- TLB 보존, 캐시 보존 → 대부분 hit → 빠름
다른 프로세스 전환:
- TLB flush, 캐시 콜드 → 첫 수백~수천 명령 동안 miss 폭주 → 느림
5-6. 면접 답변 한 줄
“RAM과 레지스터 사이에는 L1 / L2 / L3 캐시가 있고, 모두 SRAM 기반이라 DRAM인 RAM보다 빠릅니다. L1·L2는 코어 전용, L3는 코어 공유라 캐시 일관성 프로토콜이 동작합니다. 컨텍스트 스위칭 비용 이야기에서 ‘캐시 콜드’가 결정적이라는 게 바로 이 계층이 비어 있을 때의 미스 누적을 가리킵니다.”
21번 본문 §”핵심 개념” → “메모리 계층”·”L1/L2/L3 캐시”·”SRAM vs DRAM” 행 참조.
회귀 매트릭스 — 이 5개 질문이 어떻게 연결되나
1
2
3
4
5
6
7
8
9
10
interrupt (1)
↓ 타이머 인터럽트가 스케줄러 호출 → 컨텍스트 스위치 발화점
PCB (2)
↓ 교체 여부가 스레드 vs 프로세스 전환을 결정
캐시 히트율 (4)
↑ PCB 교체 시 CR3 변경 → TLB flush + 캐시 콜드
레지스터 ≠ 메모리 (3)
↑ 컨텍스트 = 레지스터 스냅샷. 메모리(RAM)와 구분되는 별도 저장소
RAM ↔ 레지스터 사이 (5)
↑ L1/L2/L3 캐시. 캐시 콜드의 무대
한 줄 요약: 인터럽트 → PCB 교체 → CR3 변경 → TLB flush → 캐시 콜드 → 미스 누적 → 프로세스 전환이 스레드 전환보다 느림. 다섯 질문이 이 한 줄을 다섯 각도로 파고든 것.
핵심 요약 — 모의면접 꼬리질문 다섯 개가 결국 한 줄로 이어진다는 것. 인터럽트가 스케줄러를 깨우고, PCB 교체 여부가 프로세스/스레드 전환을 가르고, CR3 변경이 TLB flush와 캐시 콜드를 부르고, 그 미스 누적이 프로세스 전환을 느리게 만든다.