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

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)

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

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