12. 데이터 지향 설계(DOD): AoS vs SoA와 캐시 친화적 레이아웃
문제 12 — 데이터 지향 설계(DOD): AoS vs SoA와 캐시 친화적 레이아웃
게임서버 틱 루프는 수만~수십만 엔티티를 매 틱 순회한다. 이때 "데이터를 메모리에 어떻게 배치하느냐"가 캐시 효율과 처리량을 좌우한다. 다음을 설명하라.
-
AoS vs SoA: 구조체 배열(Array of Structs)과 배열들의 구조체(Struct of Arrays)의 메모리 레이아웃 차이를 그림이나 예시로 설명하라. 매 틱 "위치(position)만" 갱신하는 루프에서 둘 중 무엇이 캐시 측면에서 유리하며 왜 그런가(캐시라인 활용률, 불필요한 필드 적재)?
-
캐시라인·공간 지역성: 캐시라인(보통 64바이트)과 프리페처(prefetcher)가 순차 접근에서 어떻게 동작하는지 설명하라. 한 엔티티 구조체가 128바이트인데 그중 12바이트(위치)만 매 틱 읽는다면, AoS 순회 시 메모리 대역이 어떻게 낭비되는가?
-
데이터 지향 설계(DOD)의 사고법: "객체 중심(OOP, 엔티티마다 가상함수/포인터 추적)"과 "데이터 변환 중심(DOD, 같은 종류의 데이터를 연속 배열로 일괄 처리)"의 차이를 설명하라. 포인터 추적(pointer chasing)·가상 디스패치가 캐시/분기예측에 주는 비용은?
-
트레이드오프: SoA가 항상 답은 아니다. 임의 접근(한 엔티티의 모든 필드를 동시에 다룰 때), 삽입/삭제, 코드 복잡도 측면에서 SoA의 단점을 설명하고, 핫 필드/콜드 필드 분리(hot-cold splitting)나 부분 SoA 같은 절충안을 제시하라.
-
실무 적용: MMORPG 서버에서 AoI 갱신·이동 통합·충돌 검사 같은 대량 순회에 이 원리를 어떻게 적용할지, 그리고 "정렬·배치·프리페치"로 캐시 미스를 줄이는 구체적 방법을 정리하라.
직접 답을 작성한 뒤, 위 해설 보기에서 모범답안과 대조하세요.