Обращение к блоку памяти




Да Нет

Данные в ОП?

Да Да Есть в ОП свободная страница? Нет Данные в страничном файле? Нет Поиск страницы в ОП, которую можно освободить Была запись на страницу? Загрузить данные из страничного файла в ОП Нет Нарушение доступа Да Переписать страницу в страничный файл
Процессор увязывает виртуальный адрес с физическим

Данные доступны

Рис.3.16. Блок схема доступа к данным

региона адресного пространства, называется файлом, проецируемым в память. При загрузке на выполнение система автоматически резервирует нужный регион адресного пространства и увязывает с ним представление файла.

Когда EXE- или DLL-файл загружается с дискеты, для всего файла выделяется память из системного страничного файла, затем система копирует файл с дискеты в оперативную память и страничный файл, который служит копией оперативной памяти.

Отдельным страницам физической памяти, выделяемым функцией VirtualAlloc, можно присвоить атрибуты защиты. Атрибуты различны в ОС Windows 95 и Windows NT и для разных платформ.

Наиболее “интересным” является атрибут защиты типа “копирование при записи”. Win32 поддерживает механизм, позволяющий двум и более процессам получать одновременный доступ к единственному блоку данных. Проблем не возникает, если процессы только считывают информацию из блока. Если же процессы пишут в один блок, то необходимо каждому из них иметь свою копию данных.

Для решения данной задачи система присваивает общему блоку данных атрибут защиты “копирование при записи”. Когда поток в одном из процессов пытается выполнить запись в общий блок данных (а процессы не знают, что ОС “сэкономила” память и они используют общий блок!), происходит прерывание и ОС выполняет следующие операции: выделение из страничного файла страницы физической памяти для копирования блока; поиск свободной страницы ОП; копирование страницы с данными, для которых была выполнена попытка модификации, на выделенную страницу; сопоставление соответствующей станицы в виртуальной памяти с новой страницей в оперативной памяти. После этого процесс получает собственную копию общего блока данных и может продолжить работу с ним.

Кроме того, страницы могут быть защищены от кэширования, если они используются несколькими процессами параллельно (например, буферы в памяти).

ОС Win32 предоставляют в распоряжение пользователя функции, позволяющие отслеживать состояние памяти, состояние адресного пространства и т.п.

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

Атрибуты защиты, присвоенные страницам переданной физической памяти можно изменять.

Система тонко настроена и оптимизирована на процесс подкачки страниц. Но в Win32 предусмотрены функции, позволяющие повлиять на этот процесс. Функция VirtualLock сообщает системе, что нужно “запереть” в ОП группу страниц. При этом страницы блокируются в оперативной памяти только на период выполнения потока в данном процессе. При вытеснении с процессора всех потоков этого процесса система может перекачать указанные страницы (в случае крайней необходимости) в физическую память, а когда процессорное время вновь предоставляется потоку данного процесса, страницы сразу загружаются в ОП. Исполнение потока начнется только после подкачки всех заблокированных страниц.

Система сама резервирует регионы не только под размещение блоков переменных окружения, но и для размещения стека потока.

В Windows NT, когда процесс создает поток, система резервирует регион адресного пространства для стека потока (у каждого потока есть свой стек) и передает этому региону некоторый объем физической памяти. По умолчанию система резервирует 1 Мб адресного пространства и передает ему 2 страницы физической памяти. Значения, устанавливаемые по умолчанию, можно изменить с помощью соответствующего параметра компоновщика.

Зарезервировав регион система передает физическую память двум верхним страницам региона. Перед исполнением система настраивает указатель стека на конец верхней страницы. Следующая страницы “как бы недоступна” - она считается защитной (guard page). По мере роста дерева вызовов потоку требуется все больший объем стека. Как только он обращается к следующей странице (защитной), система уведомляется об этой попытке. В ответ на нее ОС передает стеку еще одну страницу, располагая ее прямо перед защищенной. После этого флаг PAGE_GUARD снимается с текущей защитной страницы и переносится на страницу с только что выделенной памятью. Благодаря такому механизму объем памяти, выделенной стеку, увеличивается только при необходимости. Когда выделение физической памяти доходит до нижней страницы (она всегда остается зарезервированной и ей никогда не выделяется физическая память), ОС вызывает исключение EXCEPTION_STACK_OVERFLOW. Если поток продолжает попытки записывать в стек после того как произошло исключение, связанное с переполнением стека, и поток попытается обратиться к последней странице, не располагающей памятью, произойдет исключение по нарушению доступа. В этом случае система завершит процесс.

В Windows 95 истинный размер региона, выделенного под стек, всегда составляет 1 Мб + 128 Кб. Собственно стек располагается в середине этого региона, а по обеим его границам размещаются блоки по 64 Кб. Эти блоки используются для перехвата попыток выхода за границы стека. Защитные страницы помечаются здесь атрибутом защиты PAGE_NOACCESS.

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

¨ загрузки и исполнения EXE- и DLL-файлов;

¨ доступа к файлу данных, размещенному на диске (при этом можно обойтись без операций файлового ввода/вывода и буферизации его содержимого);

¨ обеспечения “взаимодоступности” данных, принадлежащих нескольким процессам”, выполняющимся на одном компьютере.

