✅ 1. 프로세스와 스레드의 차이
- 질문: 프로세스와 스레드의 차이는 무엇인가요?
모범 답안
- 프로세스는 독립된 메모리 공간을 가진 실행 단위입니다.
- 스레드는 하나의 프로세스 내에서 실행되는 작업 단위로, 같은 메모리 공간을 공유합니다.
- 스레드는 문맥 전환이 가볍고, 병렬 처리에 유리합니다.
심화 질문
- 스레드 간 동기화는 어떻게 처리하나요?
모범 답안
- 뮤텍스, 세마포어, 크리티컬 섹션 등을 통해 공유 자원 접근을 제어합니다.
- 고성능 게임에서는 std::atomic이나 락-프리 자료구조를 활용합니다.
✅ 2. 힙과 스택의 차이
- 질문: 힙과 스택의 차이는 무엇인가요?
모범 답안
- 스택은 지역 변수에 사용되며, 자동으로 메모리가 할당/해제되고 빠릅니다.
- 힙은 개발자가 직접 메모리를 할당/해제해야 하며 크기는 크지만 느립니다.
심화 질문
- 스택 오버플로우는 어떤 상황에서 발생하나요?
모범 답안
- 재귀 호출이 과도하거나 너무 큰 지역 변수를 사용할 때 발생합니다.
✅ 3. 메모리 누수 방지 기법
- 질문: 메모리 누수는 어떻게 방지할 수 있나요?
모범 답안
- 스마트 포인터(unique_ptr, shared_ptr) 사용
- RAII, 메모리 풀, 오브젝트 풀링 사용
- 리소스 해제를 명확히 하는 코딩 스타일 유지
심화 질문
- 힙 단편화를 줄이기 위한 방법은?
모범 답안
- 고정 크기 블록 할당, 풀 할당자 사용
- 메모리 풀을 구성하여 자주 사용하는 크기의 블록을 사전에 관리
✅ 4. 캐시와 지역성
- 질문: 캐시 메모리와 지역성이란 무엇인가요?
모범 답안
- 캐시는 CPU 속도와 메모리 속도 차이를 줄이기 위한 고속 메모리입니다.
- 시간 지역성과 공간 지역성을 활용해 캐시 효율을 높입니다.
심화 질문
- 캐시 미스는 어떤 종류가 있나요?
모범 답안
- Cold Miss, Capacity Miss, Conflict Miss
- 각각 최초 접근, 용량 부족, 캐시 충돌로 발생합니다.
✅ 5. 문맥 전환이란?
- 질문: 문맥 전환이란 무엇인가요?
모범 답안
- CPU가 다른 스레드/프로세스로 작업을 바꿀 때 상태를 저장하고 복원하는 과정
- 오버헤드가 발생하며 너무 잦으면 성능 저하
심화 질문
- 경량 스레드와 커널 스레드의 문맥 전환 차이는?
모범 답안
- 커널 스레드는 OS가 전환을 관리해 오버헤드가 큼
- 사용자 스레드(Green Thread)는 경량으로 문맥 전환이 빠름
✅ 6. 동기화란?
- 질문: 동기화란 무엇인가요?
모범 답안
- 여러 스레드가 공유 자원을 동시에 접근할 때 데이터 무결성을 보장하는 기법
- 뮤텍스, 세마포어, 모니터 사용
심화 질문
- 뮤텍스와 세마포어의 차이는?
모범 답안
- 뮤텍스는 한 스레드만 접근 허용, 세마포어는 동시 접근 수 조절 가능
✅ 7. 데드락이란?
- 질문: 데드락이란 무엇인가요?
모범 답안
- 두 개 이상의 스레드가 서로 자원을 기다리며 무한 대기하는 상태
심화 질문
- 데드락을 방지하는 방법은?
모범 답안
- 자원 할당 순서를 고정
- 타임아웃 설정
- 교착상태 감지/회복 기법 활용
✅ 8. 가상 메모리
- 질문: 가상 메모리란 무엇인가요?
모범 답안
- 실제 물리 메모리보다 큰 공간을 사용하는 듯한 추상화된 메모리 공간
- 페이징 기법 사용, 주소 변환을 통해 메모리 관리
심화 질문
- 페이지 폴트는 언제 발생하나요?
모범 답안
- 접근하려는 주소가 실제 메모리에 없을 때 발생하며, 디스크에서 로딩 필요
추가 심화 질문
- TLB는 무엇이고 어떤 역할을 하나요?
모범 답안
- TLB는 주소 변환 결과를 캐싱하여 가상 → 물리 주소 변환을 빠르게 수행함
✅ 9. 멀티스레딩과 레이스 컨디션
- 질문: 멀티스레딩과 레이스 컨디션이란?
모범 답안
- 멀티스레딩은 병렬 처리 구조이며, 공유 자원 접근 시 순서에 따라 결과가 달라질 수 있는 문제가 레이스 컨디션
심화 질문
- Atomic 연산이란 무엇인가요?
모범 답안
- 더 이상 쪼갤 수 없는 연산. std::atomic 등을 통해 동기화 없이 안전하게 연산 가능
✅ 10. 게임 루프에서의 스레드 활용
- 질문: 게임 클라이언트에서 스레드는 어떤 용도로 쓰이나요?
모범 답안
- 리소스 로딩, AI 처리, 사운드, 네트워크 수신 등 병렬 처리에 사용
심화 질문
- 게임 루프에서 멀티스레딩을 적용한 사례는?
모범 답안
- 렌더링과 논리 분리
- 비동기 리소스 스트리밍
- Job 시스템 또는 코루틴 기반 동시 작업 처리
✅ 11. 스토리지 및 SSD
- 질문: HDD와 SSD의 차이점은?
모범 답안
- HDD는 물리 회전 디스크, SSD는 반도체 기반
- SSD는 빠르고, 전력 소모 적고, 충격에 강함
심화 질문
- SSD에서 TRIM 명령은 어떤 역할을 하나요?
모범 답안
- 사용하지 않는 블록을 미리 정리해 SSD 성능 유지 및 수명 연장
추가 심화 질문
- 게임에서 로딩 속도를 높이기 위한 스토리지 활용법은?
모범 답안
- 비동기 스트리밍, 묶음 로딩, 메모리 맵핑 활용
✅ 12. 파이프라인과 CPU 구조
- 질문: CPU 파이프라인이란?
모범 답안
- 명령어를 여러 단계로 분리하여 병렬로 처리하여 성능을 높이는 구조
심화 질문
- 파이프라인 해저드란?
모범 답안
- 명령어 간 의존성이나 자원 충돌로 파이프라인 흐름이 끊기는 현상
(데이터, 제어, 구조적 해저드 존재)
추가 심화 질문
- Superscalar 구조란?
모범 답안
- 하나의 사이클에서 여러 명령어를 병렬로 실행할 수 있는 CPU 아키텍처
✅ 전체 요약 표 (카테고리별)
| 프로세스/스레드 | 프로세스 vs 스레드 차이 | 스레드 동기화, 활용 사례 |
| 메모리 | 힙 vs 스택, 메모리 누수 | 스택 오버플로우, 단편화 |
| 캐시 | 캐시 지역성 | 캐시 미스 종류 |
| 동기화 | 뮤텍스, 세마포어 | 데드락 방지 |
| 가상 메모리 | 페이징, TLB | 페이지 폴트 |
| 멀티스레딩 | 병렬 처리, 레이스 컨디션 | atomic, 게임 적용 사례 |
| 스토리지 | SSD vs HDD | TRIM, 스트리밍 |
| CPU 구조 | 파이프라인 | 해저드, Superscalar |
✅ 13. 자료구조 / 알고리즘
Q. 게임에서 어떤 자료구조를 자주 쓰나요?
모범 답안:
배열, 큐, 스택, 해시맵, 그래프, 우선순위 큐 등을 사용합니다. 예를 들어, 상태 전이는 해시맵으로 빠르게 접근하고, 경로 탐색에는 A*와 우선순위 큐를 사용합니다.
심화 질문: 힙과 우선순위 큐의 차이는?
심화 답변: 힙은 최소/최대 값을 빠르게 찾기 위한 트리 기반 자료구조입니다. 우선순위 큐는 힙을 내부적으로 사용하여 요소들을 우선순위에 따라 정렬된 큐처럼 처리합니다. 즉, 구현은 힙, 인터페이스는 큐입니다.
심화 질문: unordered_map의 구조와 충돌 해결 방식은?
심화 답변: unordered_map은 해시 테이블 기반이며, 동일한 해시 값 충돌 시 체이닝 방식(Linked List 혹은 Bucket 내부 구조)으로 데이터를 저장합니다. 충돌을 줄이기 위해 적절한 해시 함수와 리해싱 전략이 중요합니다.
심화 질문: O(1)과 O(logN)이 공존하는 자료구조는?
심화 답변: unordered_map은 평균 O(1) 검색을 제공하지만, 최악의 경우 O(N)입니다. map은 항상 O(logN)입니다. 상황에 따라 안정성을 원하면 map을, 속도를 원하면 unordered_map을 사용합니다.
✅ 14. 언어 (C++ / C#)
Q. C++에서 가상 함수와 순수 가상 함수의 차이는?
모범 답안:
가상 함수는 자식 클래스에서 재정의할 수 있는 함수이며, 순수 가상 함수는 반드시 자식 클래스에서 구현해야 합니다. 순수 가상 함수가 하나라도 있으면 해당 클래스는 추상 클래스가 됩니다.
심화 질문: 가상 함수 테이블(V-Table)은 어떻게 구성되나요?
심화 답변: 클래스마다 가상 함수 포인터 배열(VTable)을 가지며, 객체는 해당 클래스의 VTable을 가리키는 VPTR을 멤버로 가지고 있습니다. 런타임 시 해당 테이블을 통해 실제 호출할 함수의 주소를 찾아 다형성을 구현합니다.
심화 질문: 생성자/소멸자에서 가상 함수 호출이 위험한 이유는?
심화 답변: 생성자/소멸자에서는 해당 객체가 완전히 초기화되지 않았거나 이미 파괴 중일 수 있기 때문에 VTable이 완전하지 않을 수 있어, 예상과 다른 동작이 발생합니다. 따라서 가상 함수 호출은 피해야 합니다.
심화 질문: 스마트 포인터 종류와 사용 시점은?
심화 답변:
- unique_ptr: 소유권 단일, 이동만 가능
- shared_ptr: 참조 카운트 기반 공유 소유
- weak_ptr: 순환 참조 방지용 (shared_ptr 참조 전용)
심화 질문: 다중 상속을 안전하게 사용하는 방법은?
심화 답변: 다중 상속은 인터페이스(순수 가상 클래스)만 다중 상속하고, 구현 클래스는 단일 상속을 통해 충돌을 피합니다. Diamond 문제는 virtual inheritance로 해결합니다.
✅ 15. 메모리 관리
Q. new/delete 대신 스마트 포인터를 사용하는 이유는?
모범 답안:
스마트 포인터는 자원 해제를 자동으로 수행해 메모리 누수, double delete 등의 문제를 예방합니다. RAII 원칙에 따라 안전한 코드 작성을 가능하게 합니다.
심화 질문: shared_ptr의 순환 참조는 어떻게 해결하나요?
심화 답변: 한 쪽을 weak_ptr로 선언해 참조 카운트 증가를 막음으로써 서로가 서로를 가리키는 상황에서도 정상적인 소멸이 가능합니다.
심화 질문: Unity의 GC 관리 방식은?
심화 답변: Unity는 Mono 런타임을 기반으로 한 Mark & Sweep 방식 GC를 사용합니다. 반복적인 GC 호출은 프레임 드랍을 유발하므로 Object Pooling이나 Struct 사용 등으로 할당을 줄이는 것이 중요합니다.
심화 질문: 메모리 풀 직접 구현 경험이 있나요?
심화 답변: 고정 크기의 오브젝트를 미리 할당해 비트맵이나 스택으로 관리하며, 필요 시 재사용하는 방식으로 메모리 풀을 구현했습니다. new/delete 비용이 줄어들어 퍼포먼스가 향상되었습니다.
✅ 16. 멀티스레딩
Q. 멀티스레드 환경에서 주의할 점은?
모범 답안:
Race condition, deadlock, cache coherence 등을 방지해야 하며, 동기화를 위해 mutex, atomic, condition_variable 등을 적절히 사용해야 합니다.
심화 질문: std::atomic과 mutex의 차이는?
심화 답변: atomic은 간단한 연산에 대해 lock-free 방식으로 동작하여 성능이 우수합니다. mutex는 복잡한 임계 구역 보호에 적합하며 lock/unlock 비용이 존재합니다.
심화 질문: Lock-Free Queue를 구현해본 경험은?
심화 답변: Single Producer Single Consumer(SPSC) Ring Buffer를 구현해본 경험이 있습니다. CAS(Compare-And-Swap)를 기반으로 head/tail 포인터를 atomic으로 관리하며, false sharing 방지를 위해 padding도 적용했습니다.
심화 질문: Unity ECS와 Job System 연계 사용법은?
심화 답변: Unity의 ECS는 데이터 지향 구조이며 Job System과 Burst Compiler를 통해 병렬 처리를 효율적으로 수행할 수 있습니다. IJobParallelFor를 통해 대량의 컴포넌트를 병렬 처리하고, NativeArray로 안전하게 메모리를 공유합니다.
✅ 17. 네트워크
Q. TCP와 UDP의 차이는?
모범 답안:
TCP는 연결지향적이며 신뢰성이 있지만 느리고, UDP는 비연결이며 빠르지만 손실이 존재할 수 있습니다. 게임에서는 실시간성이 중요하므로 UDP를 사용하는 경우가 많습니다.
심화 질문: Nagle 알고리즘과 Delay ACK 문제는?
심화 답변: Nagle 알고리즘은 작은 패킷을 모아서 전송하여 효율을 높이지만 지연이 발생할 수 있습니다. Delay ACK는 ACK 전송을 지연시켜 성능을 개선하려 하나, Nagle과 함께 쓰이면 패킷 전송이 지연되는 문제가 생깁니다. TCP_NODELAY로 해결할 수 있습니다.
심화 질문: 클라이언트에서 패킷 순서를 보장하려면?
심화 답변: 각 패킷에 시퀀스 넘버를 부여하고, 수신 측에서 재정렬하거나 중복 체크하는 로직을 구현합니다. 보장된 순서를 필요로 할 경우 ACK/RETRY 프로토콜도 설계합니다.
심화 질문: Dead Reckoning과 Lag Compensation 기법은?
심화 답변: Dead Reckoning은 현재 위치와 속도를 기반으로 예측 이동을 수행합니다. Lag Compensation은 클라이언트 입력 시간 기준으로 서버에서 판정을 수행해 네트워크 지연을 보완합니다.
✅ 18. 게임 엔진 / 그래픽스
Q. Unity에서 오브젝트 풀링을 왜 사용하나요?
모범 답안:
Instantiate/Destroy가 자주 일어나면 GC가 발생하여 성능 저하가 발생하므로, 미리 생성한 오브젝트를 재사용하는 방식으로 퍼포먼스를 높이고 GC 부담을 줄일 수 있습니다.
심화 질문: Unity SRP에서 Batching 최적화 방식은?
심화 답변: SRP Batcher는 Material과 Shader Pass가 동일한 오브젝트들을 묶어 한 번에 렌더링합니다. 기존의 Static/Dynamic Batching보다 효율적이며, GPU 연산을 줄여줍니다.
심화 질문: GPU Instancing과 CPU Instancing의 차이는?
심화 답변: GPU Instancing은 동일한 Mesh를 GPU에서 한 번에 여러 개 렌더링하며 DrawCall을 최소화합니다. CPU Instancing은 각각의 오브젝트에 대해 개별 DrawCall이 발생해 성능이 떨어집니다.
✅ 19. 운영체제 / 컴퓨터 구조
Q. 스레드와 프로세스의 차이는?
모범 답안:
프로세스는 독립된 메모리 공간을 가지며, 스레드는 프로세스 내부에서 메모리를 공유하는 실행 단위입니다. 스레드는 경량이지만 동기화가 필요합니다.
심화 질문: Context Switch의 비용과 발생 시점은?
심화 답변: Context Switch는 현재 실행 중인 스레드/프로세스의 상태를 저장하고, 다른 것으로 교체하는 과정입니다. 레지스터, 캐시, TLB 등을 저장/복원해야 하므로 비용이 발생합니다. 인터럽트, 타임 슬라이스 만료, IO 대기 시 발생합니다.
심화 질문: 캐시 계층 구조의 접근 시간 차이는?
심화 답변:
- L1: 0.5ns (가장 빠름, 용량 작음)
- L2: 3~5ns
- L3: 10~20ns (공유 캐시)
- RAM: 100ns 이상 성능 최적화를 위해 캐시 친화적인 메모리 접근이 중요합니다.
심화 질문: False Sharing이란?
심화 답변: 서로 다른 스레드가 같은 캐시 라인에 위치한 서로 다른 데이터를 수정할 경우, 캐시 무효화가 발생하여 성능이 급격히 저하됩니다. 이를 False Sharing이라 하며, padding을 통해 해결할 수 있습니다.
'면접 준비' 카테고리의 다른 글
| [면접 준비] 게임 클라이언트 그래픽스 면접 질문 정리 (0) | 2025.08.25 |
|---|---|
| [면접 준비] 자료구조 항목 정리 (0) | 2025.08.05 |
| [면접 준비] 운영체제 항목 정리 (0) | 2025.08.05 |
| [면접 준비] 네트워크 항목 정리 (0) | 2025.08.05 |
| [면접 준비] C# 항목 정리 (0) | 2025.08.05 |