콘텐츠로 이동

Windows 메모리 관리자와 시스템 cache: paging, page combining 및 lazy write

목차

이 시리즈에서는 페이징, 동일 페이지 병합, 커널 힙, 파일 캐시의 일곱 가지 매개변수를 검증했습니다. Windows 11 25H2에서 각 매개변수의 읽기 코드를 찾았습니다. 실질적인 이점은 매개변수와 작동 조건에 따라 다릅니다.

DisablePageCombining는 백그라운드 페이지 병합을 비활성화합니다. 메모리 관리자가 이 작업을 수행하지 않게 되지만 RAM 사용량이 늘어날 수 있습니다. DisablePagingExecutive는 드라이버의 페이징 가능 코드를 물리 메모리에 유지합니다. 이점은 대개 미미합니다. 나머지 매개변수는 커널이나 저장 장치의 특정 작업에만 적용되거나, 25H2에서 이미 적절한 기본값을 가지고 있습니다.

각 값에 대해 다음을 검증했습니다.

  1. Registry의 정확한 경로와 타입;
  2. Windows 11 25H2 코드가 지정한 기본값;
  3. 같은 하위 시스템의 관련 값;
  4. 시스템 읽기 코드와 그 실행 시점;
  5. 범위 제한, 값 변환 및 측정 단위;
  6. 직접적인 효과와 적용 범위.

읽기 코드 외에도 매개변수가 어디에 적용되는지, 변경 시 어떤 결과가 발생하는지, 어떤 시나리오에서 유용할 수 있는지 확인했습니다. 매개변수가 존재한다는 것만으로는 권장 사항의 근거로 충분하지 않습니다.

  • Windows 11 25H2 x64, build 26200.9168.
  • 커널 매개변수를 ntoskrnl.exe의 기본 구성 표와 Memory Manager 및 Cache Manager에서의 적용 코드와 대조했습니다.
  • 런타임 접근은 시스템 Registry 추적으로 검증했습니다. 페이즈 0과 페이즈 1 초기의 읽기는 일반적인 부팅 추적에서 누락될 수 있습니다. 추적 드라이버가 기록을 나중에 시작하기 때문입니다.
  • 사용자 프로세스의 경우 ntdll.dll에서 값 읽기를 별도로 검증했습니다. HeapDeCommitFreeBlockThreshold의 경우 25H2 커널에서 읽기가 발견되었지만 사용자 프로세스의 힙은 이 매개변수를 사용하지 않습니다.
  • 시스템 구성 요소의 정적 분석은 물리적 PC, 다른 build 또는 다른 유형의 저장 장치에서의 반복을 대체하지 않습니다.
Registry path Value Type Default Windows 11 25H2 적용
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management DisablePagingExecutive REG_DWORD 0 시스템 드라이버의 페이징 가능 코드 페이징
동일 경로 DisablePageCombining REG_DWORD 0 동일한 물리 페이지의 백그라운드 병합
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager HeapDeCommitFreeBlockThreshold REG_DWORD 0x1000 (4 KB) for kernel heap kernel-mode heap의 빈 블록 decommit 임계값
동일 경로 ModifiedWriteMaximum REG_DWORD 1 단위 = 1 MB clamp 이후 modified page writer의 상한
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management EnableAsyncLazywrite REG_DWORD 2 Cache Manager의 비동기 모드
동일 경로 CacheUnmapBehindLengthInMB REG_DWORD 8 MB 순차 읽기 뒤쪽의 unmap 윈도우
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Kernel SplitLargeCaches REG_DWORD 0 processor groups 간 cache topology 표현

0인 경우 Windows 메모리 관리자는 허용되는 시스템 코드 및 드라이버 섹션을 백업 저장소로 페이징할 수 있습니다. 1인 경우 페이징 가능한 시스템 드라이버 코드가 물리 메모리에 유지됩니다.

