- •Раздел 5. Управление памятью в операционных системах
- •5.1. Классификация способов организации памяти
- •5.2. Управление физической памятью
- •5.2.1. Однозадачные системы
- •5.2.2. Многозадачные системы
- •5.3. Управление виртуальной памятью
- •5.3.1. Общая характеристика виртуальной памяти
- •5.3.2. Страничная организация виртуальной памяти
- •5.3.3. Сегментная организация виртуальной памяти
- •5.3.4. Стратегии управления виртуальной памятью
- •1. Выталкивание случайной страницы
- •2. Выталкивание первой пришедшей страницы
- •3. Выталкивание реже всего используемой страницы
- •4. Выталкивание дольше всех не использовавшейся страницы
- •5.4. Совместное использование памяти
- •Закрытие объекта:
- •Раздел 5
5.4. Совместное использование памяти
Разделяемая память имеет очень большое значение для многозадачных ОС, т.к. задачи должны иметь возможность обмениваться информацией друг с другом.
Unix-подобные системы (см. лаб. № 6)
shmget - создает сегмент разделяемой памяти
shmat - подключает сегмент разделяемой памяти к вызывающему процессу.
shmdt - отключает процесс от разделяемой области памяти.
shmctl – удаляет сегмент разделяемой памяти.
Unix-подобные системы, стандарт POSIX (см. лаб. № 6)
shm_open - открыть
ftruncate – определить размер
mmap - отобразить
munmap – закрыть отображение
close - закрыть
shm_unlink - удалить
Windows
Разделяемая память реализуется с помощью отображенных в памяти файлов, именованных или неименованных.
CreateFileMapping - создание объекта отображения файла.
OpenFileMapping - открытие и получение доступа к созданному объекту отображения файла.
UnmapViewOfFile - отменяет отображение файла.
Пример реализации разделяемой памяти в Win API
Разделяемой называется память, видимая более, чем одному процессу, или присутствующая в виртуальном адресном пространстве более чем одного процесса.
Для реализации разделяемой памяти используются примитивы Win API и объект "раздел", который иначе называется файлом, отображаемым в память, (file mapping object).
Объект "раздел" может быть связан с файлом на диске, а может, и нет.
Поскольку "раздел" – это объект, то его структура полностью соответствует понятию объекта:
Тип объекта |
Раздел |
Атрибуты объекта |
Максимальный размер Атрибуты защиты Файл – страничный/проецируемый |
Сервисы |
Создать Открыть Спроецировать/отменить проецирование |
Структурная схема разделяемой памяти на основе "файла, отображаемого в память"
Работа с файлом, отображаемым в память, включает 6 этапов:
Создание объекта "раздел" вызовом:
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" – именование позволяет осуществить доступ к объекту из другого процесса.
Открытие объекта «раздел» другим процессом:
hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, // Read/write permission.
FALSE, // Do not inherit the name
"MyFileMappingObject"); // of the mapping object.
Отображение объекта каждым процессом на свою область виртуальной памяти.
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.
Запись данных в указанную память одним процессом, например,
*lpMapAddress = 57;
и чтение данных из указанной памяти другим процессом
INT i = *lpMapAddress;// i будет равно 57
Закрытие отображений:
UnmapViewOfFile(lpMapAddress);