> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 메모리

> GDK 메모리 관리자가 XBOX 콘솔 게임에 예측 가능한 리소스 보장을 통해 결정적이고 고성능의 물리적 메모리 액세스를 제공하는 방법입니다.

## 소개

여러 애플리케이션이 하드웨어에서 동시에 실행되어야 하는 대부분의 컴퓨팅 애플리케이션과 달리, 게임 콘솔은 장치의 리소스를 게임이 독점적으로 사용할 수 있도록 보장하려고 합니다. 대부분의 콘솔이 고사양 게이밍 PC보다 낮은 사양을 가지고 있지만, 이는 콘솔 게임이 대상 플랫폼에 명시적으로 최적화될 수 있게 해주며, 그 결과 원시 하드웨어 사양만 보고 예상할 수 있는 것보다 훨씬 뛰어난 고품질 경험을 제공할 수 있습니다.

오늘날 게이머들은 (특히 소셜 및 온라인 기능과 같이) 비용이 발생하며 이러한 기능을 지원하기 위해 리소스 보장을 일부 완화해야 하는 기능을 기대합니다. 이는 XBOX와 같은 서비스 및 플랫폼 제공자가 이러한 기능을 게임 전반에 일관된 방식으로 구현할 수 있게 해줍니다.

Microsoft Game Development Kit (GDK)는 게임 개발자에게 물리적 메모리에 대한 고성능이며 결정론적이고 예측 가능한 액세스를 제공합니다. 이전의 XBOX One ERA OS 메모리 관리자는 게임 개발자의 많은 요구를 충족했지만, 개선 방법에 대해 많은 피드백이 있었습니다. 예를 들어, 이전에는 게임 코드와 플랫폼 서비스 간의 메모리 리소스 공유가 가능한 만큼 결정론적이지 않았습니다.

우리는 가장 성공적이었던 측면을 유지하도록 유의하면서 이러한 문제를 해결하기 위해 메모리 관리자를 다시 구축했습니다.

새로운 아키텍처는 게임 개발자가 원하고 기대하는 보다 구체적이고 결정론적인 보장을 제공합니다. 이 아키텍처는 XBOX One 게임이 의존해 온 성능 최적화와 유연성을 유지합니다.

## 아키텍처 다이어그램

다음 다이어그램은 Microsoft Game Development Kit (GDK)의 메모리 아키텍처를 보여줍니다.

<img src="https://mintcdn.com/microsoft-4404708b/hRvcUkfcfa4mBzT_/images/gdk/features/console/mem_overview_arch.webp?fit=max&auto=format&n=hRvcUkfcfa4mBzT_&q=85&s=f36ec2f81bad373099d63f9e51bcb013" alt="Microsoft Game Development Kit 메모리 아키텍처 다이어그램" width="1400" height="872" data-path="images/gdk/features/console/mem_overview_arch.webp" />

## 주요 기능

* 기존 개발자의 지식과 전문성을 활용할 수 있도록 XBOX One ERA 시스템과의 상당한 유사성:
  * 초기화되지 않은 메모리로 64 KB/2 MB 페이지를 할당하는 최적화 포함
  * `XMemAlloc` API 계열
  * 64 KB 단위의 물리적 페이지 할당 및 매핑
* 게임 컴포넌트와 비게임(플랫폼) 컴포넌트 간 메모리 소비의 하드 격리
* 타이틀 파티션 공간의 모든 메모리 소비에 대한 런타임 추적
* 성능을 위해 2 MB 페이지를 사용하는 모든 Win32 힙

> \[!NOTE] `XMemAlloc` 및 `XMemFree`의 기본 구현에 대한 소스 코드는 Microsoft Game Development Kit (GDK)의 일부로 설치됩니다. \_\GXDK\gameKit\Source\amd64\heap.c\_를 참조하세요.

## 개요

### 메모리 파티션

Microsoft Game Development Kit (GDK) 메모리 아키텍처는 XBOX One ERA OS를 위해 만들어진 "세 개의 풀" 모델을 계속 사용합니다. 이 아키텍처 내에서 각 풀은 특정 메모리 사용 범주에 대한 명시적인 소유권을 갖습니다.

* **시스템 파티션(System partition):** 시스템 프로세스 및 플랫폼 할당은 물론 플랫폼 실행 파일 페이지를 담당
* **타이틀 파티션(Title partition):** 게임 프로세스와 게임의 실행 파일 페이지에 의해 발생하는 모든 메모리 소비를 담당
* **툴 파티션(Tools partition):** 확장/디버그 메모리를 소매 메모리와 분리하는 데 사용할 수 있는 선택적 메모리 풀(개발 킷에서만 사용 가능)

메모리 파티션은 내부적으로 OS 메모리 관리자의 고유한 인스턴스로 구현되며, 각 파티션은 물리적 메모리의 전용 할당량에 대한 소유권을 갖습니다. 서로 다른 파티션은 페이징 및 0 초기화 동작과 같은 자체 동작 정책을 가질 수도 있습니다. 타이틀 파티션은 게임 프로세스에 최상의 성능을 제공하도록 구성되며, 다음과 같은 동작이 조정되어 있습니다.

