Защита памяти
Память, которая принадлежит процессу, неявно защищена его частным виртуальным адресным пространством. Кроме того, Windows обеспечивает защиту памяти с помощью оборудования виртуальной памяти. Реализация этой защиты зависит от процессора, например, кодовые страницы в адресном пространстве процесса могут быть помечены только для чтения и защищены от изменения потоками пользовательского режима.
Полный список атрибутов см. в константы защиты памяти.
Защита копирования по записи
Защита копирования по записи — это оптимизация, которая позволяет нескольким процессам сопоставлять свои виртуальные адресные пространства, таким образом, чтобы они совместно используют физическую страницу до тех пор, пока один из процессов не изменяет страницу. Это часть метода, называемого отложенной оценки, что позволяет системе сохранять физическую память и время, не выполняя операцию до абсолютной необходимости.
Например, предположим, что две процессы загружают страницы из одной библиотеки DLL в их виртуальные пространства памяти. Эти страницы виртуальной памяти сопоставляются с одинаковыми страницами физической памяти для обоих процессов. Если ни один процесс не записывает на эти страницы, они могут сопоставляться и совместно использовать те же физические страницы, как показано на следующей схеме.
Если процесс 1 записывает на одну из этих страниц, содержимое физической страницы копируется на другую физическую страницу, а карта виртуальной памяти обновляется для process 1. Оба процесса теперь имеют собственный экземпляр страницы в физической памяти. Таким образом, невозможно записать один процесс на общую физическую страницу и для другого процесса, чтобы увидеть изменения.
Загрузка приложений и БИБЛИОТЕК DLL
При загрузке нескольких экземпляров одного приложения на основе Windows каждый экземпляр выполняется в собственном защищенном виртуальном адресном пространстве. Однако их дескриптор экземпляра (hInstance) обычно имеет то же значение. Это значение представляет базовый адрес приложения в своем виртуальном адресном пространстве. Если каждый экземпляр можно загрузить в базовый адрес по умолчанию, он может сопоставляться с теми же физическими страницами с другими экземплярами, используя защиту копирования по записи. Система позволяет этим экземплярам совместно использовать одни и те же физические страницы, пока один из них не изменяет страницу. Если по какой-то причине один из этих экземпляров не может быть загружен в нужный базовый адрес, он получает свои собственные физические страницы.
Библиотеки DLL создаются с базовым адресом по умолчанию. Каждый процесс, использующий библиотеку DLL, будет пытаться загрузить библиотеку DLL в пределах собственного адресного пространства по умолчанию для виртуального адреса библиотеки DLL. Если несколько приложений могут загрузить библиотеку DLL по своему виртуальному адресу по умолчанию, они могут совместно использовать одни и те же физические страницы для библиотеки DLL. Если по какой-то причине процесс не может загрузить библиотеку DLL по адресу по умолчанию, она загружает библиотеку DLL в другом месте. Защита копирования при записи заставляет некоторые страницы библиотеки DLL копироваться на различные физические страницы этого процесса, так как исправления для инструкций по переходу записываются на страницах библиотеки DLL, и они будут отличаться для этого процесса. Если раздел кода содержит много ссылок на раздел данных, это может привести к копированию всего раздела кода на новые физические страницы.