읽기 코드는 커널 초기화 초기 단계의 ntoskrnl.exe에서 발견되었습니다. 이 값은 MmResetDriverPaging, MmPageEntireDriver 및 시스템 이미지 로드 시 사용됩니다. 일반적인 사용자 Registry 추적이 시작되기 전에 적용됩니다. 새 상태를 적용하려면 재시작이 필요합니다.

  • 0: Windows의 기본 상태이며 페이징이 허용됩니다.
  • 1: 페이징 가능한 시스템 드라이버 섹션이 RAM에 유지됩니다.
  • 이 설정은 시스템 코드를 다시 메모리로 로드하는 후속 작업을 줄이기 위해 RAM을 소비합니다. 디스크 자체가 빨라지는 것은 아닙니다.

이 설정은 해당 드라이버 섹션의 후속 페이징 및 로드를 방지합니다. 별도의 상시 CPU 검사 스레드를 비활성화하지는 않습니다. RAM이 충분한 현대 시스템에서는 이점이 대개 매우 미미합니다. 설정 없이도 코드가 오랫동안 메모리에 남을 수 있습니다. RAM이 부족한 경우 강제로 유지하면 메모리 부족이 심화됩니다.

매개변수 읽기와 시스템 효과의 방향은 ntoskrnl.exe 코드로 확인되었습니다.

0인 경우 메모리 관리자가 동일한 물리 페이지를 찾아 병합하는 백그라운드 작업을 시작합니다. 1인 경우 이 작업은 병합을 수행하지 않습니다.

ntoskrnl.exe에서 풀 태그 MmCb를 사용하는 백그라운드 페이지 병합 코드가 발견되었으며, 이는 메커니즘의 존재를 확인해 줍니다.

  • 0: 페이지 병합이 허용되며, Windows의 기본 상태입니다.
  • 1: 병합이 비활성화됩니다.
  • 비활성화하면 메모리 관리자의 백그라운드 작업이 줄어들지만 RAM 사용량이 늘어날 수 있습니다.

페이지 병합이 눈에 띄는 백그라운드 부하를 만들고 시스템에 여유 RAM이 있는 경우 비활성화가 유용합니다. 일반적으로 이 작업은 거의 활동하지 않으므로 효과는 매우 작습니다. 메모리 용량이 제한적인 경우 병합으로 절약되는 RAM이 절약되는 CPU 시간보다 더 유용합니다.

읽기 코드와 백그라운드 작업은 ntoskrnl.exe에서 확인되었습니다. Microsoft는 페이지 병합과 CPU 작업 대 RAM 절약 간의 트레이드오프를 설명합니다.

이 값은 커널 힙의 빈 블록에 대한 할당된 메모리 해제(decommit) 임계값을 지정합니다. 임계값이 클수록 큰 빈 블록에 대해 이러한 작업이 덜 자주 발생합니다.

Windows 11 25H2에서 읽기 코드는 ntoskrnl.exe에 있으며, 매개변수 적용은 커널 함수 RtlCreateHeap와 관련됩니다. ntdll.dll에서는 일반 프로세스의 힙에 대한 해당 읽기 코드가 발견되지 않았습니다.

  • 커널 힙 코드의 기본값: 0x1000 (4 KB).
  • 0x40000 (256 KB)는 커널 힙에 허용되는 임계값입니다.
  • Microsoft의 과거 문서는 구버전 Windows의 동명 user-mode 시나리오를 설명했으므로 이를 Windows 11 25H2에 자동으로 적용할 수 없습니다.

일반 애플리케이션에는 실질적인 이점이 거의 없습니다. 해당 힙은 이 값을 사용하지 않습니다. 이 매개변수는 커널 힙에서만 메모리 해제 빈도를 변경할 수 있습니다. 바로 그것에 대해 측정된 문제가 없다면 기대 효과는 매우 작습니다.

커널 모드 읽기는 ntoskrnl.exe에서 확인되었습니다. 25H2에서 사용자 프로세스에 대한 효과는 확인되지 않았습니다.

이 매개변수는 변경된 페이지 기록 메커니즘(modified page writer)의 상한을 지정합니다. 코드에서는 256페이지 단위를 사용하므로 한 단위는 1 MB입니다.

