Архитектура памяти в Win32



В Win32 существуют следующие основные механизмы управления памятью: виртуальная память, файлы, проецируемые на память, и кучи.

В 16-битной Windows процессы используют общее адресное пространство, поэтому любой процесс, включая ОС, оказывается зависимым от поведения других процессов в системе, так как процессы могут считывать и переписывать участки памяти, принадлежащие другим процессам.

В среде Win32 эта проблема решается за счет того, что каждому процессу отводится его “личное”, закрытое от других (private) адресное пространство. Когда в процессе выполняется какой-либо поток, он получает доступ только к “своей” памяти, память, отведенная другим процессам, этому потоку недоступна.

В Win32 адресное пространство процесса составляет 4 Гб. Но это пространство виртуальное, а не физическое. Адресное пространство - всего лишь диапазон адресов памяти. Прежде, чем можно будет обратиться к какому-либо блоку памяти, необходимо увязать нужную часть адресного пространства с конкретным участком физической памяти.

Все адресное пространство, выделяемое процессам, разбивается на разделы. Выделение разделов (partitions) в четырехгигабайтном адресном пространство процесса в разных реализациях Win32 происходит по-разному.

Под управлением Windows 95 адресное пространство разбивается на четыре раздела:

¨ Регион размером в 4 Мб в младших адресах адресного пространства (от 00000000h до 003FFFFFh) необходим для совместимости с MS-DOS и 16-битной Windows. К нему не следует обращаться, но заблокировать Microsoft смогла только самые младшие 4 Кб, обращение к которым вызывает нарушение доступа (это удобно для обнаружения пустых ссылок).

¨ Раздел, расположенный в диапазоне адресов 00400000h - 7FFFFFFFh, представляет собой закрытое (private) адресное пространство процесса (его размер равен 2 Гб - 4 Мб). Обычно ни один процесс не может получить доступ к данным другого процесса, расположенным в данном разделе (хотя для этого и предусмотрены специальные функции, но они используются обычно только отладчиками). Основной объем данных процесса хранится именно здесь.

¨ Регион, занимающий пространство в диапазоне адресов от 80000000h до 0BFFFFFFFh, используется для размещения данных, доступных всем процессам. Его размер - 1 Гб. Сюда, например, загружаются системные динамически подключаемые библиотеки (KERNEL32.DLL, USER32.DLL, GDI32.DLL, ADVAPI32.DLL), эти DLL-модули одновременно доступны всем выполняемым Win32-процессам, для каждого процесса они загружаются по одному и тому же адресу. Кроме того, этот раздел используется системой для взаимной увязки всех файлов, проецируемых на память.

¨ В разделе размером 1 Гб в диапазоне адресов 0C0000000h - 0FFFFFFFFh находится код ОС (в том числе: системные драйверы виртуальных устройств ()VxDs, низкоуровневый код управления памятью и файловой системой). Расположенный здесь код доступен всем Win32-процессам, поэтому данные в этом разделе не защищены, что грозит крахом системы.

В Windows NT разделы в адресном пространстве выделяются иначе:

¨ Область размером 64 Кб в младших адресах (00000000h - 00000FFFFh) резервируется для обнаружения пустых указателей. Этот раздел всегда свободен.

¨ В разделе с диапазоном адресов 00010000h - 7FFEFFFFh (его размер равен 2 Гб - 64 Кб - 64 Кб) располагается закрытое адресное пространство процесса. Код DLL-модулей, подключаемых процессом, помещается в этот раздел. Кроме того, здесь же система осуществляет взаимную увязку всех файлов, проецируемых на память, доступных данному процессу.

¨ Регион, занимающий адреса 7FFF0000h - 7FFFFFFFh, имеющий размер 64 Кб, недоступен.

