
- •Раздел 4. Управление памятью в операционных системах
- •4.1. Классификация способов организации памяти
- •4.2. Управление физической памятью
- •4.2.1. Однозадачные системы
- •4.2.1.1. Простые и оверлейные системы
- •4.2.1.2. Сегментация памяти
- •4.2.1.3. Блочная организация памяти
- •4.2.1.4. Стратегии управления памятью (введение)
- •4.2.2. Многозадачные системы
- •4.2.2.1. Фиксированные разделы (неперемещаемые программы)
- •4.2.2.2. Фиксированные разделы (перемещаемые программы)
- •4.2.2.3. Переменные разделы
- •4.2.2.4. Свопинг
- •4.3.1. Общая характеристика виртуальной памяти
- •4.3.1.1. Определения виртуальной памяти и иерархия видов памяти
- •4.3.1.2. Особенности виртуальной памяти
- •4.3.1.3. Механизм отображения виртуальных адресов в физические
- •4.3.2. Страничная организация виртуальной памяти
- •4.3.2.1. Одноуровневая страничная организация
- •4.3.2.2. Двухуровневая страничная организация
- •4.3.2.3. Совместное использование страниц процессами
- •4.3.3. Сегментная организация виртуальной памяти
- •4.3.3.1. Одноуровневая сегментная организация
- •4.3.3.2. Комбинированная сегментно-страничная организация (вместе с таблицей процессов)
- •4.3.4. Стратегии управления виртуальной памятью
- •4.3.4.1. Главные задачи управления виртуальной памятью
- •4.3.4.2. Стратегии решения второй главной задачи
- •4. Выталкивание дольше всех не использовавшейся страницы
- •4.3.4.4. Стратегии выталкивания с переменным распределением
- •4.4. Управление памятью в современных ос
- •4.4.1. Архитектура управления памятью
- •4.4.2. Защита памяти
- •4.4.4. Совместное использование памяти
- •4.4.4.1. Способы совместного использования памяти
- •4.4.4.2. Пример реализации разделяемой памяти в Win32
- •Закрытие объекта:
Закрытие объекта:
CloseHandle(hMapFile);
)Вопрос
Посмотрим, как то же самое делается в Линукс:
Создайте ключ для идентификации общего сегмента. Для этого вызовите функцию ftok. Например, для создания ключа mykey с идентификатором проекта R, хранящимся в переменной proj (тип char) и именем файла null_file, воспользуйтесь следующим оператором:
mykey = ftok(null_file,proj);
Выполните одно из следующих действий:
Создайте общий сегмент памяти с помощью функции shmget. Например, для создания сегмента размером 4096 и присвоения значения shmid целочисленной переменной mem_id, используйте следующее выражение:
mem_id = shmget(mykey,4096,IPC_CREAT|o666);
Получите указатель на ранее созданный общий сегмент с помощью функции shmget. Например, для того чтобы получить ссылку на сегмент, ранее связанный с ключом mykey и присвоить значение shmid целочисленной переменной mem_id, укажите в программе оператор:
mem_id = shmget(mykey,4096,IPC_ACCESS);
Предоставьте общий сегмент процессу с помощью функции shmat. Например, для подключения созданного сегмента можно воспользоваться оператором
ptr = shmat(mem_id);
В этом примере переменная ptr представляет собой указатель на структуру, определяющую поля общего сегмента. Такая структура-шаблон применяется для чтения и записи данных в общий сегмент. Шаблон должен совпадать для всех процессов, работающих с общим сегментом.
Выполните необходимые операции с данными сегмента, пользуясь шаблонной структурой.
Отключите общий сегмент от процесса с помощью функции shmdt:
shmdt(ptr);
Если общий сегмент больше не нужен, удалите его с помощью функции shmctl:
shmctl(mem_id,IPC_RMID,ptr);