* 일반적으로 할당 중에 Windows 메모리 관리자는 보안 조치로 메모리 페이지를 0으로 채웁니다. 타이틀 파티션의 경우 이 기능이 비활성화되어 해당 성능을 타이틀에 되돌려줍니다.

커널 메모리 사용에 대한 자세한 내용은 [커널 메모리 사용](/build/console-features/memory/kernel_memory_usage)을 참조하세요.

### 타이틀과 시스템 메모리 할당의 분리

Microsoft Game Development Kit (GDK) 게임 OS는 메모리 파티션을 통해 시스템과 게임 메모리 사용의 격리를 보장합니다. 모든 프로세스는 시작 시점에 메모리 파티션이 할당됩니다. 모든 시스템 프로세스가 시스템 메모리 파티션 내에서 시작되므로, 이러한 프로세스는 게임에서 사용되는 타이틀 파티션에서 어떤 메모리도 할당할 수 없습니다. 반면 타이틀 프로세스는 타이틀 파티션을 사용하며 이 전용 풀에서 메모리를 확보합니다.

타이틀과 시스템 코드 간 메모리 할당의 격리를 달성하기 위해 시작 시 타이틀 프로세스에 몇 가지 사용자 지정이 적용됩니다. 여기에는 다음이 포함됩니다.

* 파일 시스템 미니 필터 드라이버가 각 파일 매핑을 감시하고 파일을 시스템 파일(예: *kernelbase.dll*) 또는 게임 파일로 분류합니다. 시스템 파일은 시스템 파티션에서 할당되도록 태그가 지정되고, 게임 파일은 타이틀 파티션에 부과됩니다.
* 시스템과 타이틀 파티션 모두에서 별도의 Win32 힙이 생성되며(타이틀 힙은 첫 사용 시 생성), 각각 시스템 코드와 타이틀 코드에서 이루어진 힙 할당을 소유합니다.
* 각 모듈의 import address table을 통해 호출되는 할당 관련 API는 로드 시점에 별도의 구현으로 리디렉션되어, 원본 DLL에 따라 시스템 또는 타이틀 파티션에서 할당을 서비스합니다.

그 결과 시스템 파티션은 OS 및 플랫폼 바이너리 로딩 비용과 발생하는 모든 영구적 또는 일시적 메모리 할당을 담당하게 됩니다.

### 타이틀에 부과되는 메모리 비용

타이틀 파티션은 여전히 다음을 담당합니다.

* 게임 프로세스에 특정한 코드 및 데이터/콘텐츠의 메모리 풋프린트.
* 게임 프로세스에 의해 로드된 모듈의 모든 수정된 데이터 섹션(즉, copy-on-write 섹션).
* 스레드 스택 공간.
* 게임 프로세스의 가상 주소를 물리 주소로 변환하는 데 필요한 페이지 테이블 엔트리.
* 시스템 API 호출에 전달되는 버퍼를 만드는 데 필요한 메모리.
* 시스템 API 호출, 비동기 작업 및 알림의 결과를 캡처하는 데 필요한 메모리.
* 기능을 사용하는 데 필요한 기타 메타데이터. 예를 들어 힙은 할당을 추적하기 위한 메타데이터가 필요합니다. 이러한 메타데이터는 힙이 수행하는 모든 할당에 대해 타이틀 파티션에 부과됩니다.

### 메모리 사용량 및 할당 호출 모니터링

Microsoft Game Development Kit (GDK) 메모리 시스템은 런타임에 메모리 사용을 모니터링하고 추적하기 위한 광범위한 지원을 제공합니다.

`XMEM_SET_ALLOCATION_HOOKS` 매크로는 `XMemAlloc` 호출을 통해 반환되는 메모리의 추적을 활성화합니다. 또한 모든 Win32 힙 할당은 구성된 추적 콜백(자세한 내용은 [XMemSetWin32HeapTrackingHooks](/reference/system/xmem/functions/xmemsetwin32heaptrackinghooks) 참조)을 통해 모니터링할 수 있어 `malloc`/`new`/`HeapAlloc`의 모든 사용을 포착할 수 있습니다.

마지막으로, `XMemGetWorkingSetStatistics` 및 [XMemVirtualQuery](/reference/system/xmem/functions/xmemvirtualquery) API를 사용하여 물리적 및 가상 메모리 사용량의 상세한 스냅샷을 제공할 수 있습니다. [XMemVirtualQuery](/reference/system/xmem/functions/xmemvirtualquery)는 `VirtualQuery`와 매우 유사하지만, `VirtualQuery`에서는 얻을 수 없는 페이지 크기 및 메모리의 소유권(시스템 또는 게임)과 같은 추가 정보를 반환합니다.

