Обзор памяти
Windows NT имеет 32-битное линейное пространство памяти (здесь "линейное" означает линейность адресов памяти, примером нелинейного адресного пространства является сегментная организация памяти Intel x86). Каждому приложению доступно собственное адресное пространство размером 4 гигабайта. Обычно, верхние два гигабайта зарезервированы для системных нужд и доступны только процессам работающим в привилегированном режиме (privileged mode). В Windows NT Server 4.0 Enterprise Edition существует возможность увеличить адресное пространство доступное пользовательским приложениям путем уменьшения максимального размера памяти, отводимого ядру с 2Gb до 1. Для более полной информации об этом рекомендую почитать статью Q171793 в Knowledge Base.
Обзор менеджера памяти
Как нетрудно догадаться, менеджер памяти (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\CurrentControlSet\Control
SessionManagerMemoryManagement параметр DisablePagingExecutive имеет значение 1. Пользовательские приложения используют обычно сбрасываемый пул.
С каждым процессом ассоциирован рабочий набор (working set) - множество страниц, находящихся в физической памяти, доступных процессу. С ростом объемы физической памяти в системе рабочие наборы также растут, а при уменьшении, соответственно, уменьшаются. Если процесс в ходе выделения памяти превысил максимальный размер рабочего набора, то его рабочий набор урезается (trim), в ходе чего наиболее "старые" страницы сбрасываются на диск.
Выделение памяти в NT аналогично UNIX. Когда процесс запрашивает память, то фактически, выделения памяти не происходит, а менеджер памяти просто резервирует какое-то количество адресов за процессом. Это множество адресов называют зарезервированной памятью (reserved memory). При попытке процесса впервые воспользоваться полученным адресным пространством, память выделяется процессу и для нее резервируется место в файле подкачки. Такая память называется выделенной (committed).
Память, которая не является выделенной или зарезервированной называется доступной памятью (available memory).
Если процесс обращается к некоторой странице и она не может быть найдена в рабочем наборе процесса, то возникает исключение сбой страницы (page fault). При этом, если нужная страница была найдена в физической памяти, то эта ситуация называется легким сбоем страницы (soft page fault). Если же нужная страница должна быть подгружена с диска, то ситуация называется тяжелым сбоем страницы (hard page fault).
Файл подкачки
Файл подкачки pagefile.sys хранит либо сброшенные страницы, либо зарезервированное место для страниц выделенной памяти. Это отличается от файла подкачки в Win9x, где при выделении памяти для нее не резервируется место в файле подкачки, и, поэтому, можно иметь файл подкачки нулевого размера.