При подготовке к использованию файла, проецируемого на память, процесс должен выполнить три операции: создать или открыть объект ядра “файл”, идентифицирующий дисковый файл (функция CreateFile); создать объект ядра “проецируемый файл” (функция CreateFileMapping), связав его с предыдущим объектом; указать системе, спроецировать ли в адресное пространство процесса последний объект целиком или только его часть.

Создание файла, проецируемого на память, аналогично резервированию региона адресного пространства с последующей передачей ему физической памяти, но физическая память для него - сам файл. Функция MapViewOfFile резервирует регион адресного пространства под данные файла и передает их как физическую память, спроецированную на этот регион.

Система позволяет проецировать сразу несколько оконных представлений одних и тех же файловых данных. При этом система гарантирует их когерентность.

Освобождается регион вызовом функции UnmapViewOfFile.

Закрываются все объекты с помощью функции CloseHandle.

Через механизм проецирования можно осуществить совместный доступ процессов к общим данным.

Кучи (heaps) представляют собой динамически распределяемые области памяти.

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

Здесь возникают проблемы с переносом приложений 16-битной Windows, так как они использовали глобальные кучи для совместного доступа к данным, DLL-модули могли обмениваться информацией с процессами через специальную локальную кучу, выделяемую DLL-модулям.

Куча - это регион зарезервированного адресного пространства. Первоначально большей его части физическая память не передается. По мере того, как программа занимает эту область под данные, специальный диспетчер, управляющий кучами (heap manager), передает ей страницы физической памяти. При освобождении страниц в куче диспетчер возвращает физическую память системе.

При инициализации Win32-процесса система создает кучу в его адресном пространстве. Она называется кучей, предоставляемой процессу по умолчанию (process’s default heap). Ее размер - 1 Мб. Размер можно увеличить при создании приложения, указав соответствующий параметр компоновщику. DLL-модулям куча по умолчанию не предоставляется.

Кучей, предоставляемой процессу по умолчанию, пользуются многие Win32-функции, использующие временные блоки памяти. Если к этим функциям обращаются несколько потоков одновременно, то доступ их к куче упорядочивается: система гарантирует, что только один поток в каждый момент времени сможет выделить или освободить блок в этой куче.

Описатель данной кучи предоставляется процессу функцией GetProcessHeap.

Куча, предоставляемая процессу по умолчанию, автоматически уничтожается после его завершения.

У процесса может быть несколько куч, они создаются и разрушаются во время его выполнения для защиты компонентов (разделяются структуры данных, создаваемые разными компонентами программы, таким образом они защищаются от ошибок друг друга), более эффективного управления памятью (данные с различной структурой можно размещать в разных кучах - управлять кучами с элементами фиксированного размера проще), локализации доступа (совместно обрабатываемые данные хранить поближе друг к другу).

Куча создается функцией HeapCreate. Для выделения блока памяти в куче служит функция HeapAlloc. Размер блока можно изменить с помощью функции HeapReAlloc. Для освобождения блока используется функция HeapFree. Уничтожить кучу можно с помощью функции HeapDestroy.

Для использования преимуществ Win32-куч следует включить их поддержку в свои программы. Для этого нужно заместить операторы создания объектов и их уничтожения на свои функции.

3.12. Организация памяти в OS/2

Доступ ко всей памяти осуществляется с помощью 32-разрядных адресов. Следовательно OS/2 позволяет работать с 4 Гб адресного пространства.

OS/2 использует плоскую (несегментированную) модель памяти. Она изначально разрабатывалась как система с виртуальной памятью.

С точки зрения программного обеспечения память представляет собой непрерывную область размером 4 Гб. На самом деле процессор выполняет преобразования адресов, которыми пользуется программа, в физические адреса с помощью таблиц.

OS/2 делит всю виртуальную память на страницы, представляющие собой блоки размером в 4 Кб.

Вся четырехгигабайтная виртуальная память разбивается на две части: область операционной системы и область, распределяемая для процессов. Системная область памяти занимает адреса от 512 Мб до 4 Гб, она используется только само ОС. Прикладные программы выполняются в области памяти с нулевого адреса по 512 Мб.

ОС оптимизирует размещение областей виртуальной памяти в физической памяти. Сначала по запросам программ выделяется пространство в оперативной памяти. Когда требования приложений превосходят объем имеющейся в наличии оперативной памяти, ОС сбрасывает часть данных на диск. Для вытеснения блоков памяти используется алгоритм LRU.

Во время старта OS/2 почти целиком загружается в память. При этом загружаются даже редко используемые компоненты. Это сделано для повышения общей производительности системы: при запуске программ после “разогрева“ системы неиспользуемые компоненты выталкиваются на диск, в файл подкачки, а при последующем доступе они будут извлекаться не из исходного файла, а из файла подкачки, что быстрее по времени. Поэтому максимальная скорость работы достигается системой через определенное время после загрузки, когда все ненужные компоненты ОС будут сброшены на диск.

Если на диск вытесняются части активных в данный момент программ, то может возникнуть “пробуксовка” (перегрузка системы управления виртуальной памятью - thrashing).

В первых версиях подкачка выполнялась блоками по 64 Кб. В настоящее время используется замещение страниц по 4 Кб. Но по традиции файл замещения страниц (paging file) называется SWAPPER.DAT.

Схема замещения страниц работает с отложенными объектами памяти: по запросу программы для нее резервируется страница памяти в виртуальном адресном пространстве, но реально память под эту страницу выделяется в оперативной памяти или в файле подкачки только тогда, когда она действительно потребуется.


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

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






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