Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
os5.doc
Скачиваний:
0
Добавлен:
20.06.2023
Размер:
186.37 Кб
Скачать

5.4. Совместное использование памяти

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

Unix-подобные системы (см. лаб. № 6)

  1. shmget - создает сегмент разделяемой памяти

  2. shmat - подключает сегмент разделяемой памяти к вызывающему процессу.

  3. shmdt - отключает процесс от разделяемой области памяти.

  4. shmctl – удаляет сегмент разделяемой памяти.

Unix-подобные системы, стандарт POSIX (см. лаб. № 6)

  1. shm_open - открыть

  2. ftruncate – определить размер

  3. mmap - отобразить

  4. munmap – закрыть отображение

  5. close - закрыть

  6. shm_unlink - удалить

Windows

Разделяемая память реализуется с помощью отображенных в памяти файлов, именованных или неименованных.

  1. CreateFileMapping - создание объекта отображения файла.

  2. OpenFileMapping - открытие и получение доступа к созданному объекту отображения файла.

  3. UnmapViewOfFile - отменяет отображение файла.

Пример реализации разделяемой памяти в Win API

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

Для реализации разделяемой памяти используются примитивы Win API и объект "раздел", который иначе называется файлом, отображаемым в память, (file mapping object).

Объект "раздел" может быть связан с файлом на диске, а может, и нет.

Поскольку "раздел" – это объект, то его структура полностью соответствует понятию объекта:

Тип объекта

Раздел

Атрибуты объекта

Максимальный размер

Атрибуты защиты

Файл – страничный/проецируемый

Сервисы

Создать

Открыть

Спроецировать/отменить проецирование

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

Работа с файлом, отображаемым в память, включает 6 этапов:

  1. Создание объекта "раздел" вызовом:

hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, // Current file handle.

NULL, // Default security.

PAGE_READWRITE, // Read/write permission.

0, // Max. object size.

100, // Size of hFile.

"MyFileMappingObject"); // Name of mapping object.

INVALID_HANDLE_VALUE – означает, что используется не обычный дисковый файл, а страничный файл.

"MyFileMappingObject" – именование позволяет осуществить доступ к объекту из другого процесса.

  1. Открытие объекта «раздел» другим процессом:

hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, // Read/write permission.

FALSE, // Do not inherit the name

"MyFileMappingObject"); // of the mapping object.

  1. Отображение объекта каждым процессом на свою область виртуальной памяти.

lpMapAddress = (LPINT)MapViewOfFile(hMapFile, // Handle to mapping object.

FILE_MAP_ALL_ACCESS,// Read/write permission

0, // Max. object size.

0, // Size of hFile.

0); // Map entire file.

  1. Запись данных в указанную память одним процессом, например,

*lpMapAddress = 57;

и чтение данных из указанной памяти другим процессом

INT i = *lpMapAddress;// i будет равно 57

  1. Закрытие отображений:

UnmapViewOfFile(lpMapAddress);

Соседние файлы в предмете Операционные системы