- Устройство Windows. Работа с памятью
- Виртуальная и физическая память
- Страницы памяти
- Функции диспетчера памяти
- Состояние страниц и выделение памяти
- Диспетчер задач и память
- Process Explorer и память
- Создание зарезервированной и подтвержденной памяти
- Нагрузка подтверждения памяти и предел подтверждения
- Общая память и отображенные файлы
- Защита памяти
- Предотвращение выполнения данных
- Копирование при записи
- Address Windowing Extensions
Устройство Windows. Работа с памятью
Виртуальная и физическая память
Всем процессам в операционной системе предоставляется виртуальная память. Все данные, с которыми процессы непосредственно работают, хранятся именно в ней.
Название «виртуальная» произошло из-за того что процессу неизвестно реальное (физическое) расположение памяти – она может находиться как в оперативной памяти, так и на диске. Операционная система предоставляет процессу виртуальное адресное пространство определенного размера и процесс может работать с ячейками памяти по любым виртуальным адресам этого пространства, не «задумываясь» о том, где реально хранятся данные.
Размер виртуальной памяти теоретически ограничивается разрядностью операционной системы. На практике ограничения ниже теоретического предела. Например, для 32-разрядных систем теоретический максимум составляет 4 ГБ. Однако для процессов доступна только половина – 2 ГБ, другая половина отдается системным компонентам. В 64-разрядных системах теоретический предел равен 16 ЭБ. При этом процессам выделяется 128 ТБ, ещё столько же отдается системе, остальное адресное пространство в нынешних версиях Windows не используется.
Максимальный поддерживаемый раздел физической памяти составляет 24 ТБ.
Страницы памяти
Вся память разбивается на части и эти части называются страницами (page). Преобразование виртуальной памяти в физическую происходит на уровне страниц. Страницы бывают:
- малые — 4 КБ;
- большие — 2 МБ.
Главным преимуществом больших страниц является скорость преобразования адресов при обращениях к данным. Так как число больших страниц меньше, то таблица страниц состоит из меньшего числа элементов, что увеличивает скорость.
А недостаток больших страниц — это то что физическая память каждой большой страницы должна занимать значительное количество физически смежных малых страниц. Свободная физическая память фрагментируется в процессе работы системы. Это не создает проблем для выделения памяти малыми страницами, но попытка выделения большой страницы может завершиться неудачей.
Еще одно отличие, это то, что большие страницы нельзя выгрузить на диск, так как файл подкачки (swap) не поддерживает большие страницы.
Существуют также огромные страницы (huge) — 1 ГБ. В Windows 10 большие страницы отображаются в огромные, если нужно выделить сразу блог памяти свыше 1 ГБ. Например, выделение блока размером 1040 Мбайт приведет к использованию одной огромной страницы (1024 МБ) и 8 больших (по 2 МБ).
Большие страницы имеют еще один недостаток. В одной странице памяти может быть записан и код и данные. Обычно код доступен только на чтение, а данные на чтение и запись. А так как права назначаются на страницу целиком, то код тоже станет доступен не запись.
Функции диспетчера памяти
- Отображение виртуальной памяти в физическую.
- Запись виртуальных страниц на диск при нехватке памяти, а также возврат этих страниц при необходимости (swap).
- Выделение и освобождение виртуальной памяти.
- Совместное использование памяти между процессами.
- Отображение файлов в память. Прочитанный файл с диска следующий раз читается из оперативной памяти (cache).
- Получение информации о диапазоне виртуальных страниц.
- Изменение защиты виртуальных страниц.
- Блокировка виртуальных страниц.
Диспетчер памяти является частью исполняющей среды Windows (ntoskrnl.exe).
Как вы уже должны понимать процесс не работает с физической памятью напрямую, он может работать только с виртуальной. Процесс может работать либо со своей памятью, либо (при наличии необходимых разрешений) с памятью другого процесса. Например, если процесс создает дочерний процесс, по умолчанию ему предоставляется право работать с виртуальной памятью дочернего процесса. Это означает, что родитель может производить операции чтения и записи в памяти дочерних процессов.
Состояние страниц и выделение памяти
Страницы в виртуальном адресном пространстве процесса могут быть:
- свободными (free) — могут быть выделены новому процессу;
- зарезервированными (reserved) — уже зарезервированы каким-то процессом;
- подтвержденными (committed) — зарезервированные страницы связанные с физической памятью;
- разделяемыми (shareable) — могут использоваться разными процессами совместно.
Зарезервированная память, это виртуальная память выделенная процессу, но никак не связана с физической памятью.
Подтвержденная память, это виртуальная память, которая связана с физической. То есть в подтвержденной память процесс уже может хранить данные, а в зарезервированной не может. Зарезервированную память еще нужно подтвердить (связать её с физической).
Подтвержденные страницы также называются закрытыми, это связано с тем, что другие процессы не могут получить к ним доступ, тогда как с разделяемыми страницами это возможно.
При резервировании памяти система фактически откладывает в сторону диапазон виртуальных адресов для будущего использования с незначительными затратами системных ресурсов и последующим заполнением пространства по мере надобности во время работы приложения.
Если размер выделяемой памяти известен заранее, процесс может зарезервировать и подтвердить память (связать с физической памятью) одновременно. В любом случае полученные подтвержденные страницы доступны для любого потока в процессе.
Подтвержденную память, в которую процесс успел записать данные может быть выгружена на диск, чтобы освободить физическую память (swap).
Другие функции позволяют отменить подтверждение или освободить адресное пространство. При отмене подтверждения память становится зарезервированной, но не подтвержденной, а при освобождении память становится свободной.
Диспетчер задач и память
В «Диспетчере задач» можно посмотреть информацию по физической и виртуальной памяти на вкладке «Производительность»:
Выгружаемый и не выгружаемый пулы представляют собой ресурсы памяти, которые операционная система и драйвера устройств используют для сохранения своих структур данных. Выгружаемый может быть выгружен на диск, в отличие от не выгружаемого.
Process Explorer и память
Process Explorer выводит намного больше информации о физической и виртуальной памяти. Откройте меню View, выберите команду System Information и перейдите на вкладку Memory:
Создание зарезервированной и подтвержденной памяти
Есть программка из пакета sysinternals под названием testlimit. Она консольная, используя её можно различными способами выделять память. Запустим два окна командной строки. В первой выделим зарезервированную память, во второй подтвержденную:
Дальше откроем диспетчер задач, перейдем на вкладку «Подробности» (Details) и добавим столбец «Выделенная память» (Commit Size). Найдем оба процесса:
Как видите при резервировании 800 MB, процесс занимает всего 1320 KB физической памяти. А при подтверждении 800 MB процесс занимает 822112 KB (802 MB) физической памяти.
Нагрузка подтверждения памяти и предел подтверждения
На вкладке «Производительность» (Performance) в Диспетчере задач, на странице «Память» (Memory) имеется надпись «Выделено» (Committed), под которой расположены два числа.
- Первое из двух чисел представляет суммарный объем всей закрепленной виртуальной памяти в системе.
- Второе число это предел подтверждения памяти, это физическая память + файл подкачки.
Общая память и отображенные файлы
В Windows существует механизм совместного использования памяти между процессами. Общую память можно определить как память, которая видна более чем одному процессу. Например, если два процесса используют одну DLL-библиотеку, будет разумно загрузить эту библиотеку в физическую память только один раз, а потом использовать эти страницы во всех процессах.
Каждый процесс поддерживает собственные области памяти для хранения закрытых данных, но код DLL и неизменяемые страницы данных могут находиться в общем доступе без какого-либо вреда.
Посмотреть на файлы отображенные в памяти каким-то процессом можно с помощью Process Explorer. Настройте нижнюю панель для вывода представления DLL. Обратите внимание: перед вами не просто список DLL-библиотек — в нем представлены все файлы, отображенные в память. Часть из них — DLL-библиотеки, один элемент — исполняемый файл (EXE), а дополнительные элементы могут представлять файлы данных, отображенные в память.
Защита памяти
Windows предоставляет средства защиты памяти, чтобы пользовательские процессы не могли повредить адресное пространство другого процесса или операционной системы. В Windows существует четыре основных механизма защиты:
- Все системные структуры данных и пулы памяти, используемые системными компонентами режима ядра, доступны только в режиме ядра. Потоки пользовательского режима не могут обращаться к этим страницам.
- У каждого процесса имеется отдельное закрытое адресное пространство, защищенное от обращений любых потоков, принадлежащих другим процессам. Даже общая память на самом деле для каждого процесса выглядит как его память, просто виртуальные адреса нескольких процессов ссылаются на физические адреса, где фактически находится общая библиотека. Диспетчер памяти следит чтобы процессы не вмешивались в закрытую память других процессов.
- Все процессоры, поддерживаемые Windows, предоставляют некоторую разновидность аппаратной защиты памяти — чтение/запись, только чтение и т. д. Например, кодовые страницы в адресном пространстве процесса помечаются как доступные только для чтения, а следовательно, защищаются от изменений со стороны других потоков.
- Страницы общей памяти защищены правами доступа (ACL), которые проверяются при попытке открытия их процессом. Таким образом доступ к общей памяти может осуществляться только со стороны процессов, обладающих необходимыми правами.
Предотвращение выполнения данных
DEP (Data Execution Prevention) — это набор программных и аппаратных технологий, позволяющих выполнять дополнительные проверки содержимого оперативной памяти и предотвращать запуск вредоносного кода. Функция DEP позволяет отразить целый класс атак. В частности, DEP позволяет блокировать вирусы и другие вредоносные программы, пытающихся выполнить свой код из областей системной памяти, резервированных для Windows и других авторизованных программ. Обнаружив, что программа использует системную память неправильно, средство DEP принудительно закрывает программу и выдает соответствующее сообщение.
Посмотреть какие процессы поддерживают DEP можно в Process Explorer, добавив соответствующую колонку:
- DEP (permanent). Означает, что для процесса включается DEP, потому что он относится к числу «основных программ и служб Windows».
- DEP. Означает, что процесс дал согласие на использование DEP.
- n/a. DEP не используется.
Копирование при записи
Copy On Write память — это общая память, при которой происходит следующее. Если один из объектов начинает писать в память, то такая память делится на две части:
- одна остаётся у всех остальных объектов;
- а другая (измененная) становится памятью только для того процесса, который её изменил.
В итоге мы получаем экономию памяти, а в случае необходимости записи в эту память, мы её копируем.
На рисунке вверху показано как 2 процесса используют общую память и читают одни и те же данные из общей памяти. Ниже показано, что Процесс 1 выполнил запись в Данные 3, при этом Данные 3 копировались и теперь Процесс 1 ссылается на другую копию Данных 3. А для Процесс 2 Данные 3 не изменились.
Address Windowing Extensions
Эту технологию придумали чтобы процессы в 32 разрядной системе могли потреблять намного больше 2 ГБ оперативной памяти.
AWE дает возможность приложению выделять себе один и более блоков оперативной памяти. Процесс этого приложения не может видеть одновременно все выделенные блоки. Но приложение резервирует с помощью блоков намного больше памяти, чем это позволено 32 разрядному процессу. Далее программа вызывает функцию, которая связывает адресное окно с одним из выделенных блоков оперативной памяти. Эта операция выполняется чрезвычайно быстро.
Единовременно доступен лишь один блок памяти. Это, усложняет программирование таких программ, но позволяет использовать больше памяти чем теоретически позволено 32-разрядному процессу.
- Узнали про виртуальную и физическую память.
- Узнали лимиты 32 и 64 разрядных систем Windows при работе с виртуальной и физической памятью.
- Узнали про страницы памяти и про то какими они бывают.
- Познакомились с диспетчером памяти и его основными функциями.
- Узнали в каких состояниях могут находиться страницы виртуальной памяти.
- Посмотрели на использование памяти Диспетчером задач и Process Explorer.
- На практике создали зарезервированную и подтверждённую память.
- В Диспетчере задач посмотрели на объём подтвержденной памяти и предел подтверждения.
- В Process Explorer посмотрели на файлы отображенные в память процессом chrome.exe.
- Познакомились с механизмами защиты памяти. В том числе и с механизмом DEP.
- Узнали про механизм копирования при записи для памяти.
- Познакомились с технологией AWE для 32 разрядной системы.
Оглавление курса доступно по ссылке.