Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
экзамен СП.docx
Скачиваний:
25
Добавлен:
22.04.2019
Размер:
516 Кб
Скачать
☆

4.4.3 Взаимодействие процессов через общую область данных

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

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

4.4 Функции работы с кучами (heap-область)

Т.н. “куча” (heap) – динамически распределяемая область данных, предоставленная процессу. По умолчанию размер кучи составляет 1 Мбайт, но он может быть изменен параметром /HEAP при построении исполняемого модуля.

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

HANDLE GetProcessHeap(VOID).

Для работы с кучей предназначены следующие основные функции.

LPVOID HeapAlloc(hHeap,dwFlags,dwSize) – выделение блока памяти заданного размера из кучи (возвращает указатель на этот блок в адресном пространстве кучи).

LPVOID HeapReAlloc(hHeap,dwFlags,lpOldBlock,dwSize) – изменение размера выделенного блока памяти (при этом блок может быть перемещен, если в куче нет места для простого расширения).

BOOL HeapFree(hHeap,dwFlags,lpBlock) – освобождение ранее выделенного блока памяти в куче.

Так как приведенные выше функции предусматривают явное указание кучи, одновременно можно использовать более одной кучи, что целесообразно для:

– защиты друг от друга различных структур данных.

– повышения эффективности управления памятью.

– уменьшения рабочего множества процесса.

Кратко поясним последние два положения.

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

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

Для создания дополнительной кучи используется функция:

HANDLE HeapCreate(DWORD dwFlags,DWORD dwInitSize,DWORD dwMaxSize)

Более подробная информация об этих и других функциях для работы с кучами содержится в соответствующей документации.