Przejdź do głównej zawartości

Menedżer pamięci i pamięć podręczna systemu Windows: stronicowanie, łączenie stron i zapis leniwy

Na tej stronie

W tej serii sprawdzono siedem parametrów: stronicowania, łączenia identycznych stron, sterty jądra i bufora plików. W Windows 11 25H2 znaleziono kod odczytu każdego z nich. Praktyczna korzyść zależy od parametru i warunków pracy.

DisablePageCombining wyłącza tło łączenie stron: menedżer pamięci przestaje wykonywać tę pracę, ale zużycie RAM może wzrosnąć. DisablePagingExecutive utrzymuje wyładowywalny kod sterowników w pamięci fizycznej; korzyść jest zwykle niewielka. Pozostałe parametry mają zastosowanie tylko do wybranych zadań jądra lub nośników albo mają już odpowiednie wartości domyślne w 25H2.

Dla każdej wartości sprawdzano:

  1. dokładną ścieżkę w rejestrze i typ;
  2. wartość domyślną ustawioną przez kod Windows 11 25H2;
  3. powiązane wartości tego samego podsystemu;
  4. kod odczytu w systemie i moment jego wykonania;
  5. ograniczenia zakresu, konwersję wartości i jednostki miary;
  6. bezpośredni efekt i granice stosowalności.

Oprócz kodu odczytu sprawdzaliśmy, gdzie parametr jest stosowany, jakie skutki ma jego zmiana i w jakich scenariuszach może być przydatny. Samo istnienie parametru nie wystarcza do rekomendacji.

  • Windows 11 25H2 x64, build 26200.9168.
  • Parametry jądra porównano z główną tabelą konfiguracji ntoskrnl.exe i kodem ich zastosowania w Memory Manager i Cache Manager.
  • Odwołania w czasie pracy sprawdzano śledzeniem rejestru w systemie. Odczyty w fazie 0 i na początku fazy 1 mogą być nieobecne w zwykłym śladzie rozruchu: sterownik śledzenia zaczyna zapis później.
  • Dla procesów użytkownika osobno sprawdzano odczyt wartości w ntdll.dll. Dla HeapDeCommitFreeBlockThreshold w 25H2 znaleziono odczyt w jądrze, ale sterty procesów użytkownika nie używają tego parametru.
  • Analiza statyczna komponentów systemowych nie zastępuje powtórzenia na fizycznym PC, innym buildzie lub innym typie nośnika.
Registry path Value Type Default Windows 11 25H2 Zastosowanie
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management DisablePagingExecutive REG_DWORD 0 Stronicowanie wyładowywalnego kodu sterowników systemowych
ta sama ścieżka DisablePageCombining REG_DWORD 0 Tło łączenie identycznych stron fizycznych
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager HeapDeCommitFreeBlockThreshold REG_DWORD 0x1000 (4 KB) dla kernel heap Próg decommit wolnych bloków kernel-mode heap
ta sama ścieżka ModifiedWriteMaximum REG_DWORD 1 jednostka = 1 MB Górny limit modified page writer po clamp
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management EnableAsyncLazywrite REG_DWORD 2 Asynchroniczny tryb Cache Manager
ta sama ścieżka CacheUnmapBehindLengthInMB REG_DWORD 8 MB Okno unmap za kolejnym odczytem
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Kernel SplitLargeCaches REG_DWORD 0 Reprezentacja cache topology między processor groups

Przy 0 menedżer pamięci Windows może wyładowywać dopuszczające to sekcje kodu systemowego i sterowników do magazynu zapasowego. Przy 1 wyładowywalny kod sterowników systemowych jest utrzymywany w pamięci fizycznej.

Kod odczytu znaleziono w ntoskrnl.exe na wczesnym etapie inicjalizacji jądra. Wartość jest używana w MmResetDriverPaging, MmPageEntireDriver i przy ładowaniu obrazów systemowych. Jest stosowana wcześniej, niż zaczyna się zwykłe śledzenie rejestru w trybie użytkownika. Do zastosowania nowego stanu wymagane jest ponowne uruchomienie.

  • 0: standardowy stan Windows, stronicowanie dozwolone.
  • 1: wyładowywalne sekcje sterowników systemowych są utrzymywane w RAM.
  • Ustawienie zużywa RAM, aby skrócić późniejsze ładowanie kodu systemowego z powrotem do pamięci; sam dysk nie działa szybciej.

Ustawienie zapobiega późniejszemu wyładowaniu i ładowaniu tych sekcji sterowników. Nie wyłącza osobnego stale sprawdzającego wątku CPU. Na nowoczesnym systemie z wystarczającą ilością RAM korzyść jest zwykle bardzo mała: kod i bez ustawienia może długo pozostawać w pamięci. Przy niedoborze RAM jego wymuszone utrzymywanie pogłębia deficyt pamięci.

Odczyt parametru i kierunek efektu systemowego potwierdzono kodem ntoskrnl.exe.

Przy 0 menedżer pamięci uruchamia zadanie w tle, które wyszukuje i łączy identyczne strony fizyczne. Przy 1 to zadanie nie wykonuje łączenia.

