Windows NT имеет 32-битное линейное пространство памяти (здесь
"линейное" означает линейность адресов памяти, примером
нелинейного адресного пространства является сегментная организация
памяти Intel x86). Каждому приложению доступно собственное
адресное пространство размером 4 гигабайта. Обычно, верхние два
гигабайта зарезервированы для системных нужд и доступны только
процессам работающим в привилегированном режиме (privileged mode).
В Windows NT Server 4.0 Enterprise Edition существует возможность
увеличить адресное пространство доступное пользовательским
приложениям путем уменьшения максимального размера памяти,
отводимого ядру с 2Gb до 1.
Обзор менеджера памяти
Как нетрудно догадаться, менеджер памяти (memory
manager) управляет памятью в Windows NT. Физическая память разделена
на блоки - страницы (pages) размером 4K для Intel, PPC и MIPS
платформ и 8K для DEC Alpha. Страница является в некотором смысле
атомарным объектом для менеджера памяти: все его операции над
памятью сводятся к операциям над страницами.
В Windows NT страницы памяти могут быть сброшены
на диск (paged), при этом они помещаются в файл подкачки (page
file). Однако, не каждая страница может быть сброшена на диск:
в NT все системные объекты храняться в так называемых пулах (pools):
сбрасываемый пул (paged pool) хранит объекты, которые могут
быть при необходимости сброшены на диск
несбрасываемай пул (non-paged pool) хранит объекты, которые
не могут быть сброшены на диск ни при каких обстоятельствах
В несбрасываемом пуле храняться, например ядро системы
и драйвера, если в реестре в ключе
HKLM\SYSTEM\CurrentControl\SetControl\
Session\Manager\MemoryManagement параметр
DisablePagingExecutive
имеет значение 1. Пользовательские приложения используют обычно
сбрасываемый пул.
С каждым процессом ассоциирован рабочий набор (working
set) - множество страниц, находящихся в физической памяти, доступных
процессу. С ростом объемы физической памяти в системе рабочие
наборы также растут, а при уменьшении, соответственно, уменьшаются.
Если процесс в ходе выделения памяти превысил максимальный размер
рабочего набора, то его рабочий набор урезается (trim), в ходе
чего наиболее "старые" страницы сбрасываются на диск.
Выделение памяти в NT аналогично UNIX. Когда процесс
запрашивает память, то фактически, выделения памяти не происходит,
а менеджер памяти просто резервирует какое-то количество адресов
за процессом. Это множество адресов называют зарезервированной
памятью (reserved memory). При попытке процесса впервые воспользоваться
полученным адресным пространством, память выделяется процессу
и для нее резервируется место в файле подкачки. Такая память называется
выделенной (committed).
Память, которая не является выделенной или зарезервированной
называется доступной памятью (available memory).
Если процесс обращается к некоторой странице и она
не может быть найдена в рабочем наборе процесса, то возникает
исключение сбой страницы (page fault). При этом, если нужная страница
была найдена в физической памяти, то эта ситуация называется легким
сбоем страницы (soft page fault). Если же нужная страница должна
быть подгружена с диска, то ситуация называется тяжелым сбоем
страницы (hard page fault).
Файл подкачки
Файл подкачки
pagefile.sys хранит либо
сброшенные страницы, либо зарезервированное место для страниц
выделенной памяти. Это отличается от файла подкачки в Win9x, где
при выделении памяти для нее не резервируется место в файле подкачки,
и, поэтому, можно иметь файл подкачки нулевого размера.