Windows 11 25H2의 정규화:

  • 0는 1 단위, 즉 1 MB로 변환됩니다.
  • 0x40보다 큰 값은 0x40로 제한됩니다.
  • 최대 유효 상한은 64 MB, 즉 16 384페이지입니다.

이 메커니즘은 지정된 한도의 약 4분의 1에 도달할 때 활성 기록을 시작합니다. 한도를 늘리면 기록 시작 시점과 누적된 변경 페이지 양이 달라집니다. 디스크 자체의 속도는 이로 인해 증가하지 않습니다.

한도가 클수록 활성 기록이 시작되기 전에 더 많은 변경 페이지가 누적됩니다. 기록이 덜 자주 시작될 수 있지만 아직 저장되지 않은 데이터의 양과 다음 기록 묶음의 크기가 커집니다. 기록에 특정한 문제가 없다면 기본값을 그대로 두십시오. 유효 상한은 64 MB로 제한됩니다.

읽기 코드, 측정 단위 및 범위 제한은 ntoskrnl.exe에서 확인되었습니다. BitLocker에 관한 Microsoft의 오래된 문서에 나오는 동명 매개변수는 다른 하위 시스템에 속합니다. 이 문서들은 여기에서 출처로 사용되지 않습니다.

EnableAsyncLazywrite는 Cache Manager의 비동기 지연 쓰기를 제어합니다. 25H2 코드에는 기본값 2가 지정되어 있습니다. 이 모드는 이미 활성화되어 있습니다.

같은 하위 시스템의 관련 값:

Value Default 25H2 역할
EnableAsyncLazywrite 2 일반 async lazy-write mode
EnableAsyncLazywriteMulti 2 인접 multi-volume 모드
EnablePerVolumeLazyWriter 2 Per-volume lazy writer

0는 비동기 지연 쓰기를 비활성화합니다. 1에는 각 볼륨마다 별도의 지연 쓰기 처리기 모드가 필요합니다. 2는 이 요구 사항 없이 비동기 모드를 활성화합니다. Cache Manager는 볼륨 구성 작업 시 값을 다시 읽습니다.

2를 명시적으로 기록하는 것은 Windows 11 25H2의 기본 구성을 반복할 뿐 추가로 개선하는 것은 없습니다. 이 설정은 무엇보다 진단에 적합합니다. 0 값은 기본으로 작동하는 메커니즘을 비활성화할 수 있게 해 줍니다.

읽기는 시스템 추적에서 관찰되었고 ntoskrnl.exe에서 확인되었습니다. 기본값 2는 코드와 리버스 엔지니어링 결과를 바탕으로 작성된 독립적인 Registry 매개변수 설명으로 확인되었습니다.

이 매개변수는 Cache Manager가 순차 읽기의 현재 위치 뒤에 남은 캐시된 뷰를 해제하는 거리를 메가바이트 단위로 지정합니다.

매개변수의 읽기 및 적용 코드는 ntoskrnl.exe에 있으며 캐시 매핑 및 읽기 시 호출됩니다. 이 매개변수는 대용량 파일의 순차 읽기에 관한 것이며 전체 파일 캐시를 비활성화하지는 않습니다.

  • 0 또는 128보다 큰 값은 코드에 의해 8로 대체됩니다.
  • 작동 범위: 1..128 MB.
  • 코드 default: 8 MB.
  • Registry value의 단위는 바이트가 아니라 MB입니다.

이 매개변수는 대용량 파일의 순차 읽기라는 특수 작업에만 의미가 있습니다. 윈도우가 클수록 현재 위치 뒤의 캐시 매핑이 더 오래 유지되고, 작을수록 더 일찍 해제됩니다. 일반적인 작업에는 기본값 8 MB가 적합하며, 수동 설정의 이점은 대개 미미합니다.

읽기, 적용 및 범위 제한 코드는 ntoskrnl.exe에서 확인되었습니다. 이 내부 매개변수에 대한 현대적인 Microsoft 공개 문서는 발견되지 않았습니다.