W ntoskrnl.exe znaleziono kod tła łączenia stron z tagiem puli MmCb, co potwierdza istnienie mechanizmu.

  • 0: łączenie stron dozwolone, standardowy stan Windows.
  • 1: łączenie wyłączone.
  • Wyłączenie zmniejsza pracę menedżera pamięci w tle, ale może zwiększyć zużycie RAM.

Wyłączenie jest przydatne, jeśli łączenie stron tworzy zauważalne obciążenie w tle, a system ma wolny RAM. Zwykle to zadanie jest mało aktywne, więc efekt jest bardzo niewielki. Przy ograniczonej ilości pamięci oszczędność RAM z łączenia jest bardziej przydatna niż zaoszczędzony czas procesora.

Kod odczytu i zadania w tle potwierdzono w ntoskrnl.exe. Microsoft opisuje łączenie stron i kompromis między pracą procesora a oszczędnością RAM.

Wartość określa próg zwalniania przydzielonej pamięci (decommit) dla wolnego bloku sterty jądra. Przy większym progu takie operacje dla dużych wolnych bloków występują rzadziej.

W Windows 11 25H2 kod odczytu znajduje się w ntoskrnl.exe, a zastosowanie parametru jest związane z funkcją jądra RtlCreateHeap. W ntdll.dll nie znaleziono odpowiedniego kodu odczytu dla stert zwykłych procesów.

  • Wartość domyślna w kodzie dla sterty jądra: 0x1000 (4 KB).
  • 0x40000 (256 KB) jest dopuszczalnym progiem dla sterty jądra.
  • Historyczne dokumenty Microsoft opisywały scenariusz user-mode o tej samej nazwie ze starych wersji Windows, dlatego nie można go automatycznie przenosić na Windows 11 25H2.

Dla zwykłych aplikacji korzyści praktycznie nie ma: ich sterty nie używają tej wartości. Parametr może zmieniać częstotliwość zwalniania pamięci tylko w stercie jądra. Bez zmierzonego problemu właśnie z nią oczekiwany efekt jest bardzo mały.

Odczyt w trybie jądra potwierdzono w ntoskrnl.exe. Efekt dla procesów użytkownika w 25H2 nie został potwierdzony.

Parametr określa górny limit dla mechanizmu zapisu zmienionych stron (modified page writer). W kodzie używane są jednostki po 256 stron, czyli jedna jednostka równa się 1 MB.

Normalizacja w Windows 11 25H2:

  • 0 jest przekształcane w 1 jednostkę, czyli 1 MB;
  • wartości większe niż 0x40 są ograniczane do 0x40;
  • maksymalny efektywny limit wynosi 64 MB, czyli 16 384 strony.

Mechanizm zaczyna aktywne zapisywanie w przybliżeniu po osiągnięciu jednej czwartej ustalonego limitu. Zwiększenie limitu zmienia moment rozpoczęcia zapisu i ilość nagromadzonych zmienionych stron. Szybkość samego dysku od tego nie rośnie.

Przy większym limicie do rozpoczęcia aktywnego zapisu gromadzi się więcej zmienionych stron. Zapis może uruchamiać się rzadziej, ale ilość jeszcze niezapisanych danych i rozmiar następnej porcji zapisu rosną. Jeśli nie ma konkretnego problemu z zapisem, pozostaw wartość domyślną. Efektywny limit jest ograniczony do 64 MB.

Kod odczytu, jednostki miary i ograniczenie zakresu potwierdzono w ntoskrnl.exe. Parametr o tej samej nazwie ze starych dokumentów Microsoft o BitLocker dotyczy innego podsystemu; te dokumenty nie są tu używane jako źródło.

EnableAsyncLazywrite steruje asynchronicznym odroczonym zapisem Cache Manager. W kodzie 25H2 ustawiono wartość domyślną 2: ten tryb jest już włączony.

Powiązane wartości tego samego podsystemu:

Value Default 25H2 Rola
EnableAsyncLazywrite 2 Ogólny async lazy-write mode
EnableAsyncLazywriteMulti 2 Sąsiedni multi-volume tryb
EnablePerVolumeLazyWriter 2 Per-volume lazy writer

0 wyłącza asynchroniczny odroczony zapis. Dla 1 wymagany jest tryb osobnego programu obsługi odroczonego zapisu na każdym woluminie. 2 włącza tryb asynchroniczny bez tego wymogu. Cache Manager odczytuje wartości ponownie podczas pracy z konfiguracją woluminów.

Jawne ustawienie 2 powtarza standardową konfigurację Windows 11 25H2 i niczego dodatkowo nie poprawia. Ustawienie nadaje się przede wszystkim do diagnostyki: wartość 0 pozwala wyłączyć mechanizm działający domyślnie.

Odczyt zaobserwowano w śledzeniu systemowym i potwierdzono w ntoskrnl.exe. Wartość domyślna 2 została potwierdzona kodem i niezależnym opisem parametrów rejestru sporządzonym na podstawie wyników inżynierii odwrotnej.