런타임 메모리 추적에 사용할 수 있는 API에 대한 자세한 내용은 [Microsoft GDK Game OS 메모리 관리자를 사용하도록 타이틀 이식하기](/build/console-features/memory/system-memory-porting)의 메모리 추적 섹션을 참조하세요.

## 파티션 크기

이번 릴리스에서 이전 릴리스와 비교했을 때의 중요한 변경 사항은 콘솔이 타이틀이 *소매 소비자* 환경에서 경험하게 될 것으로 예상되는 것과 동일한 메모리 구성을 제공하도록 구성되어 있다는 점입니다.

또한 툴 파티션에 대한 지원이 추가되었습니다. [Microsoft GDK Game OS 메모리 관리자를 사용하도록 타이틀 이식하기](/build/console-features/memory/system-memory-porting) 항목은 결정론적 메모리 회계 모델을 제공하기 위해 이루어진 변경을 설명합니다. 개발자는 이제 자신의 코드에 대해 일관된 메모리 풀을 보장받는 동시에, 플랫폼 바이너리 및 일시적 할당이 타이틀 주소 지정 가능 메모리 공간과 분리된 시스템 메모리 풀에 부과되도록 보장됩니다.

### 프로파일링 모드

프로파일링 모드는 일부 시스템 OS 리소스를 게임으로 전환하는 옵션으로, PIX와 같은 도구가 최대 용량으로 작동하는 데 필요합니다. Hub Apps, Game DVR, Microsoft Edge와 같은 일부 기능은 프로파일링 모드가 활성화되면 성능이 저하되거나 전혀 작동하지 않을 수 있습니다. 이러한 기능을 복원하려면 XBOX Manager, *xbconfig.exe*(Windows PC용), *wdconfig.exe*(콘솔용), 또는 콘솔의 Developer Home Shell로 활성화하거나 비활성화할 수 있습니다.

프로파일링 모드가 활성화되면, 더 많은 메모리가 필요한 경우 타이틀 풀에 선택적으로 추가할 수 있는 확장/디버그 메모리가 있습니다. 타이틀 공간에 메모리를 추가하려면 다음을 사용하세요.

```text theme={null}
  xbconfig ExtraTitleMemory=<value>
```

또는 XBOX Manager 또는 Developer Home Shell의 **Extra Title Memory** 설정에서 토글을 켭니다.

#### 메모리 구성

메모리 구성은 다음 표에 설명되어 있습니다.

| 콘솔 유형                |                콘솔 모드               |       타이틀 메모리 모드       |           타이틀 메모리          |                      툴 메모리 |
| :------------------- | :--------------------------------: | :--------------------: | :------------------------: | -------------------------: |
| XBOX One/Xbox One S  |                                    |                        |          5,120 MiB         |                  1,012 MiB |
| XBOX One X           |                                    | Standard<br />Advanced |  8,128 MiB<br />9,152 MiB  |  2,024 MiB<br /> 1,012 MiB |
|                      |                                    |                        |                            |                            |
| XBOX One X Devkit    |        XBOX One / XBOX One S       |                        |          5,120 MiB         |                  5,028 MiB |
| XBOX One X Devkit    |           XBOX One X test          | Standard<br />Advanced |  8,128 MiB<br />9,152 MiB  |  2,024 MiB<br /> 1,012 MiB |
| XBOX One X Devkit    |       XBOX One X Devkit \[44]      | Standard<br />Advanced |  8,128 MiB<br />9,152 MiB  | 14,168 MiB<br />13,156 MiB |
|                      |                                    |                        |                            |                            |
| XBOX Series S        |                                    | Standard<br />Advanced |  7,998 MiB<br />8,572 MiB  |                        N/A |
| XBOX Series X        |                                    | Standard<br />Advanced | 10,208 MiB<br />13,312 MiB |                        N/A |
|                      |                                    |                        |                            |                            |
| XBOX Series X Devkit | Lockhart Profiling (XBOX Series S) | Standard<br />Advanced |  7,998 MiB<br />8,572 MiB  |   6,056 MiB<br />6,048 MiB |
| XBOX Series X Devkit | Anaconda Profiling (XBOX Series X) | Standard<br />Advanced | 10,208 MiB<br />13,312 MiB |  9,614 MiB<br />15,666 MiB |
| XBOX Series X Devkit |            Scarlett 40GB           |                        |         37,156 MiB         |                            |

<Note>
  이전 표의 툴 메모리는 프로파일링 모드가 활성화된 경우에만 사용할 수 있습니다.
</Note>


## Related topics

- [콘솔 전용 GDK 기능](/ko/build/console-features/console-features-overview.md)
- [메모리 후킹](/ko/services/playfab/sdks/c/memory.md)
- [코어 간 메모리 비용](/ko/build/console-features/memory/Cross-Core-Memory-Costs.md)
- [Social Manager 메모리 및 성능](/ko/services/xbox-services/community/social-manager/concepts/live-socmgr-mem-perf.md)
- [XBOX GDK 타이틀을 위한 메모리 시스템](/ko/build/console-features/memory/index.md)