0인 경우 캐시 토폴로지 설명 API는 여러 processor group을 포괄하는 해당 구조에 대해 단일 항목을 반환합니다. 1인 경우 항목이 processor group별로 분리됩니다.

읽기 코드는 ntoskrnl.exe에 있습니다. 이 매개변수는 KeQueryLogicalProcessorRelationship에서 RelationCache 관계를 처리할 때 사용됩니다.

시스템 API가 반환하는 토폴로지 설명만 변경됩니다. 할당된 물리 메모리 블록은 분리되지 않으며, 연속 블록 부족 가능성 자체가 줄어들지는 않습니다.

  • 0: 기본값.
  • 1: 토폴로지 항목을 processor group별로 분리합니다.
  • 실질적인 효과는 주로 여러 processor group이 있는 시스템, 일반적으로 64개 초과 논리 프로세서에서 가능합니다.
  • 일반적인 단일 그룹 시스템에서는 효과가 없습니다.

이 매개변수는 여러 processor group이 있는 머신에서 캐시 토폴로지를 요청하는 프로그램에만 필요합니다. 캐시 작동과 메모리 할당을 변경하지는 않습니다. 일반 데스크톱 컴퓨터에는 이점이 없습니다.

읽기 및 적용 코드는 ntoskrnl.exe에서 확인되었습니다. 값과 용도는 KiSplitLargeCaches의 공개 리버스 엔지니어링 설명과 대조했습니다.

매개변수 실질적 평가
DisablePagingExecutive 더 많은 코드를 RAM에 유지하면서 대개 매우 작은 이점을 제공
DisablePageCombining 백그라운드 페이지 병합 부하가 확인되고 RAM 여유가 클 때 유용
HeapDeCommitFreeBlockThreshold 커널에서만 작동하며 일반 애플리케이션에는 실질적 이점이 없음
ModifiedWriteMaximum 변경된 페이지 기록 조건을 변경하며, 발견된 문제가 없으면 기본값을 그대로 두십시오
EnableAsyncLazywrite 기본값 2가 이미 메커니즘을 활성화하며, 다시 기록해도 개선되지 않음
CacheUnmapBehindLengthInMB 순차 읽기 설정이며, 기본값 8 MB가 일반 작업에 적합
SplitLargeCaches 여러 processor group에 대한 토폴로지 설명을 변경하며, 일반 시스템에서는 효과가 없음

위에 명시된 경로, 타입, 기본값, 매개변수의 읽기 코드와 시점, 그리고 범위 제한이 확인되었습니다. 결과는 Windows 11 25H2 build 26200.9168에 해당합니다. 다른 Windows 업데이트, RAM 용량, 저장 장치 유형 또는 CPU 토폴로지에서는 동작이 다를 수 있습니다.

관찰의 동적 부분을 재현하는 방법은 직접 확인하는 방법을 참조하십시오.

되돌리려면 매개변수의 기본값을 복원하거나 선택적 항목을 삭제하십시오. 일부 값은 다음 Windows 부팅 시 적용됩니다.

연구와 연구에 사용된 도구는 BoosterX 개발자에게 속하므로 개발자는 결과에 직접적인 이해관계가 있습니다. 방법론과 적용 범위는 이 문서에 설명되어 있으며, 결론은 공개 데이터와 아래 나열된 공개 출처를 통해 검증할 수 있습니다.

코드에 관한 주장은 Windows 11 25H2 시스템 구성 요소의 정적 분석으로 검증되었습니다. 디컴파일된 코드, 오프셋, 원본 추적 및 내부 자료는 공개되지 않습니다.

공개 출처 확인: 2026-09-02.

  • 2026-09-20: 이해 상충에 관한 면책 조항과 방법론에서 동적 관찰을 직접 검증하는 링크를 추가했습니다.
  • 2026-09-02: 최초 게시, 경로, defaults, clamps 및 매개변수 읽기 코드를 확인하고 실질적 유용성의 경계를 추가했습니다.