¨ В раздел с адресами 80000000h - 0FFFFFFFFh загружаются Windows NT Executive, Kernel и драйверы устройств. Эти компоненты ОС полностью защищены. При попытке обратиться по этим адресам возникает нарушение доступа, которое ведет к завершению приложения.

Адресное пространство, выделяемое процессу в момент его создания практически свободно. Чтобы использовать его необходимо выделить внутри него определенный регион, т.е. зарезервировать его. Операция резервирования региона выполняется с помощью Win32-функции VirtualAlloc.

При резервировании ОС обязательно выравнивает начало региона по четному адресу, учитывая гранулярность выделения ресурса. При этом обеспечивается четная кратность размера региона размеру страницы (page). Гранулярность и размер страницы зависят от типа процессора (для MIPS, Intel x86, Alpha и PowerPC гранулярность составляет 64 Кб, а размер страницы для MIPS, Intel x86 и PowerPC составляет 4 Кб, а для DEC Alpha - 8 Кб). Система всегда производит округление. Понятие гранулярности введено для упрощения контроля над служебной информацией, она позволяет снижать степень фрагментации.

Регион возвращается системе (в ее общие ресурсы) при выполнении операции высвобождения с помощью функции VirtuaFree.

ОС сама также резервирует регионы “в интересах” процесса: например, для хранения блока переменных окружения процесса. Кроме того, регионы резервируются при порождении потоков, для хранения их блоков переменных окружения. Причем сама система не соблюдает установленных правил выравнивания и учета гранулярности.

Для практического использования региона адресного пространства необходимо выделить соответствующую область физической памяти и увязать ее с этим регионом. Физическая память всегда выделяется в страницах, а для ее передачи зарезервированному региону необходимо снова вызвать VirtualAlloc. Причем нет необходимости отводить физическую память сразу всему региону, можно передать ее только некоторым страницам.

Если программе больше не нужен доступ к физической памяти, переданной зарезервированному региону, ее нужно освободить, выполнив возврат физической памяти с помощью вызова VirtualFree.

В Win32 вся оперативная память обслуживается исключительно системой и ни одно приложение не может получить прямого доступа к этой памяти. Здесь физическую память следует рассматривать как данные, хранимые в дисковых файлах со страничной структурой виртуальной памяти - страничных файлах (paging files). Поэтому при передаче физической памяти какому-либо региону в адресном пространстве она на самом деле выделяется не в оперативной памяти, а из файла, размещенного на жестком диске. Таким образом, размер системного страничного файла - главный ограничитель, определяющий количество физической памяти, доступной приложению. Реальный объем оперативной памяти здесь не так важен.

При попытке получения доступа к данным возможны два варианта развития ситуации (рис.3.16). Если подкачка станиц выполняется слишком часто, то все свое время система будет затрачивать на обмен вместо выполнения программы. Такая ситуация называется “пробуксовкой” или перегрузкой. Эти задержки зависят от реального объема оперативной памяти (ОП).

Windows NT всегда требует наличия страничного файла. Кроме того, она может работать с несколькими страничными файлами, расположенными на разных физических дисках, что ускоряет работу.

Но ОС не резервирует при каждом запуске приложения регионы адресного пространства для кода и данных с передачей им физической памяти, т.е. с копированием кода и данных из файла программы, расположенного на диске, в страничный файл. Для этого потребовалось бы слишком много времени и дискового пространства.

При запуске приложения система открывает его исполняемый файл и определяет объем кода и данных приложения. Затем она резервирует соответствующий регион адресного пространства и помечает, что физическая память, связанная с этим регионом, - сам EXE-файл! Вместо выделения пространства страничного файла система пользуется истинным содержимым или представлением (image) EXE-файла как зарезервированным регионом адресного пространства процесса. Это ускоряет загрузку и сокращает размер страничного файла.

Представление программного файла (т.е. EXE- или DLL-файла), размещенное на жестком диске и применяемое как физическая память для того или иного


Дата добавления: 2016-01-05; просмотров: 15; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!