Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

3468

.pdf
Скачиваний:
4
Добавлен:
15.11.2022
Размер:
5.57 Mб
Скачать

Недостатки метода. Этот метод хорошо начинает работу, но плохо продолжает.

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

вается внешней фрагментацией

Динамическое распределение памяти перемещаемыми разделами

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

ОС должна время от времени копировать содержимое разделов из одного места в другое, корректируя таблицы свободных и занятых областей. Этот процесс называется уплотнением или сжатием (рис. 62).

Рис. 62. Пример процедуры сжатия

111

Достоинство: эффективное использование ОП, исключение внутренней и внешней фрагментации.

Недостаток: дополнительные накладные и временные расходы на реализацию в ОС механизма уплотнения.

Методы структуризации виртуальной памяти

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

Рис. 63. Страничная виртуальная память

Запись таблицы (дескриптор страницы) включает следующую информацию:

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

P - признак присутствия (Р=1, если данная страница находится в ОП);

112

D - признак модификации страницы, (D=1, всякий раз, когда производится запись по адресу, относящемуся к данной странице);

А - признак обращения к странице, называемый также битом доступа (А=1 при каждом обращении по адресу, относящемуся к данной странице);

другие управляющие биты, например, для целей защи-

ты.

Схема преобразования адреса в виртуальной памяти представлена на рис. 64.

Рис. 64. Схема преобразования адреса в виртуальной памяти

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

113

Каждый сегмент содержит линейную последовательность адресов от 0 до некоторого максимума.

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

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

Максимальный размер сегмента определяется разрядностью виртуального адреса, например при 32-разрядном микропроцессоре он равен 232 = 4 Гбайт.

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

Этап создания процесса

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

базовый физический адрес начала сегмента в ОП;

размер сегмента;

правила доступа к сегменту;

признаки модификации, присутствия и обращения к данному сегменту,

и др. информация.

Преобразование адреса при сегментной организации памяти представлено на рис. 65.

114

Рис. 65. Преобразование адреса при сегментной организации памяти

3. Сегментно-страничная виртуальная память ис-

пользует двухуровневое деление: виртуальное адресное пространство делится на сегменты, а затем сегменты делятся на страницы. Единицей перемещения данных является страница.

В такой комбинированной системе адресное пространство пользователя разбивается на ряд сегментов по усмотрению программиста (рис. 66).

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

Сточки зрения программиста, логический адрес состоит из номера сегмента и смещения в нем.

Спозиции ОС смещение в сегменте следует рассматривать как номер страницы определенного сегмента и смещение

вней.

115

Рис. 66. Схема преобразования адреса

Для временного хранения сегментов и страниц на диске отводится специальная область либо специальный файл (страничный файл или файл подкачки - paging file).

Организация обмена данными между приложениями методом проецируемых в память файлах

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

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

116

грамм исполняются не в одном процессе, поэтому для нормальной работы используются основные возможности межпроцессного взаимодействия.

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

Как известно, каждый процесс имеет свой участок памя-

ти, называемый виртуальным адресным пространством.

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

ражается в виртуальное адресное пространство процесса,

поэтому данные, хранимые в файле, доступны процессу, который этот файл открыл.

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

DLL.

Для работы с проецируемыми в память файлами существует целый ряд API-функций. Но прежде чем их рассматривать, разберемся в процессе организации обмен данными через проецируемые файлы.

На первом этапе необходимо создать объект (файл, отображаемый в память), затем «отобразить» созданный объект в адресное пространство процесса приложения, получая возможность записи и чтения данных их этого файла. При отображении файла на определенный участок памяти (адресного пространства процесса) манипуляции с данными этого участка памяти отражаются на содержимом файла. После произведенных над объектом манипуляций необходимо закрыть доступ к данным файла (удалить проекцию и закрыть файл).

117

Рассмотрим некоторые функции для работы с проецируемым в память файле.

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

function CreateFileMapping(hFile: THandle; lpFileMappingAttributes; PSecurityAttributes; flProtect, dwMaximumSizeHigh, dwMaximumSize-

Low: DWORD;

lpName: PChar ): THandle;

Параметры функции:

hFile — идентификатор файла, в результате присвоения этому аргументу значения константы INVALID_HANDLE_VALUE мы свяжем создаваемый объект файлового отображения со страничным swap-файлом (системным файлом подкачки);

lpFileMappingAttributes — указатель на структуру типа TSecurityAttributes, структура содержит параметры безопасности создаваемого файла;

flProtect — параметр, задающий способ совместного использования создаваемого объекта в случае доступа на чтение и запись принимает значение PAGE_READWRITE;

dwMaximumSizeHign — старший разряд 64-битного значения размера выделяемого объема памяти.

dwMaximumSizeLow — младший разряд 64-битного значения размера выделяемого объема памяти;

lpName — имя объекта проецируемого файла (может быть nil для создания безымянной проекции файла).

Функция возвращает глобальный дескриптор (THandle). Если проецируемый файл не создан, то функция CreateFileMapping возвращает нулевое значение.

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

118

этого предназначена функция MapViewOf File, имеющая следующий синтаксис:

function MapViewOfFile(hFileMappingObject: THan-

dle;

dwDesiredAccess : DWORD; dwFileOffsetHigh, dwFileOffsetLow, dwNurnberOfBytesToMap: DWORD ): Pointer;

Функция имеет следующие параметры:

hFileMappingObject — описатель созданного объекта файлового отображения;

dwDesiredAccess — параметр доступа к полученным данным, в случае чтения и записи принимает значение

FILE_MAP_WRITE;

dwFileOffsetHigh, dwFileOffsetLow 64-битное смещение от начала файла;

dwNurmberOfBytesToMap — указывает, сколько байт будет отображено. Если этот аргумент имеет значение 0, то на область памяти будет отображен весь файл.

В результате успешного выполнения функции MapViewOfFile будет получен указатель (тип Pointer) на начальный адрес данных объекта. Указатель будет использоваться в дальнейшем для записи или чтения файла.

Следующей функцией, противоположной по производимым действиям функции MapViewOfFile, является UnMapViewOfFile Она отключает проецируемый файл от текущего процесса:

function UnMapViewOfFile(lpBaseAddress: Pointer): Boolean;

Функция принимает указатель, возвращаемый MapViewOfFile, и использует его для отмены проекции файла на адресное пространство процесса. В случае успешной выгрузки функция возвращает True, в противном случае — False.

119

Ипоследняя функция, которую необходимо рассмотреть,

это CloseHandle. Она используется для закрытия дескриптора (многих системных объектов, а не только проекции файла).

function CloseHandle(hFileMapObj: THandle): Boole-

an;

Как видно из синтаксиса функции она принимает описатель объекта файлового отображения, полученный в результате выполнения функции CreateFileMapping и освобождает его. Для правильного завершения работы с объектом файлового отображения сначала следует применить функцию

UnMapViewOfFile, а затем CloseHandle.

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

Описание некоторых классов и методов С #

Класс CMemoryMappedFile предоставляет классоболочку C++(С#) для создания файла отображения на память и использовать его.

CMemoryMappedFile является производным от CMemFile. Он служит оболочкой для файла сопоставления API-интерфейсы для управления сопоставления файлов. Файл отображения памяти не обязательно связан с файлом на диске.

Необходимо прогрузить в проект "kernel32.dll", из которого будет брать функции.

Код объявления выглядит следующим образом

[DllImport("kernel32.dll", SetLastError = true)];

При работе с классом WinApi используем определенные функции и флаги.

120

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]