운영체제 — 백엔드 면접 (실제 기출 기반·심화)
한국 백엔드 면접에서 가장 많이 나오는 CS 주제다. "프로세스 vs 스레드", "데드락 4조건", "뮤텍스와 세마포어 차이", "컨텍스트 스위칭이 왜 비싼가", "페이지 폴트 처리 과정", "LRU 구현" — 단골이고, 면접관은 정의 → PCB 유무 → 리눅스 구현 → TLB처럼 계단식으로 파고든다(VSFe 패턴).
면접관이 노리는 함정이 많은 주제다: SRT는 비선점? Belady? 세마포어=뮤텍스? — "흔한 오답" 박스를 곳곳에 둔다.
1. 프로세스 vs 스레드 (★★★ 최다 단골)
실제 질문: "프로그램/프로세스/스레드의 차이를 설명해주세요." · "멀티프로세스 대신 멀티스레드를 쓰는 이유는?" · (꼬리)"스레드는 PCB를 갖고 있나요?" · "리눅스에서 프로세스와 스레드는 각각 어떻게 생성되나요?"(
forkvsclone) (VSFe·gyoogle)
- 프로세스: 실행 중인 프로그램. 독립된 메모리(Code·Data·Heap·Stack)·자원. PCB(Process Control Block)로 관리.
- 스레드: 프로세스 내 실행 흐름. Code·Data·Heap 공유, Stack·레지스터·PC만 독립.
깊이: 멀티스레드 장점 = 메모리 공유로 통신 쉬움·컨텍스트 스위칭 가벼움·생성 비용↓. 단점 = 한 스레드의 오류가 프로세스 전체를 죽임·동기화 필요. 리눅스는 내부적으로 스레드도 task_struct(경량 프로세스)로 관리 → fork(주소공간 복사) vs clone(자원 공유 플래그)으로 구분.
꼬리질문: "스레드도 PCB를?" → 리눅스는 스레드를 *경량 프로세스(task_struct)*로 보아 각자 관리 구조를 가짐. / "왜 멀티프로세스보다 멀티스레드?" → 공유·경량 / 단 안정성은 멀티프로세스(크롬 탭). / "스레드 안전한 통신은?" → 공유 메모리 + 동기화.
함정: ❌ "스레드는 Stack도 공유한다" → Stack·PC·레지스터는 독립. ❌ "프로세스 간 통신이 더 쉽다" → 스레드가 공유 메모리로 더 쉽다(대신 동기화).
2. 컨텍스트 스위칭 (★★ 단골)
실제 질문: "PCB가 무엇인가요?" · "컨텍스트 스위칭 시 어떤 일이 일어나며 왜 비용이 발생하나요?" · (심화)"TLB 관점에서 무슨 변화가 일어나나요?" (VSFe)
CPU가 실행 중인 프로세스를 바꾸는 것 = 현재 상태(레지스터·PC)를 PCB에 저장 → 다음 PCB 복원.
깊이 — 비용의 정체(★): ① 레지스터 저장/복원 ② 캐시·TLB 무효화(다른 프로세스는 주소 공간이 달라 캐시·TLB 히트가 사라짐 → 콜드 스타트) ③ 파이프라인 비움. 스레드 간 스위칭은 주소 공간이 같아 TLB flush가 없어 더 싸다.
꼬리질문: "TLB flush를 피하려면?" → ASID(주소공간 ID)로 프로세스별 TLB 엔트리 구분 → flush 회피. / "언제 일어나나?" → 타임슬라이스 만료·인터럽트·I/O 대기·더 높은 우선순위.
함정: ❌ "프로세스든 스레드든 스위칭 비용이 같다" → 스레드는 주소 공간 공유라 더 쌈(TLB).
3. 동기화 — 뮤텍스·세마포어·스핀락 (★★★ 단골)
실제 질문: "뮤텍스와 세마포어의 차이는?" · "이진 세마포어와 뮤텍스의 차이는?" · "Race Condition이 무엇이고 Thread-safe를 어떻게 보장하나요?" · (심화)"Spin Lock의 장단점과 개선책은?" (전 소스)
- Race Condition: 둘 이상이 공유 자원을 동시에 접근·수정 → 결과가 실행 순서에 의존. **임계 구역(critical section)**을 상호배제로 보호.
- 뮤텍스(Mutex): 1개 자원의 잠금. 소유권 있음(잠근 스레드만 해제).
- 세마포어(Semaphore): 카운터(N개 자원·예: 커넥션 풀·생산자-소비자처럼 동일 자원 N개 동시 접근 제한). 소유권 없음(다른 스레드가 signal 가능). 이진 세마포어(0/1)는 뮤텍스와 비슷하나 소유권이 없다.
- 스핀락(Spin Lock): 락 풀릴 때까지 바쁜 대기(CPU 점유) → 락 보유가 매우 짧을 때 컨텍스트 스위칭 비용보다 유리. 길면 낭비.
깊이 — 변별점은 소유권: "세마포어는 뮤텍스가 될 수 있지만 뮤텍스는 세마포어가 될 수 없다"(소유권 때문). 뮤텍스는 우선순위 상속 등 소유권 기반 기능 가능.
꼬리질문: "뮤텍스/세마포어는 락 시 시스템 콜이 필요한데 개선책은?" → futex(경합 없을 땐 유저공간 CAS, 경합 시만 커널 — 시스템 콜은 유저↔커널 모드 전환 비용이 커서 fast-path를 유저공간에). / "락 없이 thread-safe?" → CAS·원자 연산·불변 객체·ThreadLocal. / "스핀락 단점 해결?" → 적응형 락(잠깐 스핀 후 블록).
함정: ❌ "이진 세마포어 = 뮤텍스" → 소유권이 다르다. ❌ "스핀락이 항상 빠르다" → 락 보유가 길면 CPU 낭비.
4. 데드락 (★★ 단골)
실제 질문: "Deadlock과 발생 4조건을 설명하라." · (꼬리)"3가지만 충족하면 왜 데드락이 안 생기나요?" · (심화)"왜 현대 OS는 데드락을 적극적으로 처리하지 않나요?" (전 소스)
4조건(모두 필요조건): ① 상호배제 ② 점유와 대기 ③ 비선점 ④ 순환대기. 하나라도 깨면 데드락 없음.
- 예방(prevention): 4조건 중 하나를 원천 차단(가장 단순·자원 효율↓). 회피(avoidance): 안전 상태 유지(은행원 알고리즘). 탐지·회복: 주기적 탐지 후 victim 롤백.
깊이 — 왜 OS는 무시하나(★ ostrich): 데드락은 드물고 예방/회피의 오버헤드가 크다 → 범용 OS(Linux/Windows)는 대개 무시하고 발생 시 재부팅에 맡긴다(타조 알고리즘). DB는 탐지 후 victim 롤백을 쓴다.
꼬리질문: "3조건만이면 왜 안 생기나?" → 4개가 모두 필요조건이라 하나만 빠져도 불가. / "DB의 데드락 처리?" → 주기적 탐지 → victim 트랜잭션 롤백(DB 편).
함정: ❌ "데드락 예방이 항상 최선" → 자원 효율·처리량 저하 → 실무는 탐지/무시.
5. CPU 스케줄링 (★ 단골)
실제 질문: "FCFS, SJF, SRT, 우선순위, Round Robin의 차이는?" · "RR의 Time Slice에 따른 trade-off는?" · "단/중/장기 스케줄러를 설명하라." (전 소스)
| 기법 | 방식 | 특징 |
|---|---|---|
| FCFS | 도착 순 | 단순·convoy effect(긴 작업이 막음) |
| SJF | 최단 작업 우선 | 평균 대기 최소·기아·예측 어려움 |
| SRT | SJF의 선점형 | 더 짧은 게 오면 뺏음 |
| 우선순위 | 우선순위 순 | 기아 → 에이징 |
| RR | 타임슬라이스 순환 | 응답성↑·슬라이스 길이가 관건 |
깊이 — RR 타임슬라이스(★): 너무 길면 FCFS처럼 됨(응답성↓), 너무 짧으면 컨텍스트 스위칭 폭증(오버헤드↑). MLFQ(다단계 피드백 큐)는 짧은 작업을 우선하면서 기아를 방지.
꼬리질문: "단/중/장기?" → 장기(메모리 적재 결정)·중기(스왑)·단기(CPU 할당·가장 빈번). / "유저 스레드 vs 커널 스레드 스케줄링?" → 커널 스레드만 OS가 직접 스케줄.
함정: ❌ "SRT는 비선점이다" → SRT(SRTF)는 선점형이다(SJF의 선점 버전).
6. 가상 메모리·페이징 (★★ 단골)
실제 질문: "가상 메모리란? 가능한 이유는?" · "Page Fault 발생 시 처리 순서를 설명하라." · "내부/외부 단편화 차이는?" · (계산)"32비트, 페이지 1KB일 때 페이지 테이블 엔트리 최대 개수는?" (전 소스)
가상 메모리: 물리 메모리보다 큰 주소 공간을 디스크를 보조로 제공·프로세스별 독립 공간. 변환 단위 페이지(↔물리 프레임), PTE(유효비트·프레임번호·보호비트).
페이지 폴트 처리 순서(★): ① MMU가 PTE 유효비트=0 확인 → 트랩 ② OS가 유효 접근인지 검사 ③ 빈 프레임 확보(없으면 교체) ④ 디스크에서 페이지 로드 ⑤ PTE 갱신 ⑥ 명령 재실행.
- 내부 단편화(페이징·할당 단위보다 작게 써서 낭비) vs 외부 단편화(세그먼테이션·빈 공간이 흩어져 큰 블록 못 잡음).
- 계산: 32비트 주소·페이지 1KB(2¹⁰) → 페이지 수 = 2³²/2¹⁰ = 2²²개 엔트리.
- Thrashing: 페이지 폴트가 폭증해 실행보다 스왑에 시간을 다 씀 → Working Set·PFF로 완화·멀티프로그래밍 정도 조절.
꼬리질문: "TLB?" → 가상→물리 변환 캐시(매 접근 페이지 워크 회피). / "세그먼테이션 vs 페이징?" → 가변(외부 단편화·논리 단위) vs 고정(내부 단편화). / "Segmentation Fault는?" → 허용 안 된 메모리 접근(페이징 보호 위반).
함정: ❌ "세그먼테이션은 단편화가 없다" → 외부 단편화 존재. ❌ "MMU = TLB" → MMU는 변환 담당, TLB는 그 캐시.
7. 페이지 교체 (★ 단골·LRU 구현)
실제 질문: "페이지 교체 알고리즘을 설명하라." · "LRU는 어떤 특성을 이용하나요?" · "LRU를 어떻게 구현하나요?" (VSFe·min9288 후기)
- FIFO(먼저 들어온 것·간단·Belady 이상) · LRU(가장 오래 안 쓴 것·시간 지역성) · LFU(가장 적게 쓴 것·빈도) · Optimal(미래에 가장 늦게 쓸 것·구현 불가·이론 하한).
- LRU 구현(★ 코테 직결): 해시맵 + 이중 연결 리스트 → get/put O(1)(최근 쓴 것을 head로, 꼬리에서 evict).
꼬리질문: "Belady 이상이 뭔가?" → FIFO에서 프레임을 늘렸는데 페이지 폴트가 오히려 증가하는 역설(LRU·Optimal은 stack 알고리즘이라 면역). / "Optimal을 구현 못 하는 이유?" → 미래 참조 정보가 필요. / "LRU 단점·대안?" → 매 접근 갱신 비용 → Clock(2nd chance) 근사. / "LFU 단점?" → 과거 집중 참조 페이지가 안 빠지는 cache pollution.
함정: ❌ "프레임을 늘리면 페이지 폴트는 항상 준다" → Belady 이상(FIFO). ❌ "Optimal을 실제로 쓴다" → 불가(하한 기준).
흔한 오답·함정 정리
- SRT는 비선점 → 선점형(SJF 선점 버전).
- 이진 세마포어 = 뮤텍스 → 소유권이 다르다.
- 스레드는 Stack도 공유 → Stack·PC·레지스터는 독립.
- 세그먼테이션은 단편화 없음 → 외부 단편화 있음.
- 프레임↑ → 폴트↓ 항상 → Belady 이상(FIFO).
- Blocking = 동기 → 직교 개념(제어권 vs 결과 처리 시점).
한국 면접 단골 Q&A (답변 골격)
| 질문 | 핵심 답 |
|---|---|
| 프로세스 vs 스레드 | 독립 메모리·PCB vs Code/Data/Heap 공유·Stack 독립 |
| 멀티스레드 이유 | 공유·경량·생성↓ / 안정성은 멀티프로세스 |
| 컨텍스트 스위칭 비용 | 레지스터+캐시/TLB 무효화·스레드는 TLB flush 없음 |
| 뮤텍스 vs 세마포어 | 소유권 있음(1) vs 카운터(N·소유권 없음) |
| Race·thread-safe | 임계구역 보호·락/CAS/불변 |
| 데드락 4조건 | 상호배제·점유대기·비선점·순환대기(모두 필요) |
| CPU 스케줄링 | FCFS/SJF/SRT(선점)/RR(슬라이스)/우선순위 |
| 페이지 폴트 처리 | 유효검사→프레임→디스크 로드→PTE→재실행 |
| 단편화 | 내부(페이징) vs 외부(세그먼테이션) |
| 페이지 교체·LRU | FIFO/LRU(지역성)/LFU/Optimal·LRU=해시맵+이중연결 |
꼬리질문 대비 (상 난이도)
- "컨텍스트 스위칭 TLB?" → 프로세스 전환 시 flush·ASID로 회피·스레드는 불필요.
- "락 시스템 콜 줄이기?" → futex(경합 없으면 유저공간 CAS).
- "현대 OS가 데드락을 무시?" → 드물고 비싸서(ostrich)·DB는 탐지 후 롤백.
- "Belady 이상?" → FIFO 프레임↑인데 폴트↑·LRU/Optimal엔 없음(스택 알고리즘).
- "32bit/1KB PTE 수?" → 2²²개.
한 줄 요약 — 프로세스(독립·PCB)↔스레드(Code/Data/Heap 공유·Stack 독립). 컨텍스트 스위칭 비용=레지스터+캐시/TLB 무효화(스레드는 flush 없음). 동기화=뮤텍스(소유권)/세마포어(카운터)/스핀락·이진 세마포어≠뮤텍스(소유권). 데드락 4조건(모두 필요·OS는 ostrich). 스케줄링 FCFS/SJF/SRT(선점)/RR(슬라이스). 가상메모리=페이지 폴트(유효→로드→PTE→재실행)·내부/외부 단편화·thrashing. 교체 FIFO(Belady)/LRU(지역성·해시맵+이중연결)/Optimal(불가).
(출처 — 한국 면접 기출·교차검증 2026-06: VSFe/Tech-Interview — 운영체제·gyoogle — Process vs Thread·ksundong/backend-interview-question·min9288 OS 면접 함정 · OSTEP(가상메모리·스케줄링·동시성) 교차검증.)