Parametr określa odległość w megabajtach, po której Cache Manager zwalnia zbuforowane widoki pozostawione za bieżącą pozycją odczytu sekwencyjnego.

Kod odczytu i zastosowania parametru znajduje się w ntoskrnl.exe i jest wywoływany przy mapowaniu i odczycie bufora. Parametr dotyczy sekwencyjnego odczytu dużych plików; nie wyłącza całego bufora plików.

  • 0 lub wartość większa niż 128 jest zastępowana przez kod wartością 8.
  • Zakres roboczy: 1..128 MB.
  • Domyślna wartość w kodzie: 8 MB.
  • Jednostki Registry value to właśnie MB, a nie bajty.

Parametr ma sens tylko dla specjalistycznych zadań sekwencyjnego odczytu dużych plików. Przy większym oknie mapowanie bufora za bieżącą pozycją jest utrzymywane dłużej, przy mniejszym jest zwalniane wcześniej. Do zwykłej pracy odpowiednia jest standardowa wartość 8 MB; korzyść z ręcznego ustawienia jest zwykle mała.

Kod odczytu, zastosowania i ograniczenia zakresu potwierdzono w ntoskrnl.exe. Nie znaleziono współczesnej publicznej dokumentacji Microsoft dla tego wewnętrznego parametru.

Przy 0 API opisu topologii bufora zwraca pojedynczy wpis dla odpowiedniej struktury obejmującej kilka grup procesorów. Przy 1 wpisy są rozdzielane według grup procesorów.

Kod odczytu znajduje się w ntoskrnl.exe. Parametr jest używany przy przetwarzaniu relacji RelationCache w KeQueryLogicalProcessorRelationship.

Zmienia się tylko opis topologii zwracany przez API systemowe. Przydzielone fizyczne bloki pamięci nie są rozdzielane, a prawdopodobieństwo niedoboru ciągłego bloku samo w sobie się nie zmniejsza.

  • 0: wartość domyślna.
  • 1: rozdzielać wpisy topologii według grup procesorów.
  • Praktyczny efekt jest możliwy przede wszystkim w systemach z kilkoma grupami procesorów, zwykle przy więcej niż 64 procesorach logicznych.
  • W zwykłym systemie z jedną grupą efekt nie występuje.

Parametr jest potrzebny tylko programom, które odpytują topologię bufora na maszynie z kilkoma grupami procesorów. Nie zmienia pracy bufora ani przydzielania pamięci. Dla zwykłego komputera stacjonarnego korzyści nie ma.

Kod odczytu i zastosowania potwierdzono w ntoskrnl.exe. Wartość i przeznaczenie zweryfikowano z publicznym opisem inżynierii odwrotnej KiSplitLargeCaches.

Parametr Ocena praktyczna
DisablePagingExecutive Zwykle daje bardzo małą korzyść, utrzymując więcej kodu w RAM
DisablePageCombining Przydatny przy potwierdzonym obciążeniu tła łączenia stron i dużym zapasie RAM
HeapDeCommitFreeBlockThreshold Działa tylko w jądrze; dla zwykłych aplikacji nie ma praktycznej korzyści
ModifiedWriteMaximum Zmienia warunki zapisu zmienionych stron; bez wykrytego problemu pozostaw standardową wartość
EnableAsyncLazywrite Standardowa wartość 2 już włącza mechanizm; ponowny zapis niczego nie poprawia
CacheUnmapBehindLengthInMB Ustawienie odczytu sekwencyjnego; standardowe 8 MB są odpowiednie do zwykłej pracy
SplitLargeCaches Zmienia opis topologii dla kilku grup procesorów; w zwykłym systemie efektu nie ma

Potwierdzono podane wyżej ścieżki, typy, wartości domyślne, kod i moment odczytu parametrów, a także ograniczenia zakresów. Wyniki dotyczą Windows 11 25H2 build 26200.9168. Zachowanie może się różnić przy innej aktualizacji Windows, ilości RAM, typie nośnika lub topologii CPU.

Jak powtórzyć dynamiczną część obserwacji — zobacz Jak sprawdzić samodzielnie.

Aby przywrócić, ustaw standardowe wartości parametrów lub usuń opcjonalne wpisy. Część wartości jest stosowana przy następnym rozruchu Windows.

Badanie i użyte w nim narzędzia należą do dewelopera BoosterX, dlatego deweloper ma bezpośredni interes w wynikach. Metodyka i granice stosowalności są opisane w tym artykule; wnioski można sprawdzić na podstawie otwartych danych i wymienionych poniżej publicznych źródeł.

Twierdzenia o kodzie zweryfikowano analizą statyczną komponentów systemowych Windows 11 25H2. Zdekompilowany kod, offsety, surowe ślady i materiały wewnętrzne nie są publikowane.

Publiczne źródła sprawdzono: 2026-09-02.

  • 2026-09-20: dodano zastrzeżenie o konflikcie interesów i link do samodzielnego sprawdzenia dynamicznych obserwacji w metodyce.
  • 2026-09-02: pierwsza publikacja; potwierdzono ścieżki, defaults, clamps i kod odczytu parametrów, dodano granice praktycznej przydatności.